Hi All,
Calling WdfDeviceInitSetIoType(pDeviceInit, WdfDeviceIoDirect) can fix this issue, but later the read complete routine returns the IoStatus = 0xc0000061.
kd> dx -r1 (*((logi_generic_hid_filter!_IO_STATUS_BLOCK *)0xffffd78df8a6b6a0))
(*((logi_generic_hid_filter!_IO_STATUS_BLOCK *)0xffffd78df8a6b6a0)) [Type: _IO_STATUS_BLOCK]
[+0x000] Status : -1073741727 [Type: long]
[+0x000] Pointer : 0xc0000061 [Type: void *]
[+0x008] Information : 0x0 [Type: unsigned __int64]
The code to forward the request as below:
VOID
LSaiHid_EvtIoReadFromRawPdo(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
NTSTATUS status = STATUS_SUCCESS;
WDFDEVICE hDevice = WdfIoQueueGetDevice(Queue);
WDFIOTARGET hIoTarget = WdfDeviceGetIoTarget(hDevice);
WDFMEMORY hMemory = NULL;
UNREFERENCED_PARAMETER(Length);
PAGED_CODE();
status = WdfRequestRetrieveOutputMemory(Request, &hMemory);
status = WdfIoTargetFormatRequestForRead(hIoTarget, Request, hMemory, NULL, NULL);
// WdfRequestFormatRequestUsingCurrentType(Request);
LSaiHid_ForwardRequestWithCompletionRoutine(
Request,
WdfDeviceGetIoTarget(hDevice),
LSaiHid_EvtIoReadCompleteFromRawPdo,
NULL
);
}
VOID
LSaiHid_EvtIoReadCompleteFromRawPdo(
IN WDFREQUEST Request,
IN WDFIOTARGET Target,
IN PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
IN WDFCONTEXT Context
)
{
UNREFERENCED_PARAMETER(Target);
UNREFERENCED_PARAMETER(Context);
WdfRequestCompleteWithInformation(Request, CompletionParams->IoStatus.Status, CompletionParams->IoStatus.Information);
}
VOID
LSaiHid_ForwardRequest(
IN WDFREQUEST Request,
IN WDFIOTARGET Target
)
{
NTSTATUS status = STATUS_SUCCESS;
BOOLEAN bRetVal = FALSE;
WDF_REQUEST_SEND_OPTIONS options = { 0 };
LSaiTraceFuncEntry();
//
// We are not interested in post processing the IRP so fire and forget.
//
WDF_REQUEST_SEND_OPTIONS_INIT(&options, WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET);
bRetVal = WdfRequestSend(Request, Target, &options);
if (bRetVal == FALSE)
{
status = WdfRequestGetStatus(Request);
LSaiTrace(TRACE_LEVEL_ERROR, LSH_IO, “WdfRequestSend failed: %!STATUS!”, status);
WdfRequestComplete(Request, status);
}
LSaiTraceFuncExit();
}