From 9d9eb44f0bbe4c0aa8113f7da978244213c79cb0 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 5 Jan 2016 15:39:58 -0800 Subject: [PATCH] sys: complete functions may repost IRP by setting Result to STATUS_PENDING --- src/sys/driver.h | 14 +++++++++----- src/sys/iop.c | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/sys/driver.h b/src/sys/driver.h index b5d75c4e..45a2a434 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -152,11 +152,14 @@ extern __declspec(selectany) int bpglobal = 1; (LONGLONG)Irp->IoStatus.Information);\ if (STATUS_PENDING == Result) \ { \ - /* repost request! */ \ - FSP_FSVOL_DEVICE_EXTENSION *fsp_leave_FsvolDeviceExtension =\ - FspFsvolDeviceExtension(IrpSp->DeviceObject);\ - if (!FspIoqPostIrp(fsp_leave_FsvolDeviceExtension->Ioq, Irp, &Result))\ - FspIopCompleteIrp(Irp, Result);\ + if (0 == (IrpSp->Control & SL_PENDING_RETURNED))\ + { \ + /* if the IRP has not been marked pending already */\ + FSP_FSVOL_DEVICE_EXTENSION *fsp_leave_FsvolDeviceExtension =\ + FspFsvolDeviceExtension(IrpSp->DeviceObject);\ + if (!FspIoqPostIrp(fsp_leave_FsvolDeviceExtension->Ioq, Irp, &Result))\ + FspIopCompleteIrp(Irp, Result);\ + } \ } \ else \ FspIopCompleteIrp(Irp, Result);\ @@ -389,6 +392,7 @@ NTSTATUS FspIopCreateRequestFunnel( PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, BOOLEAN MustSucceed, FSP_FSCTL_TRANSACT_REQ **PRequest); +VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I); NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllocateIrpMustSucceed); diff --git a/src/sys/iop.c b/src/sys/iop.c index 85acb727..19f94232 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -10,7 +10,7 @@ NTSTATUS FspIopCreateRequestFunnel( PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, BOOLEAN MustSucceed, FSP_FSCTL_TRANSACT_REQ **PRequest); -static VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); +VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I); NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllocateIrpMustSucceed); @@ -129,7 +129,7 @@ NTSTATUS FspIopCreateRequestFunnel( return STATUS_SUCCESS; } -static VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request) +VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request) { PAGED_CODE();