static int wince_clear_halt( struct libusb_device_handle *handle, unsigned char endpoint) { struct wince_device_priv *priv = _device_priv(handle->dev); if (!UkwClearHaltHost(priv->dev, endpoint)) { return translate_driver_error(GetLastError()); } if (!UkwClearHaltDevice(priv->dev, endpoint)) { return translate_driver_error(GetLastError()); } return LIBUSB_SUCCESS; }
static void performHaltOperation(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; } DWORD endpoint = 0; linePtr = parseNumber(linePtr, endpoint); if (!linePtr) { printf("Please provide a decimal endpoint number following the command\n"); return; } if (devIdx >= gDeviceListSize || devIdx < 0) { printf("Invalid device index '%d' provided\n", devIdx); return; } if (endpoint >= UCHAR_MAX || endpoint < 0) { printf("Invalid endpoint '%d' provided\n", endpoint); return; } UKW_DEVICE device = gDeviceList[devIdx]; UCHAR ep = static_cast<UCHAR>(endpoint); switch (line[0]) { case 'q': { BOOL halted = FALSE; BOOL result = UkwIsPipeHalted(device, ep, &halted); if (!result) { printf("Failed to retrieve pipe halted status on endpoint %d on device %d: %d\n", ep, devIdx, GetLastError()); } else { printf("Halted status on endpoint %d on device %d is %d\n", ep, devIdx, halted); } break; } case 'c': { BOOL result = UkwClearHaltHost(device, ep); if (!result) { printf("Failed to clear halt/stall (host) on endpoint %d on device %d: %d\n", ep, devIdx, GetLastError()); } else { printf("Cleared halt/stall (host) on endpoint %d successfully\n", ep); } break; } case 's': { BOOL result = UkwClearHaltDevice(device, ep); if (!result) { printf("Failed to clear halt/stall (device) on endpoint %d on device %d: %d\n", ep, devIdx, GetLastError()); } else { printf("Cleared halt/stall (device) on endpoint %d successfully\n", ep); } break; } default: printf("Unknown halt operation provided\n"); break; } }