首页
社区
课程
招聘
[求助]写了个键盘过滤驱动挂在kbdclass0设备上,为什么关机的时候系统不能完全关闭呢?郁闷中
发表于: 2009-10-11 20:53 7143

[求助]写了个键盘过滤驱动挂在kbdclass0设备上,为什么关机的时候系统不能完全关闭呢?郁闷中

2009-10-11 20:53
7143
我在这个过滤驱动中创建了2个设备对象,一个挂在kbdclass0上,另一个和Ring3的程序通信,现在问题来了,机器不能被关闭了(开始的时候和正常的关机一样,后来就不对了,显示器虽然不显示画面了,但CPU仍在运行,我等了几分钟,它仍在运行),除非直接按机箱上的关闭按钮才行,不知道是什么原因造成的?(我的驱动一直没卸载)

大家帮忙分析一下大概是什么原因?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
IRP_MJ_POWER
2009-10-11 21:40
0
雪    币: 265
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yvi
3
2009-10-11 23:44
0
雪    币: 142
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
按任意键退出驱动,如果你是改写klog的话
2009-10-12 00:19
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
创建好设备后先IoRegisterShutdownNotification注册一下,然后在IRP_MJ_SHUTDOWN的派遣例程里把没完成的IRP取消了。
2009-10-12 09:58
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6

不卸载就不用考虑这个问题
2009-10-12 11:57
0
雪    币: 225
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
向achillis请教一下,你说的IRP_MJ_POWER 这个IRP我已经把它往下层发了,可是仍然出现和原来一样的情况.
5楼的朋友说的是在接收到IRP_MJ_SHUTDOWN这IRP时,把所有的未决的请求都取消掉,这样的话我就有疑问了:如果我不取消所有未决的IRP,低层的驱动不是应该取消所有的未决的IRP吗(如果我不挂在kbdclass0上,在关机的时候,他们还不是一样要取消所有未决的IRP吗)?

希望大家在解释下我心中的疑惑.
2009-10-12 13:55
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
你什么系统?Vista以前必须用PoCallDriver来传递
2009-10-12 14:42
0
雪    币: 225
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我就是用PoCallDriver来转发IRP_MJ_POWER的

系统是XP SP3
2009-10-12 14:48
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
10
都说了,创建好设备后先IoRegisterShutdownNotification注册一下,然后在IRP_MJ_SHUTDOWN的派遣例程里把没完成的IRP取消了。
2009-10-13 10:30
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
11
以前我做过这个东西
2009-10-13 10:30
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
12
klog似乎并没有这么做吧
2009-10-13 10:47
0
雪    币: 636
活跃值: (174)
能力值: ( 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了。
2009-10-13 11:14
0
雪    币: 7651
活跃值: (523)
能力值: ( 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,关机也很正常啊
2009-10-13 12:03
0
雪    币: 70
活跃值: (74)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
我说说我的想法,klog里把IRP计数了,最后UNLOAD时全部处理当计数为0后才结束的,所以不需要shutdown吧,纯属瞎掰,表拍我!
2009-10-13 13:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
为什么非要卸载呢?不卸载也是可以正常关机的,非要说卸载怎么怎么样,楼主的问题也不在于卸载
2009-10-13 15:20
0
游客
登录 | 注册 方可回帖
返回
//