lwglucky
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望129点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1147回复:3

自己分配的irp失败后应该在cancel例程中释放吗还是该立即释放??

楼主#
更多 发布于:2004-07-16 10:18
PIRP irp = IoBuildDeviceIoControlRequest( //0X1B0048
        0x1B0040, m_TargetDevice, &lEvent, sizeof(ULONG),
        &lEvent, sizeof(ULONG), false, m_Event, &IoStatus);
IoSetCanelRoute(CancelRoute) ;   ////-----!!!!!这里
status = IoCallDriver(m_TargetDevice->DeviceObject(),irp);
if (status==STATUS_PENDING){
     status = KeWaitForSingleObject(m_Event,Executive ,  KernelMode ,   false , &timeout);
   if (status==STATUS_TIMEOUT){
IoCancelIrp(irp);  
           IoFreeIrp(irp); //////?????是该这里释放Irp  
                         //////还是应该在CancelRoute释放Irp
   }
}
///////////
眼底手高
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-16 16:03
PIRP irp = IoBuildDeviceIoControlRequest( //0X1B0048
        0x1B0040, m_TargetDevice, &lEvent, sizeof(ULONG),
        &lEvent, sizeof(ULONG), false, m_Event, &IoStatus);
IoSetCanelRoute(CancelRoute) ;   ////-----!!!!!这里
status = IoCallDriver(m_TargetDevice->DeviceObject(),irp);
if (status==STATUS_PENDING){
     status = KeWaitForSingleObject(m_Event,Executive ,  KernelMode ,   false , &timeout);
   if (status==STATUS_TIMEOUT){
IoCancelIrp(irp);  
           IoFreeIrp(irp); //////?????是该这里释放Irp  
                         //////还是应该在CancelRoute释放Irp
   }
}
///////////  

应该设置完成例程,在完成例程里释放,并且返回STATUS_MORE_PROCESSING_REQUIRED 以避免io管理器处理
不停学习
lwglucky
驱动牛犊
驱动牛犊
  • 注册日期2003-01-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望129点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-16 16:31
谢谢楼上哈,我也刚看懂为什么IoCanelIrp中也要IoCompletele ..
眼底手高
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-19 11:46
为何要返回STATUS_MORE_PROCESSING_REQUIRED?
游客

返回顶部