UsbDk: WdfRequest: add generic request processor based on memory objects

Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
Dmitry Fleytman 2014-04-23 16:32:51 +03:00
parent 6708ad11c3
commit 5edf49500b

View file

@ -29,6 +29,18 @@ public:
return WdfRequestRetrieveOutputBuffer(m_Request, sizeof(*objectPtr), (PVOID *)&objectPtr, Length);
}
template <typename TObject>
NTSTATUS FetchInputMemory(WDFMEMORY *Memory)
{
return WdfRequestRetrieveInputMemory(m_Request, Memory);
}
template <typename TObject>
NTSTATUS FetchOutputMemory(WDFMEMORY *Memory)
{
return WdfRequestRetrieveOutputMemory(m_Request, Memory);
}
template <typename TObject>
NTSTATUS FetchInputArray(TObject &arrayPtr, size_t &numElements)
{
@ -155,3 +167,34 @@ static void UsbDkHandleRequestWithOutput(CWdfRequest &Request,
Request.SetOutputDataLen(outputLength);
Request.SetStatus(status);
}
template <typename THandler>
static void UsbDkHandleRequestWithIOMemory(CWdfRequest &Request,
THandler Handler)
{
WDFMEMORY output;
auto status = Request.FetchOutputMemory(&output);
if (!NT_SUCCESS(status))
{
Request.SetOutputDataLen(0);
Request.SetStatus(status);
return;
}
WDFMEMORY input;
status = Request.FetchInputMemory(&input);
if (!NT_SUCCESS(status))
{
Request.SetOutputDataLen(0);
Request.SetStatus(status);
return;
}
size_t outputLength;
status = Handler(input, output, outputLength);
Request.SetOutputDataLen(outputLength);
Request.SetStatus(status);
}