Beispiel #1
0
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);
}