diff --git a/UsbDk/WdfRequest.cpp b/UsbDk/WdfRequest.cpp index 677fee7..8304b8d 100644 --- a/UsbDk/WdfRequest.cpp +++ b/UsbDk/WdfRequest.cpp @@ -1,6 +1,26 @@ #include #include "WdfRequest.h" +NTSTATUS CWdfRequest::SendAndForget(WDFIOTARGET Target) +{ + WDF_REQUEST_SEND_OPTIONS options; + WDF_REQUEST_SEND_OPTIONS_INIT(&options, WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET); + + NTSTATUS status = STATUS_SUCCESS; + + if (WdfRequestSend(m_Request, Target, &options)) + { + Forget(); + } + else + { + status = WdfRequestGetStatus(m_Request); + SetStatus(status); + } + + return status; +} + NTSTATUS CWdfRequest::FetchSafeReadBuffer(WDFMEMORY *Buffer) const { PVOID Ptr; diff --git a/UsbDk/WdfRequest.h b/UsbDk/WdfRequest.h index a5e0d34..9b128a4 100644 --- a/UsbDk/WdfRequest.h +++ b/UsbDk/WdfRequest.h @@ -10,8 +10,11 @@ public: {} ~CWdfRequest() { - WdfRequestSetInformation(m_Request, m_Information); - WdfRequestComplete(m_Request, m_Status); + if (m_Request != WDF_NO_HANDLE) + { + WdfRequestSetInformation(m_Request, m_Information); + WdfRequestComplete(m_Request, m_Status); + } } template @@ -59,10 +62,15 @@ public: WdfRequestGetParameters(m_Request, &Params); } + NTSTATUS SendAndForget(WDFIOTARGET Target); + protected: WDFREQUEST m_Request; private: + void Forget() + { m_Request = WDF_NO_HANDLE; } + NTSTATUS m_Status = STATUS_UNSUCCESSFUL; ULONG_PTR m_Information = 0;