首页
社区
课程
招聘
[已解决]请教一个2个NotificationEvent和用户层交互的问题~~~
发表于: 2010-2-18 23:31 3691

[已解决]请教一个2个NotificationEvent和用户层交互的问题~~~

2010-2-18 23:31
3691
我想在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 );
    }
}

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

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


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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 492
活跃值: (53)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
这个问题自己解决掉了,
MS现在可以正常的和用户层进行2次交互了~~~
2010-2-19 10:04
0
游客
登录 | 注册 方可回帖
返回
//