我想在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 );
}
}现在的问题是,第一次弹出确认框的时候,驱动加载停止了,
不管是阻止还是加载,完成后会马上又弹出一个确认框,
就是加上刚才那个,一共弹了两个框第二次开始,驱动加载就无法停止了,弹确认框的时候其实已经往下执行完了不知道问题出在哪里了,请各位大牛出手相助,多谢了~~~
驱动,但不是直接拦截,想让用户选择是否加载驱动,我目前的做法是
先在
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 );
}
}现在的问题是,第一次弹出确认框的时候,驱动加载停止了,
不管是阻止还是加载,完成后会马上又弹出一个确认框,
就是加上刚才那个,一共弹了两个框第二次开始,驱动加载就无法停止了,弹确认框的时候其实已经往下执行完了不知道问题出在哪里了,请各位大牛出手相助,多谢了~~~
[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
有什么区别呢?
IoCreateSynchronizationEvent 是创建同步事件,在程序等待到事件信号时自动复位,如果多个线程同时等待该事件,只会有一个线程得到信号,其它线程仍处于等待状态;
IoCreateNotificationEvent 是创建通知事件,需要程序自己复位,如果多个线程同时等待该事件,所有线程都会得到信号。
我用debugview看log来调试的,
我明白了,我明天试试看,多谢你的回复