diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 0000000..cacbad2 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,19 @@ +image: Visual Studio 2015 + +version: build-{build}-{branch} + +before_build: + - ren "C:\Program Files (x86)\Windows Kits\10\include\00wdf" "wdf" + - ren "C:\Program Files (x86)\WiX Toolset v3.11" "WiX Toolset v3.8" + +build_script: buildAll.bat + +skip_commits: + message: /\[ci skip\]/ + +notifications: + - provider: Email + to: devel@daynix.com + on_build_success: false + on_build_failure: false + on_build_status_changed: true diff --git a/README.md b/README.md index 238f57e..c1a5b23 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://ci.appveyor.com/api/projects/status/github/daynix/usbdk?branch=master&svg=true)](https://ci.appveyor.com/project/daynix/usbdk) + # UsbDk UsbDk (USB Development Kit) is a open-source library for Windows meant 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; };