From d16f9f5832d6eaea4c5e564b4e10bc9bcb9510ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 21:43:25 +0200 Subject: [PATCH] Implemented timer --- sys/Context.h | 5 +++++ sys/Driver.c | 33 +++++++++++++++++++++++++++++++++ sys/busenum.h | 2 ++ 3 files changed, 40 insertions(+) diff --git a/sys/Context.h b/sys/Context.h index d273995..efd88d5 100644 --- a/sys/Context.h +++ b/sys/Context.h @@ -143,6 +143,11 @@ typedef struct _FDO_DEVICE_DATA // WDFSPINLOCK PendingPluginRequestsLock; + // + // Periodic timer sweeping up orphaned requests + // + WDFTIMER PendingPluginRequestsCleanupTimer; + } FDO_DEVICE_DATA, *PFDO_DEVICE_DATA; #define FDO_FIRST_SESSION_ID 100 diff --git a/sys/Driver.c b/sys/Driver.c index a7595c9..562621f 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -93,9 +93,11 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) WDF_OBJECT_ATTRIBUTES fdoAttributes; WDF_OBJECT_ATTRIBUTES fileHandleAttributes; WDF_OBJECT_ATTRIBUTES collectionAttributes; + WDF_OBJECT_ATTRIBUTES timerAttributes; PFDO_DEVICE_DATA pFDOData; VIGEM_BUS_INTERFACE busInterface; PINTERFACE interfaceHeader; + WDF_TIMER_CONFIG reqTimerCfg; UNREFERENCED_PARAMETER(Driver); @@ -188,6 +190,25 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) #pragma endregion +#pragma region Create timer for sweeping up orphaned requests + + WDF_TIMER_CONFIG_INIT_PERIODIC(&reqTimerCfg, Bus_PlugInRequestCleanUpEvtTimerFunc, 500); + WDF_OBJECT_ATTRIBUTES_INIT(&timerAttributes); + timerAttributes.ParentObject = device; + + status = WdfTimerCreate(&reqTimerCfg, &timerAttributes, &pFDOData->PendingPluginRequestsCleanupTimer); + if (!NT_SUCCESS(status)) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfTimerCreate failed with status %!STATUS!", + status); + return status; + } + + WdfTimerStart(pFDOData->PendingPluginRequestsCleanupTimer, WDF_REL_TIMEOUT_IN_SEC(1)); + +#pragma endregion + #pragma region Add query interface // @@ -559,3 +580,15 @@ Bus_PdoStageResult( TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit"); } + +_Use_decl_annotations_ +VOID +Bus_PlugInRequestCleanUpEvtTimerFunc( + WDFTIMER Timer +) +{ + UNREFERENCED_PARAMETER(Timer); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); +} + diff --git a/sys/busenum.h b/sys/busenum.h index dea6a0c..ee703b6 100644 --- a/sys/busenum.h +++ b/sys/busenum.h @@ -102,6 +102,8 @@ EVT_WDF_TIMER Xgip_SysInitTimerFunc; EVT_WDF_OBJECT_CONTEXT_CLEANUP Bus_EvtDriverContextCleanup; +EVT_WDF_TIMER Bus_PlugInRequestCleanUpEvtTimerFunc; + #pragma endregion #pragma region Bus enumeration-specific functions