summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UsbDk/FilterDevice.cpp7
-rw-r--r--UsbDk/WdfDevice.cpp6
-rw-r--r--UsbDk/WdfDevice.h2
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;
};