sys: FspIopCreateRequestWorkItem

This commit is contained in:
Bill Zissimopoulos 2016-11-08 18:23:43 -08:00
parent bc8962d2b6
commit 55c7384c65
3 changed files with 39 additions and 2 deletions

View File

@ -747,6 +747,7 @@ FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *FspIopRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *
NTSTATUS FspIopCreateRequestFunnel( NTSTATUS FspIopCreateRequestFunnel(
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest);
NTSTATUS FspIopCreateRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject,

View File

@ -20,6 +20,7 @@
NTSTATUS FspIopCreateRequestFunnel( NTSTATUS FspIopCreateRequestFunnel(
PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini, PIRP Irp, PUNICODE_STRING FileName, ULONG ExtraSize, FSP_IOP_REQUEST_FINI *RequestFini,
ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest); ULONG Flags, FSP_FSCTL_TRANSACT_REQ **PRequest);
NTSTATUS FspIopCreateRequestWorkItem(FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini); VOID FspIopResetRequest(FSP_FSCTL_TRANSACT_REQ *Request, FSP_IOP_REQUEST_FINI *RequestFini);
NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject,
@ -35,6 +36,7 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response
#ifdef ALLOC_PRAGMA #ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspIopCreateRequestFunnel) #pragma alloc_text(PAGE, FspIopCreateRequestFunnel)
#pragma alloc_text(PAGE, FspIopCreateRequestWorkItem)
#pragma alloc_text(PAGE, FspIopDeleteRequest) #pragma alloc_text(PAGE, FspIopDeleteRequest)
#pragma alloc_text(PAGE, FspIopResetRequest) #pragma alloc_text(PAGE, FspIopResetRequest)
#pragma alloc_text(PAGE, FspIopPostWorkRequestFunnel) #pragma alloc_text(PAGE, FspIopPostWorkRequestFunnel)
@ -100,8 +102,7 @@ NTSTATUS FspIopCreateRequestFunnel(
if (FlagOn(Flags, FspIopCreateRequestWorkItemFlag)) if (FlagOn(Flags, FspIopCreateRequestWorkItemFlag))
{ {
RequestWorkItem = ExAllocatePoolWithTag( RequestWorkItem = FspAllocNonPaged(sizeof *RequestWorkItem);
NonPagedPool, sizeof *RequestWorkItem, FSP_ALLOC_INTERNAL_TAG);
if (0 == RequestWorkItem) if (0 == RequestWorkItem)
{ {
FspFree(RequestHeader); FspFree(RequestHeader);
@ -147,6 +148,25 @@ NTSTATUS FspIopCreateRequestFunnel(
return STATUS_SUCCESS; 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) VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request)
{ {
PAGED_CODE(); PAGED_CODE();

View File

@ -51,6 +51,22 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
RequestWorkItem->WorkRoutine = WorkRoutine; RequestWorkItem->WorkRoutine = WorkRoutine;
ExInitializeWorkItem(&RequestWorkItem->WorkQueueItem, FspWqWorkRoutine, Irp); 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) if (!CreateAndPost)
return STATUS_SUCCESS; return STATUS_SUCCESS;