static int wince_cancel_transfer(struct usbi_transfer *itransfer) { struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); struct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); if (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT)) return translate_driver_error(GetLastError()); return LIBUSB_SUCCESS; }
static BOOL waitForTransferCompletion( BOOL status, UKW_DEVICE device, OVERLAPPED& overlapped, DWORD& transferred, const DWORD expectedTransferred) { if (!status) { printf("Transfer failed with %d.\n", GetLastError()); return FALSE; } if (!waitForOverlapped(overlapped)) { // Attempt to cancel it if (!UkwCancelTransfer(device, &overlapped, 0)) { printf("Attempt to cancel timed out transfer failed with %d\n", GetLastError()); return FALSE; } printf("Cancelled transfer due to timeout\n"); if (!waitForOverlapped(overlapped)) { printf("Timeout out waiting for cancel to complete\n"); } printf("Transfer cancel completed with: Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d\n", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); return FALSE; } // Check for the overlapped members being as expected if (overlapped.Internal != 0 || overlapped.InternalHigh != expectedTransferred || overlapped.Offset != 0 || overlapped.OffsetHigh != 0) { printf("Overlapped structure not as expected. Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); return FALSE; } if (transferred != expectedTransferred) { printf("Failed to transfer expected bytes, expecting %d, got %d\n", expectedTransferred, transferred); return FALSE; } return TRUE; }
static void startAAPBulkTransfer(char line[]) { char* linePtr = line + 1; // Parse the device index DWORD devIdx = 0; linePtr = parseNumber(linePtr, devIdx); if (!linePtr) { printf("Please provide a decimal device number following the command\n"); return; } if (devIdx >= gDeviceListSize || devIdx < 0) { printf("Invalid device index '%d' provided\n", devIdx); return; } UKW_DEVICE device = gDeviceList[devIdx]; // Find endpoints UCHAR epin, epout; if (!findAAPEndpoints(device, epin, epout)) return; OVERLAPPED overlapped; memset(&overlapped, 0, sizeof(overlapped)); overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (overlapped.hEvent == NULL) { printf("Failed to create event for asynchronous request.\n"); return; } UCHAR buf[16383]; DWORD bytesTransferred; switch (line[0]) { case 'r': { // Read a transfer if (!UkwIssueBulkTransfer(device, UKW_TF_IN_TRANSFER, epin, buf, 16383, &bytesTransferred, &overlapped)) { printf("Failed to read bulk transfer from endpoint %d on device %d: error %d", epin, devIdx, GetLastError()); } else if (waitForOverlapped(overlapped)) { printf("Read %d bytes: [ ", bytesTransferred); for (DWORD i = 0; i < bytesTransferred; i++) { printf("%.02x ", buf[i]); } printf("]\n"); } else { // Attempt to cancel it if (!UkwCancelTransfer(device, &overlapped, 0)) { printf("Attempt to cancel timed out transfer failed with %d\n", GetLastError()); return; } printf("Cancelled transfer due to timeout\n"); if (!waitForOverlapped(overlapped)) { printf("Timeout out waiting for cancel to complete\n"); } printf("Transfer cancel completed with: Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d\n", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); } break; } case 'w': { // Write a AAP handshake bulk transfer UCHAR Handshake[10]; Handshake[0] = 0xff; Handshake[1] = 0xff; Handshake[2] = 0x00; Handshake[3] = 0x00; Handshake[4] = 0x0a; Handshake[5] = 0x0a; Handshake[6] = 'H'; Handshake[7] = 'O'; Handshake[8] = 'S'; Handshake[9] = 'T'; memcpy(buf, Handshake, 10); if (!UkwIssueBulkTransfer(device, UKW_TF_IN_TRANSFER, epout, buf, 10, &bytesTransferred, &overlapped)) { printf("Failed to write bulk transfer from endpoint %d on device %d: error %d", epin, devIdx, GetLastError()); } else if (waitForOverlapped(overlapped)) { printf("Wrote %d bytes\n", bytesTransferred); } else { // Attempt to cancel it if (!UkwCancelTransfer(device, &overlapped, 0)) { printf("Attempt to cancel timed out transfer failed with %d\n", GetLastError()); return; } printf("Cancelled transfer due to timeout\n"); if (!waitForOverlapped(overlapped)) { printf("Timeout out waiting for cancel to complete\n"); } printf("Transfer cancel completed with: Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d\n", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); } break; } default: { printf("Don't know bulk transfer operation '%c', doing nothing\n", line[0]); } } CloseHandle(overlapped.hEvent); }
static void sendControlRequest(char line[]) { // Parse the device index DWORD devIdx = 0; line = parseNumber(line, devIdx); if (!line) { printf("Please provide a decimal device number following the command\n"); return; } if (devIdx >= gDeviceListSize || devIdx < 0) { printf("Invalid device index '%d' provided\n", devIdx); return; } // Parse the option async parameter BOOL async; DWORD asyncval; line = parseNumber(line, asyncval); if (line && asyncval != 0) { printf("Performing control request asynchronously.\n"); async = TRUE; } else { printf("Performing control request synchronously.\n"); async = FALSE; } // Input validated so form the request UKW_DEVICE device = gDeviceList[devIdx]; UKW_CONTROL_HEADER header; OVERLAPPED overlapped; if (async) { memset(&overlapped, 0, sizeof(overlapped)); overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (overlapped.hEvent == NULL) { printf("Failed to create event for asynchronous request.\n"); return; } } DWORD flags = UKW_TF_OUT_TRANSFER; header.bmRequestType = 0x40; header.bRequest = 0xF0; header.wValue = 0x0001; header.wIndex = 0x0000; header.wLength = 0x0000; // Now perform the request DWORD transferred = -1; BOOL status = UkwIssueControlTransfer(device, flags, &header, NULL, 0, &transferred, async ? &overlapped : NULL); if (!status) { printf("Control transfer failed with %d.\n", GetLastError()); return; } if (async) { if (!waitForOverlapped(overlapped)) { // Attempt to cancel it if (!UkwCancelTransfer(device, &overlapped, 0)) { printf("Attempt to cancel timed out transfer failed with %d\n", GetLastError()); goto out; } printf("Cancelled transfer due to timeout\n"); if (!waitForOverlapped(overlapped)) { printf("Timeout out waiting for cancel to complete\n"); goto out; } printf("Transfer cancel completed with: Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d\n", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); goto out; } // Check for the overlapped members being as expected if (overlapped.Internal != 0 || overlapped.InternalHigh != 0 || overlapped.Offset != 0 || overlapped.OffsetHigh != 0) { printf("Overlapped not as expected. Internal: %d InternalHigh: %d Offset: %d OffsetHigh %d\n", overlapped.Internal, overlapped.InternalHigh, overlapped.Offset, overlapped.OffsetHigh); goto out; } } if (transferred != 0) { printf("Transferred data length not updated, was %d\n", transferred); } out: if (async) CloseHandle(overlapped.hEvent); }