阅读:2121回复:2
KEvent 导致的驱动不能正常卸载和系统不能关机的问题
前两天在的9052驱动中写中断检测的代码
参考 Driverworks 的帮助文档 How to Signaling an Application from a Kernel Mode Driver 中的Method 2 class MyDevice : public KDevice { public: MyDevice(); VOID EventHandler(void); KEvent * m_pEventToSignal; }; // Handler for Device Control requests NTSTATUS MyDevice::DeviceControl(KIrp I) { switch (I.IoctlCode()) { case MYDEVICE_IOCTL_SETUP_SIGNAL: // app passes event handle in input buffer HANDLE hEvent = *(HANDLE*)I.IoctlBuffer(); m_pEventToSignal = new(NonPagedPool) KEvent(hEvent); NTSTATUS status = (m_pEventToSignal != NULL) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES; return I.Complete(status); break; . . . } } // Routine signals the event to the application. // Not callable at IRQL > DISPATCH_LEVEL. VOID MyDevice::EventHandler(void) { m_pEventToSignal->Set(); // or Pulse } 在中断的DPC函数中调用事件的Set方法 和 Invalidate 方法 ,上位机的应用程序是可以检测到事件被置为有信号了。但是此时通过设备管理器卸载驱动时,整个设备管理器窗口变成忙状态 同时设备阻止系统进入待机状态 关机时系统会停止在“正在关机”的画面 如果不用这个 KEvent,在驱动中能检测到中断 ,通过Drivermonitor可以看到输出的调试信息 请问各位大侠 这是怎么回事呢 |
|
沙发#
发布于:2009-09-05 09:43
怎么就没有人帮我看看啊
|
|
板凳#
发布于:2009-12-14 19:07
我遇到了同样问题,解决了么?解决了也帮我一下啊
|
|