From 4566ccdac0710588f80bcdfa68ccdd91d9cfde64 Mon Sep 17 00:00:00 2001 From: Dmitry Fleytman Date: Tue, 22 Apr 2014 09:01:16 +0300 Subject: [PATCH] UsbDk: Introduce WDF request forwarding logic Signed-off-by: Dmitry Fleytman --- UsbDk/WdfRequest.cpp | 20 ++++++++++++++++++++ UsbDk/WdfRequest.h | 12 ++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) 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;