我想在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 );
    }
}现在的问题是,第一次弹出确认框的时候,驱动加载停止了,
不管是阻止还是加载,完成后会马上又弹出一个确认框,
就是加上刚才那个,一共弹了两个框第二次开始,驱动加载就无法停止了,弹确认框的时候其实已经往下执行完了
不知道问题出在哪里了,请各位大牛出手相助,多谢了~~~

解决方案 »

  1.   

    从上面代码中看不出问题,在KeWaitForSingleObject上设置断点调试一下,看看第2次执行时,deviceExtension->stopEvent的值是不是被改变了,KeWaitForSingleObject的返回值是多少。再看一下DeviceControl中的deviceExtension->stopEvent是否正确。另外,这种情况最好用IoCreateSynchronizationEvent创建同步事件,不要自己Clear。
      

  2.   

    多谢高手的回复,我不会设断点,不过打了log
    [kEvP] LoadSystemImgae: \??\C:\project\testdrv5\objchk_wlh_x86\i386\testdrv5.sys 
    [kEvP] testdrv5.sys detected.
    [kEvP] callback stopEvent: 0x84be7ab0 [kEvP] IOCTRL_SET_EVENT_NOSTOP 
    [kEvP] IOCTRL_SET_EVENT_NOSTOP stopEvent: 0x84be7ab0 
    [kEvP] recive user message.
    [kEvP] noStops 
    [testdrv5] EasySys Sample Driver 
    [testdrv5] Compiled Feb  5 2010 15:05:57 
    [testdrv5] In DriverEntry : \REGISTRY\MACHINE\SYSTEM\ControlSet001\services\testdrv5 
    [testdrv5] DriverEntry Success 
    [kEvP] IOCTRL_SET_EVENT_NOSTOP 
    [kEvP] IOCTRL_SET_EVENT_NOSTOP stopEvent: 0x84be7ab0 我在你说的地方都打了log,
    每次stopEvent都是一样的,
    KeWaitForSingleObject返回值应该也是NT_SUCCESS,否则会打log的,还没搞懂问题出在哪里还想请问一下
    IoCreateSynchronizationEvent

    IoCreateNotificationEvent
    有什么区别呢?
      

  3.   

    http://www.cnblogs.com/f4ncy/archive/2005/01/03/85763.html
      

  4.   

    你是用什么工具调试的?一般是把光标停在代码上按F9设置断点。
    IoCreateSynchronizationEvent 是创建同步事件,在程序等待到事件信号时自动复位,如果多个线程同时等待该事件,只会有一个线程得到信号,其它线程仍处于等待状态;
    IoCreateNotificationEvent 是创建通知事件,需要程序自己复位,如果多个线程同时等待该事件,所有线程都会得到信号。
      

  5.   


    我用debugview看log来调试的,
    我明白了,我明天试试看,多谢你的回复