阅读:2159回复:2
PCI驱动IRQ里使用KeSetEvent死锁疑问
开发一个PCI卡驱动程序,使用DriverStudio+DDK+VS2005@Windows XP
应用程序部分代码 m_Evt_Interrupt = CreateEvent(NULL, FALSE, FALSE, NULL); bStatus = DeviceIoControl( hDevice, // Handle to device IOCTL_REGISTER_EVENT, // IO Control code &m_Evt_Interrupt , // Input Buffer to driver. SIZEOF_REGISTER_EVENT, // Length of input buffer in bytes. NULL, // Output Buffer from driver. 0, // Length of output buffer in bytes. &ulReturnedLength, // Bytes placed in buffer. NULL // synchronous call ); AfxBeginThread((AFX_THREADPROC)Interrupt_thread,&m_Evt_Interrupt,0,0,0,0); Interrupt_thread(LPVOID hEvent) { HANDLE h = *(HANDLE*)hEvent; if (h == NULL)return 0; while(1) { WaitForSingleObject(h,INFINITE); AfxMessageBox("IRQ!",0,0); } } 驱动中的部分代码 ObReferenceObjectByHandle (hEvent, SYNCHRONIZE, *ExEventObjectType, UserMode, &gpEventObject, NULL); IsrDpc(PVOID Arg1, PVOID Arg2) { if (gpEventObject ) KeSetEvent((PRKEVENT)gpEventObject,0, FALSE); } 问题是这样的:有的时候系统就是死锁,完全不响应,比如系统刚刚启动时执行应用程序,必然会死锁 如果用VS调试程序就不会(也不是绝对) 后来吧,我就发现把AfxMessageBox("IRQ!",0,0);换OutputDebugString("IRQ\n");就绝对不会出问题 这是为什么呢? |
|
沙发#
发布于:2009-06-20 22:14
试试把KeSetEvent从DPC中间拿出来,直接放到ISR里做。
|
|
板凳#
发布于:2009-09-29 10:25
顶,我也正遇到
|
|