diff options
-rw-r--r-- | UsbDk/FilterDevice.cpp | 7 | ||||
-rw-r--r-- | UsbDk/WdfDevice.cpp | 6 | ||||
-rw-r--r-- | UsbDk/WdfDevice.h | 2 |
3 files changed, 14 insertions, 1 deletions
diff --git a/UsbDk/FilterDevice.cpp b/UsbDk/FilterDevice.cpp index ee04720..ad81840 100644 --- a/UsbDk/FilterDevice.cpp +++ b/UsbDk/FilterDevice.cpp @@ -486,7 +486,7 @@ NTSTATUS CUsbDkFilterDevice::DefineStrategy() return status; } - if (!m_Strategy.SelectStrategy(WdmObject())) + if (!m_Strategy.SelectStrategy(LowerDeviceObject())) { TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Not attached"); return STATUS_NOT_SUPPORTED; @@ -525,6 +525,11 @@ NTSTATUS CUsbDkFilterDevice::Create(PWDFDEVICE_INIT DevInit) TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Failed to create device"); return status; } + if (!LowerDeviceObject()) + { + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! No lower device, skip"); + return STATUS_INVALID_DEVICE_STATE; + } auto deviceContext = UsbDkFilterGetContext(m_Device); deviceContext->UsbDkFilter = this; diff --git a/UsbDk/WdfDevice.cpp b/UsbDk/WdfDevice.cpp index fe09930..566a078 100644 --- a/UsbDk/WdfDevice.cpp +++ b/UsbDk/WdfDevice.cpp @@ -125,6 +125,8 @@ NTSTATUS CWdfDevice::Create(CPreAllocatedDeviceInit &DeviceInit, WDF_OBJECT_ATTR TraceEvents(TRACE_LEVEL_ERROR, TRACE_WDFDEVICE, "%!FUNC! Device name caching failed %!STATUS!", status); } + m_LowerDeviceObj = IoGetLowerDeviceObject(WdmObject()); + return status; } @@ -170,6 +172,10 @@ void CWdfSpecificQueue::InitConfig(WDF_IO_QUEUE_CONFIG &QueueConfig) CWdfDevice::~CWdfDevice() { TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_WDFDEVICE, "%!FUNC! Deleting device %wZ", m_CachedName); + if (m_LowerDeviceObj) + { + ObDereferenceObject(m_LowerDeviceObj); + } } NTSTATUS CWdfDevice::CacheDeviceName() diff --git a/UsbDk/WdfDevice.h b/UsbDk/WdfDevice.h index a044801..978c3c9 100644 --- a/UsbDk/WdfDevice.h +++ b/UsbDk/WdfDevice.h @@ -139,6 +139,7 @@ public: WDFDEVICE WdfObject() const { return m_Device; } PDEVICE_OBJECT WdmObject() const { return WdfDeviceWdmGetDeviceObject(m_Device); }; + PDEVICE_OBJECT LowerDeviceObject() const { return m_LowerDeviceObj; } WDFIOTARGET IOTarget() const { return WdfDeviceGetIoTarget(m_Device); } @@ -155,6 +156,7 @@ private: NTSTATUS AddQueue(WDF_IO_QUEUE_CONFIG &Config, WDF_OBJECT_ATTRIBUTES &Attributes, WDFQUEUE &Queue); NTSTATUS CacheDeviceName(); CString m_CachedName; + PDEVICE_OBJECT m_LowerDeviceObj = nullptr; friend class CWdfQueue; }; |