能力值:
( LV9,RANK:610 )
|
-
-
2 楼
IRP_MJ_POWER
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
按任意键退出驱动,如果你是改写klog的话
|
能力值:
( LV9,RANK:260 )
|
-
-
5 楼
创建好设备后先IoRegisterShutdownNotification注册一下,然后在IRP_MJ_SHUTDOWN的派遣例程里把没完成的IRP取消了。
|
能力值:
( LV9,RANK:610 )
|
-
-
6 楼
不卸载就不用考虑这个问题
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
向achillis请教一下,你说的IRP_MJ_POWER 这个IRP我已经把它往下层发了,可是仍然出现和原来一样的情况.
5楼的朋友说的是在接收到IRP_MJ_SHUTDOWN这IRP时,把所有的未决的请求都取消掉,这样的话我就有疑问了:如果我不取消所有未决的IRP,低层的驱动不是应该取消所有的未决的IRP吗(如果我不挂在kbdclass0上,在关机的时候,他们还不是一样要取消所有未决的IRP吗)?
希望大家在解释下我心中的疑惑.
|
能力值:
( LV9,RANK:610 )
|
-
-
8 楼
你什么系统?Vista以前必须用PoCallDriver来传递
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我就是用PoCallDriver来转发IRP_MJ_POWER的
系统是XP SP3
|
能力值:
( LV9,RANK:260 )
|
-
-
10 楼
都说了,创建好设备后先IoRegisterShutdownNotification注册一下,然后在IRP_MJ_SHUTDOWN的派遣例程里把没完成的IRP取消了。
|
能力值:
( LV9,RANK:260 )
|
-
-
11 楼
以前我做过这个东西
|
能力值:
( LV9,RANK:610 )
|
-
-
12 楼
klog似乎并没有这么做吧
|
能力值:
( LV9,RANK:260 )
|
-
-
13 楼
以前我做这东西的时候也是关不了机。。。
终于把代码从硬盘翻来了,如下:
挂界完设备后注册个关机通知,这样就能处理IRP_MJ_SHUTDOWN了
IoRegisterShutdownNotification(device);
在IRP_MJ_SHUTDOWN里调用卸载例程,把驱动卸了,就能关机了:
NTSTATUS KJShutDown(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp ){
DriverUnload(DeviceObject->DriverObject);
return STATUS_SUCCESS;
}
当然,我的卸载例程里不是采用的“按任意键后退出驱动”的方法,因为这个时候没人来按任意键。所以需要把挂起的IRP取消了。
这么处理就OK了。
|
能力值:
( LV9,RANK:610 )
|
-
-
14 楼
不知道楼主具体是怎么写的,贴个我改的klog中的部分代码:
NTSTATUS DispatchPower(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
dprintf("[Klog]Power Dispatch Routine called!\n");
PoStartNextPowerIrp(pIrp);
IoSkipCurrentIrpStackLocation(pIrp);
return PoCallDriver(((PDEVICE_EXTENSION) pDeviceObject->DeviceExtension)->pKeyboardDevice ,pIrp);
}
没有加这个以前,关机会蓝屏.
Klog里面根本没有处理ShutDown,关机也很正常啊
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
我说说我的想法,klog里把IRP计数了,最后UNLOAD时全部处理当计数为0后才结束的,所以不需要shutdown吧,纯属瞎掰,表拍我!
|
能力值:
( LV9,RANK:610 )
|
-
-
16 楼
为什么非要卸载呢?不卸载也是可以正常关机的,非要说卸载怎么怎么样,楼主的问题也不在于卸载
|
|
|