diff --git a/src/sys/driver.h b/src/sys/driver.h index a5337001..b18561bf 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -80,14 +80,13 @@ NtStatusSym(Result), \ !NT_SUCCESS(Result) ? 0 : Irp->IoStatus.Information);\ if (STATUS_PENDING == Result) \ - IoMarkIrpPending(Irp); \ + {\ + ASSERT(FspFsvrtDeviceExtensionKind == FspDeviceExtension(DeviceObject)->Kind);\ + FspIoqPostIrp(&FspFsvrtDeviceExtension(DeviceObject)->Ioq, Irp);\ + /* also marks the IRP pending */\ + }\ else \ - { \ - if (!NT_SUCCESS(Result)) \ - Irp->IoStatus.Information = 0;\ - Irp->IoStatus.Status = Result;\ - IoCompleteRequest(Irp, FSP_IO_INCREMENT);\ - } \ + FspCompleteRequest(Irp, Result);\ ); \ return Result #define FSP_ENTER_BOOL(...) \ @@ -208,6 +207,7 @@ FSP_FSVOL_DEVICE_EXTENSION *FspFsvolDeviceExtension(PDEVICE_OBJECT DeviceObject) } /* misc */ +VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result); NTSTATUS FspCreateGuid(GUID *Guid); NTSTATUS FspSecuritySubjectContextAccessCheck( PSECURITY_DESCRIPTOR SecurityDescriptor, ACCESS_MASK DesiredAccess, KPROCESSOR_MODE AccessMode); diff --git a/src/sys/ioq.c b/src/sys/ioq.c index f3be5b2a..aac8a028 100644 --- a/src/sys/ioq.c +++ b/src/sys/ioq.c @@ -144,9 +144,7 @@ static VOID FspIoqProcessReleaseLock(PIO_CSQ IoCsq, KIRQL Irql) static VOID FspIoqCompleteCanceledIrp(PIO_CSQ IoCsq, PIRP Irp) { - Irp->IoStatus.Status = STATUS_CANCELLED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, FSP_IO_INCREMENT); + FspCompleteRequest(Irp, STATUS_CANCELLED); } VOID FspIoqInitialize(FSP_IOQ *Ioq) @@ -203,7 +201,7 @@ VOID FspIoqCancelAll(FSP_IOQ *Ioq) { PIRP Irp; while (0 != (Irp = IoCsqRemoveNextIrp(&Ioq->PendingIoCsq, 0))) - FspIoqCompleteCanceledIrp(&Ioq->PendingIoCsq, Irp); + FspCompleteRequest(Irp, STATUS_CANCELLED); while (0 != (Irp = IoCsqRemoveNextIrp(&Ioq->ProcessIoCsq, 0))) - FspIoqCompleteCanceledIrp(&Ioq->ProcessIoCsq, Irp); + FspCompleteRequest(Irp, STATUS_CANCELLED); } diff --git a/src/sys/misc.c b/src/sys/misc.c index 9da51c63..efd86fc9 100644 --- a/src/sys/misc.c +++ b/src/sys/misc.c @@ -6,15 +6,27 @@ #include -NTSTATUS CreateGuid(GUID *Guid); -NTSTATUS SecuritySubjectContextAccessCheck( +NTSTATUS FspCreateGuid(GUID *Guid); +NTSTATUS FspSecuritySubjectContextAccessCheck( PSECURITY_DESCRIPTOR SecurityDescriptor, ACCESS_MASK DesiredAccess, KPROCESSOR_MODE AccessMode); #ifdef ALLOC_PRAGMA -#pragma alloc_text(PAGE, CreateGuid) -#pragma alloc_text(PAGE, SecuritySubjectContextAccessCheck) +#pragma alloc_text(PAGE, FspCreateGuid) +#pragma alloc_text(PAGE, FspSecuritySubjectContextAccessCheck) #endif +VOID FspCompleteRequest(PIRP Irp, NTSTATUS Result) +{ + // !PAGED_CODE(); + + ASSERT(STATUS_PENDING != Result); + + if (!NT_SUCCESS(Result)) + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Result; + IoCompleteRequest(Irp, FSP_IO_INCREMENT); +} + NTSTATUS FspCreateGuid(GUID *Guid) { PAGED_CODE();