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:49:32 +0300
commitd902e99a2ac083a67010bfb70dbca104f538a074 (patch)
tree986cf66576f710c1af8014f7a651e30656c6c96e
parentdfd3a4a0ca5bd879d389c221a0cc2f14fc684fe0 (diff)
Use lower device for queries during initializationv1.00-20github
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;
};