我想在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 );
}
}
现在的问题是,
第一次弹出确认框的时候,驱动加载停止了,
不管是阻止还是加载,完成后会马上又弹出一个确认框,
就是加上刚才那个,一共弹了两个框
第二次开始,驱动加载就无法停止了,弹确认框的时候其实已经往下执行完了。。。
不知道问题出在哪里了,请各位大牛出手相助,多谢了~~~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!