From 55c7384c65d4912b3ec3d49ef0fcd3237c8c4687 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 8 Nov 2016 18:23:43 -0800 Subject: [PATCH] sys: FspIopCreateRequestWorkItem --- src/sys/driver.h | 1 + src/sys/iop.c | 24 ++++++++++++++++++++++-- src/sys/wq.c | 16 ++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/sys/driver.h b/src/sys/driver.h index fd0873d6..94275811 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -747,6 +747,7 @@ FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *FspIopRequestWorkItem(FSP_FSCTL_TRANSACT_REQ * NTSTATUS FspIopCreateRequestFunnel( PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); +NTSTATUS FspIopCreateRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, diff --git a/src/sys/iop.c b/src/sys/iop.c index 4c7950b4..c7410feb 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -20,6 +20,7 @@ NTSTATUS FspIopCreateRequestFunnel( PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); +NTSTATUS FspIopCreateRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, @@ -35,6 +36,7 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspIopCreateRequestFunnel) +#pragma alloc_text(PAGE, FspIopCreateRequestWorkItem) #pragma alloc_text(PAGE, FspIopDeleteRequest) #pragma alloc_text(PAGE, FspIopResetRequest) #pragma alloc_text(PAGE, FspIopPostWorkRequestFunnel) @@ -100,8 +102,7 @@ NTSTATUS FspIopCreateRequestFunnel( if (FlagOn(Flags, FspIopCreateRequestWorkItemFlag)) { - RequestWorkItem = ExAllocatePoolWithTag( - NonPagedPool, sizeof *RequestWorkItem, FSP_ALLOC_INTERNAL_TAG); + RequestWorkItem = FspAllocNonPaged(sizeof *RequestWorkItem); if (0 == RequestWorkItem) { FspFree(RequestHeader); @@ -147,6 +148,25 @@ NTSTATUS FspIopCreateRequestFunnel( return STATUS_SUCCESS; } +NTSTATUS FspIopCreateRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *Request) +{ + PAGED_CODE(); + + FSP_FSCTL_TRANSACT_REQ_HEADER *RequestHeader = (PVOID)((PUINT8)Request - sizeof *RequestHeader); + FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *RequestWorkItem; + + if (0 == RequestHeader->WorkItem) + { + RequestWorkItem = FspAllocNonPaged(sizeof *RequestWorkItem); + if (0 == RequestWorkItem) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(RequestWorkItem, sizeof *RequestWorkItem); + } + + return STATUS_SUCCESS; +} + VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request) { PAGED_CODE(); diff --git a/src/sys/wq.c b/src/sys/wq.c index 1c9bd19a..5d3fc242 100644 --- a/src/sys/wq.c +++ b/src/sys/wq.c @@ -51,6 +51,22 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp, RequestWorkItem->WorkRoutine = WorkRoutine; ExInitializeWorkItem(&RequestWorkItem->WorkQueueItem, FspWqWorkRoutine, Irp); } + else + { + RequestWorkItem = FspIopRequestWorkItem(Request); + if (0 == RequestWorkItem) + { + NTSTATUS Result; + + Result = FspIopCreateRequestWorkItem(Request); + if (!NT_SUCCESS(Result)) + return Result; + + RequestWorkItem = FspIopRequestWorkItem(Request); + RequestWorkItem->WorkRoutine = WorkRoutine; + ExInitializeWorkItem(&RequestWorkItem->WorkQueueItem, FspWqWorkRoutine, Irp); + } + } if (!CreateAndPost) return STATUS_SUCCESS;