-
-
[旧帖]
IoSetCompletionRoutine宏的中文说明
0.00雪花
-
发表于:
2011-6-1 16:46
1408
-
[旧帖] IoSetCompletionRoutine宏的中文说明
0.00雪花
IoSetCompletionRoutine宏注册一个IO完成例程(IO完成函数),下一层驱动完成IRP指定的操作后就会调用给定的函数。
void IoSetCompletionRoutine(
IN PIRP Irp,//IRP的指针,指向本成驱动正在处理的IRP。
IN PIO_COMPLETION_ROUTINE CompletionRoutine,//就是需要指定的函数的函数名
IN PVOID Context,//上面函数需要的指针,一般是DeviceObject存储在“非分页”(nonpaged)内存中,因为完成例程 //的中断请求级范围是IRQP<=DISPATCH_LEVEL.
IN BOOLEAN InvokeOnSuccess,//IO_STATUS_BLOCK子域为NT_SUCCESS
IN BOOLEAN InvokeOnError,//IO_STATUS_BLOCK子域为不成功的情况
IN BOOLEAN InvokeOnCancel//特指完成例程被调用时的IRP IO_STATUS_BLOCK子域指明,它的下层驱动对传下来的这个 //IRP执行了IoCancelIrp操作
);
需要包含的头文件wdm.h和ntddk.h
高层驱动使用IoAllocateIrp或IoBuildAsynchronousFsdRequest 分配/建立 IRP,在调用IoCallDriver时传递驱动 分配/建立 的IRP参数前必须传递所有InvokeOnXXX参数为TRUE来调用此完成例程。当完成例程通过这个IRP被调用时它必须释放驱动建立的IRP和任何其他相关的资源,比如:IoBuildPartialMdl分配的MDL。这类驱动如果调用IoFreeIrp阻止I/0 manager完成这个驱动创建的IRP将会返回STATUS_MORE_PROCESSING_REQUIRED。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课