summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Benditovich <yuri.benditovich@daynix.com>2017-07-12 16:30:41 +0300
committerSameeh Jubran <sjubran@redhat.com>2017-07-12 16:58:03 +0300
commit291006369790e9ea872f99aaa8b54800126d6f48 (patch)
tree986cf66576f710c1af8014f7a651e30656c6c96e
parentdb09883b2746f91f0906c17a8a7ab414ca2ce3cd (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.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;
};