mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 04:52:10 -05:00
sys: FspIopCreateRequestWorkItem
This commit is contained in:
parent
bc8962d2b6
commit
55c7384c65
@ -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,
|
||||||
|
@ -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();
|
||||||
|
16
src/sys/wq.c
16
src/sys/wq.c
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user