阅读:1283回复:3
怎样释放自己程序产生的irp?
queryirp = TdiBuildInternalDeviceControlIrp( TDI_QUERY_INFORMATION, irpsp->DeviceObject, irpsp->FileObject, NULL, NULL);
怎样释放自己过滤驱动里声明的queryirp呢? |
|
沙发#
发布于:2003-02-26 11:01
应该是I/O管理器释放
|
|
|
板凳#
发布于:2003-02-26 21:18
IoFreeIrp(Irp);
|
|
地板#
发布于: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)错误. 如何处理呢?大牛帮帮忙吧!! |
|