首页
社区
课程
招聘
[求助]驱动的DEVICE_OBJECT::CurrentIrp是谁写入的?
发表于: 2009-4-10 11:29 6047

[求助]驱动的DEVICE_OBJECT::CurrentIrp是谁写入的?

2009-4-10 11:29
6047
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
只有用StartIo时才会有

见MSDN:
CurrentIrp
A pointer to the current IRP if the driver has a StartIo routine whose entry point was set in the driver object and if the driver is currently processing IRP(s). Otherwise, this member is NULL. For more information, see the IoStartPacket and IoStartNextPacket topics. This is a read-only member.
Timer

实际是系统在调用IoStartPacket 、IoStartNextPacket 等函数会给当前设备对象设置这个域
如果一个StartIoPacket的IRP请求没有被插入key device队列,那么就会设置这个IRP为这个设备对象的currentirp
2009-4-10 12:01
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢LS!
我在弄键盘过滤驱动时,发现键盘驱动总是有一个Irp处于等待之中,而2k系统的键盘设备的CurrentIrp不是NULL,而XP系统的CurrentIrp是NULL(DeviceTree看到的情况也是这样),那么XP下是否就无法取得这个等待中的Irp了呢?
因为这个等待中的Irp没有设置完成例程,所以按键后不会回调我设置的例程,这样就丢掉了第一次按键,所以我想取得这个Irp把它Cancel掉,2k下是可以成功的。如果没有办法的话,也请qihoocom明示,我改变思路……
2009-4-10 12:14
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
Device->DeviceExtension->ReadQueue
试试这个~

   // Queue of pended read requests sent to this port.  Access to this queue is
    // guarded by SpinLock
    //
    LIST_ENTRY ReadQueue;
2009-4-10 12:24
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
请问LS,Device->DeviceExtension不是自定义的么,类型是void*啊,我上哪找ReadQueue?
2009-4-10 13:47
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
参考DDK中的kdbclass源代码
2009-4-10 13:47
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
再次请教LS高人,kdbclass里面的DEVICE_EXTENSION结构体里面有一个PIRP WaitWakeIrp,注释是“Actual wait wake irp”,看样子很像是那个等待中的Irp。不过我不是在这个kdbclass基础上改的,而是通过IoGetDeviceObjectPointer得到了\Device\KeyboardClass0对应的DEVICE_OBJECT,虽然从名称看kbdclass和KeyboardClass0很像,但是它们的实现原理相同吗?我在XP-SP3的机器上测试过,WaitWakeIrp的值是0x89xxxxxx,比较像是一个Irp的地址,不过IoCancelIrp还是失败了,而在XP-SP1的机器上它的值是0。至于你说的ReadQueue,我是初学者,不知道怎么用,看定义就是双向链表,但是数据放哪?
2009-4-10 14:51
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
RemoveHeadList,CONTAINING_RECORD
2009-4-10 15:00
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我大致明白了,是不是LIST_ENTRY都是用IRP::Tail.Overlay.ListEntry串起来的,所以往回找几个字节就能找到对应的IRP呢?
如果这样可行的话,那么这是建立在kbdclass和\Device\KeyboardClass0设备在对DEVICE_EXTENSION使用方法相同的基础上,如果两者不同,那么很可能会导致蓝屏,是吧?
我的担心是不是多余的呢?
正在装XP虚拟机,刚才都是在真实的XP环境下测试,不过这次不敢了,装好了再试。qihoocom驱动高手可否先解答一下我这两个疑惑?
2009-4-10 15:20
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
之前,下班前测试了一下,在xp-sp3虚拟机里面,从ReadQueue那里成功的得到了IRP,并且也成功地Cancel了,在真实的xp-sp3里面Cancel不了,我以为是IRP没找对,改了一下代码,期望往Flink方向遍历以找到正确的IRP,并在打印出IRP的地址后休息2秒钟,在DBGVIEW里面观察,只有第一次得到的IRP的地址是0x8xxxxxxx的,后面两次是0xAxxxxxxx,找到第三个并试图Cancel掉时,蓝屏了,郁闷了。明天继续测试。
希望前辈qihoocom明天可以继续给予指导,感激不尽……
2009-4-10 22:30
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
我还是新开一贴吧,编辑掉
接http://bbs.pediy.com/showthread.php?t=85987
2009-4-11 10:26
0
游客
登录 | 注册 方可回帖
返回
//