能力值:
( LV2,RANK:10 )
|
-
-
2 楼
没人回答
|
能力值:
(RANK:600 )
|
-
-
3 楼
IO完成例程的源头是IofCompleteRequest()函数,再通过IoSetCompletionRoutine设置完成例程时,完成例程被保存在了下一层IRP的irpstack中的CompletionRoutine成员里。以下是IoSetCompletionRoutine的宏:
#define IoSetCompletionRoutine( Irp, Routine, CompletionContext, Success, Error, Cancel ) { \
PIO_STACK_LOCATION __irpSp; \
ASSERT( (Success) | (Error) | (Cancel) ? (Routine) != NULL : TRUE ); \
__irpSp = IoGetNextIrpStackLocation( (Irp) ); \
__irpSp->CompletionRoutine = (Routine); \
__irpSp->Context = (CompletionContext); \
__irpSp->Control = 0; \
if ((Success)) { __irpSp->Control = SL_INVOKE_ON_SUCCESS; } \
if ((Error)) { __irpSp->Control |= SL_INVOKE_ON_ERROR; } \
if ((Cancel)) { __irpSp->Control |= SL_INVOKE_ON_CANCEL; } }
当IofCompleteRequest()被调用时,它会自下而上地扫描IRP中的各层IO_STACK_LOCATION数据结构,如果相应标志位所表示的条件得到满足就加以调用。你可以去看看wrk或者ReactOS的源码。
|
|
|