首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请问一个2个NotificationEvent和用户层交互的有关问题~

2014-06-01 
请教一个2个NotificationEvent和用户层交互的问题~~~我想在PsRemoveLoadImageNotifyRoutine的回调函数里面

请教一个2个NotificationEvent和用户层交互的问题~~~
我想在PsRemoveLoadImageNotifyRoutine的回调函数里面拦截一些
驱动,但不是直接拦截,想让用户选择是否加载驱动,

我目前的做法是
先在
DriverEntry里面初始化两个NotificationEvent事件,
IoCreateNotificationEvent(&entryEvent, &deviceExtension->hEntryHandle);
IoCreateNotificationEvent(&stopEvent, &deviceExtension->hStopHandle);

第一个事件在回调函数里面发送到用户层
然后驱动等待stopEvent,
用户层开一个线程一直等待entryEvent,
接收到entryEvent,则按照是否加载,调用不同的DeviceIoControl,来处理,
然后再dev ctl里面唤醒stopEvent,
回调函数里面继续处理放行还是阻止

大概的代码如下:
驱动层:

回调函数里面,
如果有驱动要加载了
KeSetEvent(deviceExtension->entryEvent, 0, FALSE);
KeWaitForSingleObject(deviceExtension->stopEvent, 0, 0, FALSE, 0);
KeClearEvent(deviceExtension->stopEvent);
KeClearEvent(deviceExtension->entryEvent);
if(IsStop == 1)
{
  //阻止加载
}
IsStop = 0;// 恢复IsStop标志

dev ctl里面
case IOCTRL_SET_EVENT_STOP:
{
  dprintf("[kEvP] IOCTRL_SET_EVENT_STOP\r\n");
  IsStop = 1;
  KeSetEvent(deviceExtension->stopEvent, 0, 0);
  status=STATUS_SUCCESS;
}
break;
case IOCTRL_SET_EVENT_NOSTOP:
{
  dprintf("[kEvP] IOCTRL_SET_EVENT_NOSTOP\r\n");
  IsStop = 0;
  KeSetEvent(deviceExtension->stopEvent, 0, 0);
  status=STATUS_SUCCESS;
}
break;


在用户层开了一个线程,
一直等待entryEvent,
while (::WaitForSingleObject(hEntryEvent, INFINITE)==WAIT_OBJECT_0)
{
  int iResult= ::MessageBox(NULL, L"are you sure?", L"Info", ICONINFORMATION|MB_YESNO);
  if(iResult==IDYES)
  {
  status = DeviceIoControl( hDriver,
  (DWORD)IOCTRL_SET_EVENT_STOP,
  0,
  0,
  0,
  0,
  &bytesReturned,
  0 );
  }
  else
  {
  status = DeviceIoControl( hDriver,
  (DWORD)IOCTRL_SET_EVENT_NOSTOP,
  0,
  0,
  0,
  0,
  &bytesReturned,
  0 );
  }
}

现在的问题是,

第一次弹出确认框的时候,驱动加载停止了,
不管是阻止还是加载,完成后会马上又弹出一个确认框,
就是加上刚才那个,一共弹了两个框

第二次开始,驱动加载就无法停止了,弹确认框的时候其实已经往下执行完了。。。[b][/b]

不知道问题出在哪里了,请各位大牛出手相助,多谢了~~~

[解决办法]
从上面代码中看不出问题,在KeWaitForSingleObject上设置断点调试一下,看看第2次执行时,deviceExtension->stopEvent的值是不是被改变了,KeWaitForSingleObject的返回值是多少。再看一下DeviceControl中的deviceExtension->stopEvent是否正确。

另外,这种情况最好用IoCreateSynchronizationEvent创建同步事件,不要自己Clear。
[解决办法]
http://www.cnblogs.com/f4ncy/archive/2005/01/03/85763.html
[解决办法]
你是用什么工具调试的?一般是把光标停在代码上按F9设置断点。
IoCreateSynchronizationEvent 是创建同步事件,在程序等待到事件信号时自动复位,如果多个线程同时等待该事件,只会有一个线程得到信号,其它线程仍处于等待状态;
IoCreateNotificationEvent 是创建通知事件,需要程序自己复位,如果多个线程同时等待该事件,所有线程都会得到信号。

热点排行