能力值:
( LV4,RANK:50 )
|
-
-
2 楼
好像不是吧,看了你说的,我跟踪了一下我写过的文件过滤驱动,发现完成函数的第一个参数就是本层设备对象,不知道是怎么回事
|
能力值:
( 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行,不违反微软的协议。
|
能力值:
( LV8,RANK:120 )
|
-
-
4 楼
请看下
IoSetCompletionRoutine这个宏
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
跟那个宏无关,无论他把完成例程装到下一层还是本层,执行时是不管这些的,你分析一下就知道了。
|
|
|