From db1dc6fc91110593231a2c44ecc24b3b11d21b2a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 23 Dec 2015 23:04:20 -0800 Subject: [PATCH] sys: util: FSP_SYNCHRONOUS_WORK_ITEM --- src/sys/driver.h | 12 ++++++++++++ src/sys/util.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/sys/driver.h b/src/sys/driver.h index bbab1c82..8a856967 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -274,6 +274,18 @@ VOID FspFreeExternal(PVOID Pointer) /* utility: GUIDs */ NTSTATUS FspCreateGuid(GUID *Guid); +/* utility: synchronous work queue */ +typedef struct +{ + KEVENT Event; + PWORKER_THREAD_ROUTINE Routine; + PVOID Context; + WORK_QUEUE_ITEM WorkQueueItem; +} FSP_SYNCHRONOUS_WORK_ITEM; +VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem, + PWORKER_THREAD_ROUTINE Routine, PVOID Context); +VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem); + /* utility: delayed work queue */ typedef struct { diff --git a/src/sys/util.c b/src/sys/util.c index 624ab755..5054c244 100644 --- a/src/sys/util.c +++ b/src/sys/util.c @@ -7,6 +7,10 @@ #include NTSTATUS FspCreateGuid(GUID *Guid); +VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem, + PWORKER_THREAD_ROUTINE Routine, PVOID Context); +VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem); +static WORKER_THREAD_ROUTINE FspExecuteSynchronousWorkItemRoutine; VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, PWORKER_THREAD_ROUTINE Routine, PVOID Context); VOID FspQueueDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, LARGE_INTEGER Delay); @@ -14,6 +18,9 @@ static KDEFERRED_ROUTINE FspQueueDelayedWorkItemDPC; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, FspCreateGuid) +#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem) +#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItem) +#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItemRoutine) #pragma alloc_text(PAGE, FspInitializeDelayedWorkItem) #pragma alloc_text(PAGE, FspQueueDelayedWorkItem) #endif @@ -33,6 +40,36 @@ NTSTATUS FspCreateGuid(GUID *Guid) return Result; } +VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem, + PWORKER_THREAD_ROUTINE Routine, PVOID Context) +{ + PAGED_CODE(); + + KeInitializeEvent(&SynchronousWorkItem->Event, NotificationEvent, FALSE); + SynchronousWorkItem->Routine = Routine; + SynchronousWorkItem->Context = Context; + ExInitializeWorkItem(&SynchronousWorkItem->WorkQueueItem, + FspExecuteSynchronousWorkItemRoutine, SynchronousWorkItem); +} +VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem) +{ + PAGED_CODE(); + + ExQueueWorkItem(&SynchronousWorkItem->WorkQueueItem, DelayedWorkQueue); + + NTSTATUS Result; + Result = KeWaitForSingleObject(&SynchronousWorkItem->Event, Executive, KernelMode, FALSE, 0); + ASSERT(STATUS_SUCCESS == Result); +} +static VOID FspExecuteSynchronousWorkItemRoutine(PVOID Context) +{ + PAGED_CODE(); + + FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem = Context; + SynchronousWorkItem->Routine(SynchronousWorkItem->Context); + KeSetEvent(&SynchronousWorkItem->Event, 1, FALSE); +} + VOID FspInitializeDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, PWORKER_THREAD_ROUTINE Routine, PVOID Context) {