czcty
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2006-11-08
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1161回复:1

I/O 完成例程序 一问

楼主#
更多 发布于:2005-05-28 09:41
I/O 完成例程序:
NTSTATUS ReadCompetion (IN PDEVCE_OBJECT pDevObj,
                        IN PIRP pIrp,
                        IN PVOID pContext ){

              ...
              ...
              PIO_STACK_LOCATION pThisIrpStack=IoGetCurrentIrpStackLocation(pIrp);

              PIO_STACK_LOCATION pNextIrpStackLocation= IoGetNextIrpStackLocation(pIrp);
              ...
              ...
              // 下面这句是什么含义
              *pNextIrpStackLocation=*pThisIrpStack;
              ...
              IoSetCompletionRoutine(pIrp,ReadCompletion,NULL,TRUE,TRUE,TRUE);
              ToCallDriver(pDevExt->LowerDevice,pIrp);
             ...
}
            
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-05-28 23:49
// 下面这句是什么含义
*pNextIrpStackLocation=*pThisIrpStack;

将自己这一级的I/O堆栈拷贝到下一级驱动程序的I/O堆栈,因为作为
Irp最初分配的时候,仅仅初始化了第一级的I/O堆栈,做为分层的驱动,调用下一级驱动的时候,都要负责初始化下一级驱动的I/O堆栈,一般的filter直接把自己的复制到下一层就可以了。复杂的可能要自己重新生成新的Irp,往下传,就不能简单的这么做了
游客

返回顶部