首页
社区
课程
招聘
[求助]在kbdclass里面如何取得等待中的IRP?
发表于: 2009-4-11 10:28 7163

[求助]在kbdclass里面如何取得等待中的IRP?

2009-4-11 10:28
7163
上接http://bbs.pediy.com/showthread.php?t=85883

按照大侠指点的方法,我在虚拟机上确实可以从ReadQueue里面得到等待中的IRP了,并且也能成功Cancel。
但是我在真实的机器中测试,得到的IRP::Cancel不是0,如果调用IoCancelIrp就会蓝屏,调试信息如下:
WaitWakeIrp = 89AF90E0 
Irp Address = 89AF6018,  Cancel = 188,  CancelRoutine = 8A5BE4F8 

READQUEUE IRP = 89AF6018 
Irp Address = 89AF90E0,  Cancel = 76,  CancelRoutine = 00000000 

DRIVERUNLOAD
Irp Address = 85F05008,  Cancel = 0,  CancelRoutine = BABD0306 

第一个就不用说了;
第二个我试过遍历ListEntry::Flink,第二、三个是Axxxxxxx的地址,第四个是Exxxxxxx的地址,之后就蓝屏了。
第三个是我在IRP_MJ_READ里面保存的IRP地址,把这个保存的地址进行Cancel,可以成功取消,也就是说驱动卸载是没问题的。
我用的虚拟机和真实机器都是XP-SP3,都是PS/2键盘,虚拟机下面成功了,是否意味着还有希望可以在真实机器里面得到等待中的IRP呢?我还可以做哪些尝试呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
标题编辑一下吧,论坛是不推荐直接点名提问的。
2009-4-11 11:10
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我找到原因了,是因为用IoGetDeviceObjectPointer所得到的L"\\Device\\KeyboardClass0"对应的设备并不是它自己,而是Attached到它上面的其他设备,这是用过DeviceTree发现的。我试着硬编码它的地址测试了一下,结果发现IRP是可以成功Cancel的。
不过驱动方面我是初学者,不知道要用什么API才能得到真正的L"\\Device\\KeyboardClass0"设备,希望可以指点一下。
2009-4-11 13:59
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
我一次就是被支付宝的那个设备骗了
2009-4-11 14:02
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
那LS解决问题了没有?我怎么才可以得到真正的设备呢?
我这里挂了两个设备,一个就是支付宝,另一个是我笔记本自己的一些热键相关的驱动,我用IoGetDeviceObjectPointer得到的是热键相关的驱动设备,IoAttachDeviceToDeviceStack返回的也是它。在虚拟机里面装了支付宝以后,IoGetDeviceObjectPointer得到的是支付宝,IoAttachDeviceToDeviceStack返回的也是支付宝。(刚才说是真正的设备,是看错了)
2009-4-11 14:07
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
找到了,是IoGetBaseFileSystemDeviceObject,不过这API是未公开的,自己声明了一下,测试了一下,得到的设备地址是正确的,解决了。
2009-4-11 14:40
0
雪    币: 3739
活跃值: (3877)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
ObReferenceObjectByName
2017-6-19 10:51
0
游客
登录 | 注册 方可回帖
返回
//