《Windows驱动开发技术详解》第16章 16.6例子中,
BOOLEAN OnInterrupt(PKINTERRUPT InterruptObject, PDEVICE_EXTENSION pdx)
{ // OnInterrupt
//关中断
UCHAR HSR = READ_PORT_UCHAR(pdx->portbase);
HSR = HSR | 0x4;
WRITE_PORT_UCHAR(pdx->portbase,HSR);
KdPrint(("==============interrupt!!!\n"));
//恢复中断信号电平
WRITE_REGISTER_UCHAR((PUCHAR)pdx->MemBar1+0x400000,0x10);
IoRequestDpc(pdx->fdo, NULL, pdx);
return TRUE;
}
在中断处理函数中调用了IoRequestDpc(pdx->fdo, NULL, pdx);
造成系统死掉。但是注释掉这句就没有问题,给初学者造成了一定的困扰。
具体的原因是例子中没有初始化DPC和定义DPC例程。具体过程可以参考《中断处理》
在调用IoConnectInterrupt函数之前调用KeInitializeDpc(&pExtension->fdo->Dpc, DPCForISR, NULL);
初始化DPC,并且定义DPC例程就可以解决问题。
VOID DPCForISR(IN PKDPC Dpc, IN PVOID Context, IN PVOID fdo, IN PVOID pIrp)
{
KdPrint(("DPCForISR"));
}