通过NdisMRegisterInterruptEx注册中断处理函数,内部从处理代码如下
...
INITIALIZE_DPC( &Interrupt->InterruptDpc, // 初始化一个dpc
MINIPORT_TEST_FLAG(Miniport, fMINIPORT_DESERIALIZE) ? ndisMDpcX : ndisMDpc, // DPC Routine, nids*系统提供的框架
Interrupt);
Interrupt->MiniportIsr = Miniport->DriverHandle->MiniportCharacteristics.ISRHandler; // 真正的驱动中断处理isr
Interrupt->MiniportDpc = Miniport->HandleInterruptHandler; // 真正的驱动中断处理dpc
...
Status = ndisTranslateResources(Miniport,
CmResourceTypeInterrupt, // CmResourceTypeInterrupt,从resource中取出指定类型
NonTranslatedInterrupt,
&TranslatedIrql,
&pResourceDescriptor); // 系统会给硬件生成resource,在驱动安装时,提供给驱动
// 包含port,dma,interrupt,memory等
// https://blog.csdn.net/xiangbaohui/article/details/105134068
Vector = pResourceDescriptor->u.Interrupt.Vector; // 中断资源里,包含中断vector
...
IoConnectInterrupt(&Interrupt->InterruptObject, // 此函数完成 中断号 和 中断处理函数 的对应
(PKSERVICE_ROUTINE)ndisMIsr, // 中断处理函数, nids*系统提供的框架
Interrupt, // 做为ndisMIsr的参数 context
NULL,
Vector, // 中断号
Irql,
Irql,
(KINTERRUPT_MODE)InterruptMode,
SharedInterrupt,
InterruptAffinity,
FALSE);
ndisMIsr( // 框架
IN PKINTERRUPT KInterrupt,
IN PVOID Context
)
{
PNDIS_MINIPORT_INTERRUPT Interrupt = (PNDIS_MINIPORT_INTERRUPT)Context; // IoConnectInterrupt的第三个参数
...
Interrupt->MiniportIsr(&InterruptRecognized, // 这里调用了, 真正的驱动中断处理isr
&QueueDpc,
Interrupt->Reserved);
...
if (QUEUE_DPC(&Interrupt->InterruptDpc)) // 此处把前面初始化的DPC_Routine插入dpc队列
}
DPC_Routine() // 框架
{
W_HANDLE_INTERRUPT_HANDLER MiniportDpc = Interrupt->MiniportDpc; // 真正的驱动中断处理dpc
(*MiniportDpc)(Interrupt->Reserved); // 调用 真正的中断处理dpc
...
}
中断处理函数为ndisMIsr
ndisMIsr
---> MiniportIsr
+ ndisMDpc
,ndisMDpc
---> MiniportDpc
参考:
https://blog.csdn.net/u011471873/article/details/51535086
https://blog.csdn.net/xiangbaohui/article/details/105134068
原文:https://www.cnblogs.com/asmalleyu/p/13933673.html