freefly
驱动牛犊
驱动牛犊
  • 注册日期2001-11-08
  • 最后登录2007-02-11
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1176回复:3

怎样释放自己程序产生的irp?

楼主#
更多 发布于:2003-02-25 17:42
queryirp = TdiBuildInternalDeviceControlIrp( TDI_QUERY_INFORMATION, irpsp->DeviceObject, irpsp->FileObject, NULL, NULL);

怎样释放自己过滤驱动里声明的queryirp呢?
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-26 11:01
应该是I/O管理器释放
你的认可是对我最大的鼓励!
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-26 21:18
IoFreeIrp(Irp);
freefly
驱动牛犊
驱动牛犊
  • 注册日期2001-11-08
  • 最后登录2007-02-11
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-27 14:49
下面这段代码是在驱动里自己生成一个irp,发向底层device
       //Query addrobj address: port
ctx = (TDI_CREATE_ADDROBJ2_CTX *)ExAllocatePoolWithTagNonPagedPool,
sizeof(TDI_CREATE_ADDROBJ2_CTX), \'Y\');
        if( ctx!=NULL)
{
          ctx->fileobj = irpsp->FileObject;
 ctx->tai = (TDI_ADDRESS_INFO *)ExAllocatePoolWithTag(NonPagedPool, sizeof(TDI_ADDRESS_INFO), \'Y0\');
 if( ctx->tai != NULL)
 {

 mdl = IoAllocateMdl( ctx->tai, TDI_ADDRESS_INFO_MAX, FALSE, FALSE, NULL);
 if( mdl !=NULL)
 {
 __try
 {
 MmBuildMdlForNonPagedPool( mdl);
 MmProbeAndLockPages( mdl, KernelMode, IoWriteAccess);
 TdiBuildQueryInformation( query_irp, I.DeviceObject( CURRENT), irpsp->FileObject, tdi_tcp_create_addrobj_complete2, ctx, TDI_QUERY_ADDRESS_INFO, mdl);
 status = IoCallDriver( I.DeviceObject( CURRENT), query_irp);
 //MmUnlockPages( mdl);
 }
 __except(EXCEPTION_EXECUTE_HANDLER)
 {
 NTSTATUS status = GetExceptionCode();
 DbgPrint(\" errorcode: %x\\n\", status);
 }
 }
 }
}
}




下面这段代码是irp的OnComplete处理
NTSTATUS tdi_tcp_create_addrobj_complete2( PDEVICE_OBJECT DeviceObject, PIRP irp, PVOID Context)
{
  TDI_CREATE_ADDROBJ2_CTX  *ctx =
                         (TDI_CREATE_ADDROBJ2_CTX )Context;
 ...

   if( irp->MdlAddress!=NULL)
   {
    MmUnlockPages( irp->MdlAddress);

if( ctx != NULL)
{
if( ctx->tai != NULL)
ExFreePool( ctx->tai);
ExFreePool( ctx);
}

    IoFreeMdl( irp->MdlAddress);
   }
IoFreeIrp( irp);


   return STATUS_MORE_PROCESSING_REQUIRED;
}
可是这样处理后,会出现Page Fault(0eh)错误.
如何处理呢?大牛帮帮忙吧!!

游客

返回顶部