首页
社区
课程
招聘
[注意]windows驱动开发完成例程方面的一个小提醒
发表于: 2011-6-5 15:20 6113

[注意]windows驱动开发完成例程方面的一个小提醒

2011-6-5 15:20
6113

经过本人对ReactOS和wrk的源码阅读发现,完成例程的第一个设备对象参数并非本层I/O堆栈所指的设备对象,而是上一层即附加在本层之上的设备对象,请大家在编程时注意。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 107
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好像不是吧,看了你说的,我跟踪了一下我写过的文件过滤驱动,发现完成函数的第一个参数就是本层设备对象,不知道是怎么回事
2011-6-5 19:35
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
贴几行关键代码:
for (stackPointer = IoGetCurrentIrpStackLocation( Irp ),
         Irp->CurrentLocation++,
         Irp->Tail.Overlay.CurrentStackLocation++;
         Irp->CurrentLocation <= (CCHAR) (Irp->StackCount + 1);
         stackPointer++,
         Irp->CurrentLocation++,
         Irp->Tail.Overlay.CurrentStackLocation++) {
......
ZeroIrpStackLocation( stackPointer );

            if (Irp->CurrentLocation == (CCHAR) (Irp->StackCount + 1)) {
                deviceObject = NULL;   (**)
            }
            else {
                deviceObject = IoGetCurrentIrpStackLocation( Irp )->DeviceObject;
            }

            status = stackPointer->CompletionRoutine( deviceObject,
                                                      Irp,
                                                      stackPointer->Context );
......
}
注意只有stackPointer 指向本层,而Irp->CurrentLocation和 Irp->Tail.Overlay.CurrentStackLocation一开始就被加一而指向了上一层。注意(**)处。
代码没超过50行,不违反微软的协议。
2011-6-6 09:47
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
请看下
IoSetCompletionRoutine这个宏
2011-6-7 09:00
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
跟那个宏无关,无论他把完成例程装到下一层还是本层,执行时是不管这些的,你分析一下就知道了。
2011-6-8 10:23
0
游客
登录 | 注册 方可回帖
返回
//