在本层驱动内完成历程内调用IoCompleteRequset会首先执行本层的完成历程还是上层的完成历程? 完成历程的回卷是从本层开始吗? 为什么我看wrk觉得是从本层开始。假如是本层,那么在本层的完成历程里调用IocompleteRequest不就在本层里死循环了吗? 说不通了呀
这是在看驱动编程技术详解的21章遇到的困惑。。
上代码:
NTSTATUS CompletionRoutine_32(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context)
{
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_MORE_PROCESSING_REQUIRED;
}
这是在看驱动编程技术详解的21章遇到的困惑。。
上代码:
NTSTATUS CompletionRoutine_32(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context)
{
if(Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_MORE_PROCESSING_REQUIRED;
}
解决方案 »
- ---------------求救:ftp下载的问题,CFtpConnection OpenFile使用------------
- 类成员函数的问题。
- c语言调用api函数问题,编译不出错。。执行就出错了。。大家帮我看下啊 谢谢哦
- 用vs2005做类似windows自带的画板
- 今天我是来向各位有求于别的问题的,如有不符本栏目的宗旨,诚请谅解,以后不敢了~~~~
- 还是没有搞懂非模态对话框,请看看!
- 请教各位什么软件可以实现硬盘分区间的数据备份?
- 求教在单文档程序中动态创建WebBrowser的方法,急
- 能在OnCreate()外实现往View里面加控件吗?
- 谁知道EXE文件的格式吗?
- 求助C++连接sql server数据库的问题
- MFC SQL2005登录模块的设计
#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;} }\
它将完成例程,设置到下一层IO_STACK_LOCATION 中,当IoCompleteRequest的时候它检查其返回值代码如果是STATUS_MORE_PROCESSING_REQUIRED回溯停止,IoCompleteRequest将停止前进并返回到调用者!
因此最底层的驱动不应该有包含完成例程