diff --git a/UsbDk/FilterDevice.cpp b/UsbDk/FilterDevice.cpp index 99e99fd..daba0aa 100644 --- a/UsbDk/FilterDevice.cpp +++ b/UsbDk/FilterDevice.cpp @@ -23,7 +23,7 @@ public: CUsbDkFilterDeviceInit(const CUsbDkFilterDeviceInit&) = delete; CUsbDkFilterDeviceInit& operator= (const CUsbDkFilterDeviceInit&) = delete; private: - static CUsbDkFilterDevice::CStrategist &Strategy(WDFDEVICE Device) const + static CUsbDkFilterDevice::CStrategist &Strategy(WDFDEVICE Device) { return UsbDkFilterGetContext(Device)->UsbDkFilter->m_Strategy; } }; @@ -35,6 +35,9 @@ NTSTATUS CUsbDkFilterDeviceInit::Configure() SetPowerCallbacks([](_In_ WDFDEVICE Device) { return Strategy(Device)->MakeAvailable(); }); + SetIoInCallerContextCallback([](_In_ WDFDEVICE Device, WDFREQUEST Request) + { return Strategy(Device)->IoInCallerContext(Device, Request); }); + auto status = SetPreprocessCallback([](_In_ WDFDEVICE Device, _Inout_ PIRP Irp) { return Strategy(Device)->PNPPreProcess(Irp); }, IRP_MJ_PNP); diff --git a/UsbDk/FilterStrategy.cpp b/UsbDk/FilterStrategy.cpp index 3b9a5f4..1bdddfa 100644 --- a/UsbDk/FilterStrategy.cpp +++ b/UsbDk/FilterStrategy.cpp @@ -10,6 +10,15 @@ NTSTATUS CUsbDkFilterStrategy::PNPPreProcess(PIRP Irp) return WdfDeviceWdmDispatchPreprocessedIrp(m_Owner->WdfObject(), Irp); } +void CUsbDkFilterStrategy::IoInCallerContext(WDFDEVICE Device, WDFREQUEST Request) +{ + auto status = WdfDeviceEnqueueRequest(Device, Request); + if (!NT_SUCCESS(status)) + { + WdfRequestComplete(Request, status); + } +} + NTSTATUS CUsbDkFilterStrategy::Create(CUsbDkFilterDevice *Owner) { m_Owner = Owner; diff --git a/UsbDk/FilterStrategy.h b/UsbDk/FilterStrategy.h index bba9142..15dfaec 100644 --- a/UsbDk/FilterStrategy.h +++ b/UsbDk/FilterStrategy.h @@ -1,6 +1,7 @@ #pragma once #include "ntddk.h" +#include "wdf.h" #include "Alloc.h" #include "UsbDkUtil.h" @@ -14,6 +15,7 @@ public: virtual NTSTATUS Create(CUsbDkFilterDevice *Owner); virtual void Delete(); virtual NTSTATUS PNPPreProcess(PIRP Irp); + virtual void IoInCallerContext(WDFDEVICE Device, WDFREQUEST Request); virtual NTSTATUS MakeAvailable() = 0;