wujbclzw
驱动牛犊
驱动牛犊
  • 注册日期2008-03-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望128点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:2121回复:2

KEvent 导致的驱动不能正常卸载和系统不能关机的问题

楼主#
更多 发布于:2009-09-03 20:53
前两天在的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可以看到输出的调试信息

请问各位大侠 这是怎么回事呢
wujbclzw
驱动牛犊
驱动牛犊
  • 注册日期2008-03-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望128点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-09-05 09:43
怎么就没有人帮我看看啊
 
weiheying
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2009-12-14
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-12-14 19:07
我遇到了同样问题,解决了么?解决了也帮我一下啊
游客

返回顶部