static void printDeviceList() { printf("\n%d available devices:\n", gDeviceListSize); for(DWORD i = 0; i < gDeviceListSize; ++i) { printf("Device % 3d: ", i); UKW_DEVICE dev = gDeviceList[i]; unsigned char bus, devAddr; unsigned long sessionId; if (!UkwGetDeviceAddress(dev, &bus, &devAddr, &sessionId)) { printf("Failed to retrieve address\n"); continue; } printf("bus %d, device address %d, session id %d\n", bus, devAddr, sessionId); printf("\t"); UKW_DEVICE_DESCRIPTOR desc; if (!UkwGetDeviceDescriptor(dev, &desc)) { printf("Failed to retrieve device descriptor\n"); continue; } printf("vid: 0x%04x pid: 0x%04x\n", desc.idVendor, desc.idProduct); } printf("\n"); }
static int wince_get_device_list( struct libusb_context *ctx, struct discovered_devs **discdevs) { UKW_DEVICE devices[MAX_DEVICE_COUNT]; struct discovered_devs * new_devices = *discdevs; DWORD count = 0, i; struct libusb_device *dev = NULL; unsigned char bus_addr, dev_addr; unsigned long session_id; BOOL success; DWORD release_list_offset = 0; int r = LIBUSB_SUCCESS; success = UkwGetDeviceList(driver_handle, devices, MAX_DEVICE_COUNT, &count); if (!success) { int libusbErr = translate_driver_error(GetLastError()); usbi_err(ctx, "could not get devices: %s", windows_error_str(0)); return libusbErr; } for(i = 0; i < count; ++i) { release_list_offset = i; success = UkwGetDeviceAddress(devices[i], &bus_addr, &dev_addr, &session_id); if (!success) { r = translate_driver_error(GetLastError()); usbi_err(ctx, "could not get device address for %d: %s", i, windows_error_str(0)); goto err_out; } dev = usbi_get_device_by_session_id(ctx, session_id); if (dev) { usbi_dbg("using existing device for %d/%d (session %ld)", bus_addr, dev_addr, session_id); libusb_ref_device(dev); // Release just this element in the device list (as we already hold a // reference to it). UkwReleaseDeviceList(driver_handle, &devices[i], 1); release_list_offset++; } else { usbi_dbg("allocating new device for %d/%d (session %ld)", bus_addr, dev_addr, session_id); dev = usbi_alloc_device(ctx, session_id); if (!dev) { r = LIBUSB_ERROR_NO_MEM; goto err_out; } r = init_device(dev, devices[i], bus_addr, dev_addr); if (r < 0) goto err_out; r = usbi_sanitize_device(dev); if (r < 0) goto err_out; } new_devices = discovered_devs_append(new_devices, dev); if (!discdevs) { r = LIBUSB_ERROR_NO_MEM; goto err_out; } safe_unref_device(dev); } *discdevs = new_devices; return r; err_out: *discdevs = new_devices; safe_unref_device(dev); // Release the remainder of the unprocessed device list. // The devices added to new_devices already will still be passed up to libusb, // which can dispose of them at its leisure. UkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset); return r; }