您的位置:首页 > 其它

关于《Windows驱动开发技术详解》第16章 16.6例子中一个问题

2016-05-26 12:19 309 查看
《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"));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 驱动开发