diff options
author | Yuri Benditovich <yuri.benditovich@daynix.com> | 2017-07-12 16:30:41 +0300 |
---|---|---|
committer | Sameeh Jubran <sjubran@redhat.com> | 2017-07-12 16:58:03 +0300 |
commit | 291006369790e9ea872f99aaa8b54800126d6f48 (patch) | |
tree | 986cf66576f710c1af8014f7a651e30656c6c96e | |
parent | db09883b2746f91f0906c17a8a7ab414ca2ce3cd (diff) |
Use lower device for queries during initialization
It is more correct to use lower device in stack for queries
during filter initialization. Lower device is in initialized
state and can process all kinds of requests, when current one is
not ready yet.
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
-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; }; |