From c981801a37fd0b571de778a56d2266838e452726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger-Stelzer?= Date: Mon, 11 May 2020 21:39:43 +0200 Subject: [PATCH] Implemented freeing context memory --- sys/EmulationTargetPDO.cpp | 18 ++++++++++++++++++ sys/EmulationTargetPDO.hpp | 2 ++ 2 files changed, 20 insertions(+) diff --git a/sys/EmulationTargetPDO.cpp b/sys/EmulationTargetPDO.cpp index 7856ca5..b224073 100644 --- a/sys/EmulationTargetPDO.cpp +++ b/sys/EmulationTargetPDO.cpp @@ -145,6 +145,8 @@ NTSTATUS ViGEm::Bus::Core::EmulationTargetPDO::PdoCreateDevice(WDFDEVICE ParentD // Add common device data context WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&pdoAttributes, EMULATION_TARGET_PDO_CONTEXT); + pdoAttributes.EvtCleanupCallback = EvtDeviceContextCleanup; + status = WdfDeviceCreate(&DeviceInit, &pdoAttributes, &this->_PdoDevice); if (!NT_SUCCESS(status)) { @@ -308,6 +310,22 @@ NTSTATUS ViGEm::Bus::Core::EmulationTargetPDO::PdoCreateDevice(WDFDEVICE ParentD return status; } +VOID ViGEm::Bus::Core::EmulationTargetPDO::EvtDeviceContextCleanup( + IN WDFOBJECT Device +) +{ + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSPDO, "%!FUNC! Entry"); + + const auto ctx = EmulationTargetPdoGetContext(Device); + + // + // PDO device object getting disposed, free context object + // + delete ctx->Target; + + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSPDO, "%!FUNC! Exit"); +} + VOID ViGEm::Bus::Core::EmulationTargetPDO::SetSerial(ULONG Serial) { this->_SerialNo = Serial; diff --git a/sys/EmulationTargetPDO.hpp b/sys/EmulationTargetPDO.hpp index 4b8021f..71675be 100644 --- a/sys/EmulationTargetPDO.hpp +++ b/sys/EmulationTargetPDO.hpp @@ -80,6 +80,8 @@ namespace ViGEm::Bus::Core private: static unsigned long current_process_id(); + static EVT_WDF_DEVICE_CONTEXT_CLEANUP EvtDeviceContextCleanup; + protected: static const ULONG _maxHardwareIdLength = 0xFF;