Hi All,
I’m handling a strange issue on the bulk transfer. I have a USB driver installing as the function driver of the USB device. It’s the bulk interface with one IN pipe and one out pipe. After configuring the device properly, the driver creates two queues one for EvtIoRead and one for EvtIoWrite. Meanwhile, I have an application talking to the driver and sending data to the bulk out endpoint. After the application calls the API WriteFile, the EvtIoWrite gets called and it forwards the original request to next level after formatting it with calling WdfUsbTargetPipeFormatRequestForWrite. However, I don’t see the completion routine gets called after that. It causes the application hangs there because I call the WriteFile synchronously. The out pipe handle is valid and the packet length is less than the maximum packet size. Does anyone know why and how can I solve it? Is it because I forward the original request instead of creating a new request? Thanks!
HRESULT CDevice::WriteDataToFip(const void* pvData, DWORD cbData)
{
WriteFile(m_fip_handle, pvData, cbData, &written, NULL))
}
The EvtIoWrite is as below:
void CDeviceExtension::EvtIoWrite(IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t Length)
{
WDFMEMORY memory;
NTSTATUS status = WdfRequestRetrieveInputMemory(Request, &memory);
if (NT_SUCCESS(status))
{
CDeviceExtension* pThis = GetContext_CDeviceExtension(WdfIoQueueGetDevice(Queue));
WDFMEMORY_OFFSET offset;
offset.BufferOffset = 0;
offset.BufferLength = (Length > pThis->m_write_size) ? pThis->m_write_size : Length;
status = WdfUsbTargetPipeFormatRequestForWrite( pThis->m_out, Request, memory, &offset);
if (NT_SUCCESS(status))
{
SRequestContext* pCtxt = GetContext_SRequestContext(Request);
pCtxt->bytesNotYetTransfered = (ULONG)(Length - offset.BufferLength);
pCtxt->bytesTransfered = 0;
pCtxt->MaxPacketLength = (ULONG)pThis->m_write_size;
// Send the request asynchronously.
//
WdfRequestSetCompletionRoutine(Request, EvtRequestWriteComplete, NULL);
if (WdfRequestSend(Request, WdfUsbTargetPipeGetIoTarget(pThis->m_out), WDF_NO_SEND_OPTIONS) == FALSE)
{
status = WdfRequestGetStatus(Request);
}
}
}
}
if (!NT_SUCCESS(status))
{
WdfRequestCompleteWithInformation(Request, status, 0);
}
}
Also, I got the !wdfkd.wdflogdump as below:
0: kd> !wdflogdump SaiDA2AE.sys
Trace searchpath is:
Trace format prefix is: %7!u!: %!FUNC! -
Trying to extract TMF information from - C:\symstore\Wdf01000.pdb\910864B4254D480C94ABAE23F3EBE0662\Wdf01000.pdb
Gather log: Please wait, this may take a moment (reading 4024 bytes).
% read so far … 10, 20, 30, 100
There are 28 log entries
— start of log —
1: FxIFRStart - FxIFR logging started
2: FxPkgPnp::PnpEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering PnP State WdfDevStatePnpInit from WdfDevStatePnpObjectCreated
3: FxPkgPnp::Dispatch - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900, IRP_MJ_PNP, 0x00000000(IRP_MN_START_DEVICE) IRP 0xFFFFE00169127410
4: FxPkgPnp::PnpEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering PnP State WdfDevStatePnpInitStarting from WdfDevStatePnpInit
5: FxPkgPnp::PnpEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering PnP State WdfDevStatePnpHardwareAvailable from WdfDevStatePnpInitStarting
6: FxIoTarget::SubmitLocked - ignoring WDFIOTARGET 00001FFE96E57C18 state, sending WDFREQUEST FFFFD00022822CA0, state WdfIoTargetStarted
7: FxPkgPnp::PowerPolicyEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power policy state WdfDevStatePwrPolStarting from WdfDevStatePwrPolObjectCreated
8: FxPowerIdleMachine::ProcessEventLocked - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power idle state FxIdleStarted from FxIdleStopped
9: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerStartingCheckDeviceType from WdfDevStatePowerObjectCreated
10: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerD0Starting from WdfDevStatePowerStartingCheckDeviceType
11: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerD0StartingConnectInterrupt from WdfDevStatePowerD0Starting
12: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerD0StartingDmaEnable from WdfDevStatePowerD0StartingConnectInterrupt
13: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerD0StartingStartSelfManagedIo from WdfDevStatePowerD0StartingDmaEnable
14: FxPkgIo::ResumeProcessingForPower - Power resume all queues of WDFDEVICE 0x00001FFE96E873D8
15: FxPowerIdleMachine::ProcessEventLocked - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power idle state FxIdleStartedPowerUp from FxIdleStarted
16: FxPowerIdleMachine::ProcessEventLocked - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power idle state FxIdleDisabled from FxIdleStartedPowerUp
17: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerDecideD0State from WdfDevStatePowerD0StartingStartSelfManagedIo
18: FxPkgPnp::PowerEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering Power State WdfDevStatePowerD0 from WdfDevStatePowerDecideD0State
19: FxPkgPnp::PowerPolicyEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power policy state WdfDevStatePwrPolStartingPoweredUp from WdfDevStatePwrPolStarting
20: FxPkgPnp::PowerPolicyEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power policy state WdfDevStatePwrPolStartingSucceeded from WdfDevStatePwrPolStartingPoweredUp
21: FxPkgPnp::PowerPolicyEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power policy state WdfDevStatePwrPolStartingDecideS0Wake from WdfDevStatePwrPolStartingSucceeded
22: FxPkgPnp::PowerPolicyEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power policy state WdfDevStatePwrPolStarted from WdfDevStatePwrPolStartingDecideS0Wake
23: FxPowerIdleMachine::ProcessEventLocked - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering power idle state FxIdleDisabled from FxIdleDisabled
24: FxPkgPnp::PnpEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering PnP State WdfDevStatePnpEnableInterfaces from WdfDevStatePnpHardwareAvailable
25: FxPkgPnp::PnpEnterNewState - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 entering PnP State WdfDevStatePnpStarted from WdfDevStatePnpEnableInterfaces
26: FxPkgPnp::Dispatch - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900, IRP_MJ_PNP, 0x00000014(IRP_MN_QUERY_PNP_DEVICE_STATE) IRP 0xFFFFE00169127410
27: FxPkgFdo::HandleQueryPnpDeviceStateCompletion - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900 returning PNP_DEVICE_STATE 0x0 IRP 0xFFFFE00169127410
28: FxPkgPnp::Dispatch - WDFDEVICE 0x00001FFE96E873D8 !devobj 0xFFFFE001690C7900, IRP_MJ_PNP, 0x00000007(IRP_MN_QUERY_DEVICE_RELATIONS) type BusRelations IRP 0xFFFFE0016AF34AB0
---- end of log ----