15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Windows backend for libusbx 1.0 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright © 2009-2012 Pete Batard <pete@akeo.ie> 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * With contributions from Michael Plante, Orin Eman et al. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Major code testing contribution by Xiaofan Chen 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is free software; you can redistribute it and/or 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modify it under the terms of the GNU Lesser General Public 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License as published by the Free Software Foundation; either 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version 2.1 of the License, or (at your option) any later version. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lesser General Public License for more details. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You should have received a copy of the GNU Lesser General Public 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License along with this library; if not, write to the Free Software 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma once 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "windows_common.h" 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disable /W4 MSVC warnings that are benign 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning(disable:4127) // conditional expression is constant 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning(disable:4100) // unreferenced formal parameter 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning(disable:4214) // bit field types other than int 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma warning(disable:4201) // nameless struct/union 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Missing from MSVC6 setupapi.h 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SPDRP_ADDRESS) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPDRP_ADDRESS 28 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SPDRP_INSTALL_STATE) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPDRP_INSTALL_STATE 34 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CYGWIN__ ) 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define _stricmp stricmp 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cygwin produces a warning unless these prototypes are defined 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int _snprintf(char *buffer, size_t count, const char *format, ...); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern char *_strdup(const char *strSource); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, f) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_CTRL_BUFFER_LENGTH 4096 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_USB_DEVICES 256 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_USB_STRING_LENGTH 128 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define MAX_HID_REPORT_SIZE 1024 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define MAX_HID_DESCRIPTOR_SIZE 256 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_GUID_STRING_LENGTH 40 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_PATH_LENGTH 128 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_KEY_LENGTH 256 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIST_SEPARATOR ';' 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HTAB_SIZE 1021 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Handle code for HID interface that have been claimed ("dibs") 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Additional return code for HID operations that completed synchronously 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) 67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn.microsoft.com/en-us/library/ff545978.aspx 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn.microsoft.com/en-us/library/ff545972.aspx 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn.microsoft.com/en-us/library/ff545982.aspx 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GUID_DEVINTERFACE_USB_DEVICE) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GUID_DEVINTERFACE_USB_HUB) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Multiple USB API backend support 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_API_UNSUPPORTED 0 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_API_HUB 1 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_API_COMPOSITE 2 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define USB_API_WINUSBX 3 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define USB_API_HID 4 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define USB_API_MAX 5 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// The following is used to indicate if the HID or composite extra props have already been set. 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define USB_API_SET (1<<USB_API_MAX) 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Must have the same values as the KUSB_DRVID enum from libusbk.h 99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define SUB_API_NOTSET -1 100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define SUB_API_LIBUSBK 0 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define SUB_API_LIBUSB0 1 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define SUB_API_WINUSB 2 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define SUB_API_MAX 3 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define WINUSBX_DRV_NAMES { "libusbK", "libusb0", "WinUSB"} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct windows_usb_api_backend { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t id; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* designation; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8_t nb_driver_names; 112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*init)(int sub_api, struct libusb_context *ctx); 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*exit)(int sub_api); 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*open)(int sub_api, struct libusb_device_handle *dev_handle); 115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void (*close)(int sub_api, struct libusb_device_handle *dev_handle); 116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); 117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); 122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); 123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); 124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); 125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); 126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); 127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINT_UNSUPPORTED_API(fname) \ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usbi_dbg("unsupported API call for '" \ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #fname "' (unrecognized device driver)"); \ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LIBUSB_ERROR_NOT_SUPPORTED; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * private structures definition 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with inline pseudo constructors/destructors 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// TODO (v2+): move hid desc to libusb.h? 143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct libusb_hid_descriptor { 144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t bLength; 145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t bDescriptorType; 146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t bcdHID; 147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t bCountryCode; 148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t bNumDescriptors; 149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t bClassDescriptorType; 150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t wClassDescriptorLength; 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_DT_HID_SIZE 9 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_MAX_REPORT_SIZE 1024 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_IN_EP 0x81 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_OUT_EP 0x02 158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) 160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) 161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) 162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// The following are used for HID reports IOCTLs 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_CTL_CODE(id) \ 165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) 166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_BUFFER_CTL_CODE(id) \ 167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) 168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_IN_CTL_CODE(id) \ 169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) 170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HID_OUT_CTL_CODE(id) \ 171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) 172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) 174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) 175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) 176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) 177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochenum libusb_hid_request_type { 179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_GET_REPORT = 0x01, 180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_GET_IDLE = 0x02, 181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_GET_PROTOCOL = 0x03, 182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_SET_REPORT = 0x09, 183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_SET_IDLE = 0x0A, 184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REQ_SET_PROTOCOL = 0x0B 185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochenum libusb_hid_report_type { 188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REPORT_TYPE_INPUT = 0x01, 189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REPORT_TYPE_OUTPUT = 0x02, 190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HID_REPORT_TYPE_FEATURE = 0x03 191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct hid_device_priv { 194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t vid; 195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t pid; 196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t config; 197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t nb_interfaces; 198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool uses_report_ids[3]; // input, ouptput, feature 199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t input_report_size; 200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t output_report_size; 201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint16_t feature_report_size; 202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WCHAR string[3][MAX_USB_STRING_LENGTH]; 203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t string_index[3]; // man, prod, ser 204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct windows_device_priv { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t depth; // distance to HCD 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t port; // port number on the hub 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t active_config; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct libusb_device *parent_dev; // access to parent is required for usermode ops 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct windows_usb_api_backend const *apib; 213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch char *path; // device interface path 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int sub_api; // for WinUSB-like APIs 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *path; // each interface needs a device interface path, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), 218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int sub_api; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t *endpoint; 221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool restricted_functionality; // indicates if the interface functionality is restricted 222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // by Windows (eg. HID keyboards or mice cannot do R/W) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } usb_interface[USB_MAXINTERFACES]; 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch struct hid_device_priv *hid; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_DEVICE_DESCRIPTOR dev_descriptor; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char **config_descriptor; // list of pointers to the cached config descriptors 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline struct windows_device_priv *_device_priv(struct libusb_device *dev) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (struct windows_device_priv *)dev->os_priv; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void windows_device_priv_init(libusb_device* dev) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct windows_device_priv* p = _device_priv(dev); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->depth = 0; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->port = 0; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->parent_dev = NULL; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->path = NULL; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; 241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch p->sub_api = SUB_API_NOTSET; 242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch p->hid = NULL; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->active_config = 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->config_descriptor = NULL; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0; i<USB_MAXINTERFACES; i++) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->usb_interface[i].path = NULL; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; 249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch p->usb_interface[i].sub_api = SUB_API_NOTSET; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->usb_interface[i].nb_endpoints = 0; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->usb_interface[i].endpoint = NULL; 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch p->usb_interface[i].restricted_functionality = false; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void windows_device_priv_release(libusb_device* dev) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct windows_device_priv* p = _device_priv(dev); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_free(p->path); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0; i < dev->num_configurations; i++) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_free(p->config_descriptor[i]); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_free(p->config_descriptor); 265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch safe_free(p->hid); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i=0; i<USB_MAXINTERFACES; i++) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_free(p->usb_interface[i].path); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_free(p->usb_interface[i].endpoint); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct interface_handle_t { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE dev_handle; // WinUSB needs an extra handle for the file 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE api_handle; // used by the API to communicate with the device 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct windows_device_handle_priv { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_interface; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct interface_handle_t interface_handle[USB_MAXINTERFACES]; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int autoclaim_count[USB_MAXINTERFACES]; // For auto-release 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline struct windows_device_handle_priv *_device_handle_priv( 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct libusb_device_handle *handle) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (struct windows_device_handle_priv *) handle->os_priv; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used for async polling functions 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct windows_transfer_priv { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct winfd pollable_fd; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t interface_number; 293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID 294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint8_t *hid_dest; // transfer buffer destination, required for HID 295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t hid_expected_size; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used to match a device driver (including filter drivers) against a supported API 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct driver_lookup { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char list[MAX_KEY_LENGTH+1];// REG_MULTI_SZ list of services (driver) names 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DWORD reg_prop; // SPDRP registry key to use to retreive list 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* designation; // internal designation (for debug output) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* OLE32 dependency */ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* SetupAPI dependencies */ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); 319ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Windows DDK API definitions. Most of it copied from MinGW's includes 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef DWORD DEVNODE, DEVINST; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef DEVNODE *PDEVNODE, *PDEVINST; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef DWORD RETURN_TYPE; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef RETURN_TYPE CONFIGRET; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CR_SUCCESS 0x00000000 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CR_NO_SUCH_DEVNODE 0x0000000D 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_NODE_INFORMATION 258 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_NODE_CONNECTION_NAME 261 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_HUB_CAPABILITIES 271 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USB_GET_HUB_CAPABILITIES_EX) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define USB_GET_HUB_CAPABILITIES_EX 276 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef METHOD_BUFFERED 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define METHOD_BUFFERED 0 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef FILE_ANY_ACCESS 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FILE_ANY_ACCESS 0x00000000 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef FILE_DEVICE_UNKNOWN 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FILE_DEVICE_UNKNOWN 0x00000022 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef FILE_DEVICE_USB 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CTL_CODE 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CTL_CODE(DeviceType, Function, Method, Access)( \ 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum USB_CONNECTION_STATUS { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoDeviceConnected, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceConnected, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceFailedEnumeration, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceGeneralFailure, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceCausedOvercurrent, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceNotEnoughPower, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceNotEnoughBandwidth, 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceHubNestedTooDeeply, 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceInLegacyHub 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum USB_HUB_NODE { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbHub, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbMIParent 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_NODE; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Cfgmgr32.dll interface */ 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_HUB_CAPABILITIES \ 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_ROOT_HUB_NAME \ 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_NODE_INFORMATION \ 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Most of the structures below need to be packed 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(push, 1) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_INTERFACE_DESCRIPTOR { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bLength; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bDescriptorType; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bInterfaceNumber; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bAlternateSetting; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bNumEndpoints; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bInterfaceClass; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bInterfaceSubClass; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bInterfaceProtocol; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR iInterface; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_CONFIGURATION_DESCRIPTOR { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bLength; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bDescriptorType; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wTotalLength; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bNumInterfaces; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bConfigurationValue; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR iConfiguration; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bmAttributes; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR MaxPower; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ConnectionIndex; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bmRequest; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bRequest; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wValue; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wIndex; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wLength; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } SetupPacket; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } req; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_CONFIGURATION_DESCRIPTOR data; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_CONFIGURATION_DESCRIPTOR_SHORT; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_ENDPOINT_DESCRIPTOR { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bLength; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bDescriptorType; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bEndpointAddress; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bmAttributes; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wMaxPacketSize; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bInterval; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_DESCRIPTOR_REQUEST { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ConnectionIndex; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bmRequest; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bRequest; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wValue; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wIndex; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wLength; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } SetupPacket; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UCHAR Data[0]; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_DESCRIPTOR { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bDescriptorLength; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bDescriptorType; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bNumberOfPorts; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT wHubCharacteristics; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bPowerOnToPowerGood; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bHubControlCurrent; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR bRemoveAndPowerMask[64]; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_ROOT_HUB_NAME { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ActualLength; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WCHAR RootHubName[1]; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_ROOT_HUB_NAME_FIXED { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ActualLength; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WCHAR RootHubName[MAX_PATH_LENGTH]; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_ROOT_HUB_NAME_FIXED; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_NODE_CONNECTION_NAME { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ConnectionIndex; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ActualLength; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WCHAR NodeName[1]; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_NODE_CONNECTION_NAME_FIXED { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ConnectionIndex; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ActualLength; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WCHAR NodeName[MAX_PATH_LENGTH]; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_NODE_CONNECTION_NAME_FIXED; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_NAME_FIXED { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_ROOT_HUB_NAME_FIXED root; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_NODE_CONNECTION_NAME_FIXED node; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } u; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_NAME_FIXED; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_INFORMATION { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_HUB_DESCRIPTOR HubDescriptor; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOLEAN HubIsBusPowered; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_MI_PARENT_INFORMATION { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG NumberOfInterfaces; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_NODE_INFORMATION { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_HUB_NODE NodeType; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_HUB_INFORMATION HubInformation; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_MI_PARENT_INFORMATION MiParentInformation; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } u; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_PIPE_INFO { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ScheduleOffset; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_PIPE_INFO, *PUSB_PIPE_INFO; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_NODE_CONNECTION_INFORMATION_EX { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ConnectionIndex; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_DEVICE_DESCRIPTOR DeviceDescriptor; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR CurrentConfigurationValue; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR Speed; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOLEAN DeviceIsHub; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT DeviceAddress; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG NumberOfOpenPipes; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_CONNECTION_STATUS ConnectionStatus; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// USB_PIPE_INFO PipeList[0]; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_CAP_FLAGS { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsHighSpeedCapable:1; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsHighSpeed:1; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsMultiTtCapable:1; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsMultiTt:1; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsRoot:1; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIsArmedWakeOnConnect:1; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG ReservedMBZ:26; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_CAPABILITIES { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ULONG HubIs2xCapable : 1; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct USB_HUB_CAPABILITIES_EX { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USB_HUB_CAP_FLAGS CapabilityFlags; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(pop) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* winusb.dll interface */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SHORT_PACKET_TERMINATE 0x01 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define AUTO_CLEAR_STALL 0x02 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PIPE_TRANSFER_TIMEOUT 0x03 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IGNORE_SHORT_PACKETS 0x04 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ALLOW_PARTIAL_READS 0x05 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define AUTO_FLUSH 0x06 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RAW_IO 0x07 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAXIMUM_TRANSFER_SIZE 0x08 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define AUTO_SUSPEND 0x81 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SUSPEND_DELAY 0x83 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVICE_SPEED 0x01 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LowSpeed 0x01 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FullSpeed 0x02 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HighSpeed 0x03 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum USBD_PIPE_TYPE { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbdPipeTypeControl, 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbdPipeTypeIsochronous, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbdPipeTypeBulk, 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UsbdPipeTypeInterrupt 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} USBD_PIPE_TYPE; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USBD_PIPE_TYPE PipeType; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR PipeId; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT MaximumPacketSize; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR Interval; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack(1) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR request_type; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UCHAR request; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT value; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT index; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USHORT length; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma pack() 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_AbortPipe_t)( 626ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 627ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID 628ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 629ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( 630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_SETUP_PACKET SetupPacket, 632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUCHAR Buffer, 633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG BufferLength, 634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG LengthTransferred, 635ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LPOVERLAPPED Overlapped 636ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 637ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_FlushPipe_t)( 638ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 639ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID 640ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 641ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_Free_t)( 642ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle 643ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 644ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( 645ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 646ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR AssociatedInterfaceIndex, 647ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle 648ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 649ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( 650ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 651ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUCHAR AlternateSetting 652ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 653ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( 654ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 655ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR DescriptorType, 656ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR Index, 657ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT LanguageID, 658ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUCHAR Buffer, 659ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG BufferLength, 660ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG LengthTransferred 661ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 662ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( 663ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 664ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LPOVERLAPPED lpOverlapped, 665ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LPDWORD lpNumberOfBytesTransferred, 666ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOL bWait 667ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 668ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( 669ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 670ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID, 671ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG PolicyType, 672ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG ValueLength, 673ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID Value 674ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( 676ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG PolicyType, 678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG ValueLength, 679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID Value 680ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_Initialize_t)( 682ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HANDLE DeviceHandle, 683ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PWINUSB_INTERFACE_HANDLE InterfaceHandle 684ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 685ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( 686ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 687ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG InformationType, 688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG BufferLength, 689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID Buffer 690ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 691ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( 692ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 693ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR AlternateSettingNumber, 694ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor 695ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 696ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_QueryPipe_t)( 697ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR AlternateInterfaceNumber, 699ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeIndex, 700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PWINUSB_PIPE_INFORMATION PipeInformation 701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 702ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_ReadPipe_t)( 703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 704ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID, 705ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUCHAR Buffer, 706ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG BufferLength, 707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG LengthTransferred, 708ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LPOVERLAPPED Overlapped 709ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 710ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_ResetPipe_t)( 711ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 712ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID 713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 714ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( 715ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 716ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR AlternateSetting 717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( 719ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID, 721ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG PolicyType, 722ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG ValueLength, 723ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID Value 724ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 725ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( 726ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 727ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG PolicyType, 728ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG ValueLength, 729ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID Value 730ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 731ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_WritePipe_t)( 732ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle, 733ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR PipeID, 734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PUCHAR Buffer, 735ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG BufferLength, 736ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PULONG LengthTransferred, 737ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LPOVERLAPPED Overlapped 738ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 739ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *WinUsb_ResetDevice_t)( 740ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WINUSB_INTERFACE_HANDLE InterfaceHandle 741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 742ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* /!\ These must match the ones from the official libusbk.h */ 744ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef enum _KUSB_FNID 745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch{ 746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_Init, 747ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_Free, 748ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ClaimInterface, 749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ReleaseInterface, 750ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SetAltInterface, 751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetAltInterface, 752ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetDescriptor, 753ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ControlTransfer, 754ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SetPowerPolicy, 755ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetPowerPolicy, 756ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SetConfiguration, 757ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetConfiguration, 758ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ResetDevice, 759ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_Initialize, 760ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SelectInterface, 761ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetAssociatedInterface, 762ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_Clone, 763ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_QueryInterfaceSettings, 764ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_QueryDeviceInformation, 765ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SetCurrentAlternateSetting, 766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetCurrentAlternateSetting, 767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_QueryPipe, 768ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_SetPipePolicy, 769ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetPipePolicy, 770ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ReadPipe, 771ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_WritePipe, 772ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_ResetPipe, 773ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_AbortPipe, 774ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_FlushPipe, 775ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_IsoReadPipe, 776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_IsoWritePipe, 777ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetCurrentFrameNumber, 778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetOverlappedResult, 779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_GetProperty, 780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch KUSB_FNID_COUNT, 781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} KUSB_FNID; 782ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef struct _KLIB_VERSION { 784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INT Major; 785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INT Minor; 786ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INT Micro; 787ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INT Nano; 788ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} KLIB_VERSION; 789ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef KLIB_VERSION* PKLIB_VERSION; 790ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 791ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef BOOL (WINAPI *LibK_GetProcAddress_t)( 792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PVOID* ProcAddress, 793ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG DriverID, 794ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG FunctionID 795ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 796ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 797ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef VOID (WINAPI *LibK_GetVersion_t)( 798ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PKLIB_VERSION Version 799ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch); 800ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct winusb_interface { 802ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool initialized; 803ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_AbortPipe_t AbortPipe; 804ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_ControlTransfer_t ControlTransfer; 805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_FlushPipe_t FlushPipe; 806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_Free_t Free; 807ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetAssociatedInterface_t GetAssociatedInterface; 808ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; 809ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetDescriptor_t GetDescriptor; 810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetOverlappedResult_t GetOverlappedResult; 811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetPipePolicy_t GetPipePolicy; 812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_GetPowerPolicy_t GetPowerPolicy; 813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_Initialize_t Initialize; 814ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_QueryDeviceInformation_t QueryDeviceInformation; 815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; 816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_QueryPipe_t QueryPipe; 817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_ReadPipe_t ReadPipe; 818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_ResetPipe_t ResetPipe; 819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; 820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_SetPipePolicy_t SetPipePolicy; 821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_SetPowerPolicy_t SetPowerPolicy; 822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_WritePipe_t WritePipe; 823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WinUsb_ResetDevice_t ResetDevice; 824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 825ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 826ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* hid.dll interface */ 827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define HIDP_STATUS_SUCCESS 0x110000 829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef void* PHIDP_PREPARSED_DATA; 830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#pragma pack(1) 832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef struct { 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG Size; 834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT VendorID; 835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT ProductID; 836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT VersionNumber; 837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; 838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#pragma pack() 839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef USHORT USAGE; 841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef struct { 842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE Usage; 843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE UsagePage; 844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT InputReportByteLength; 845ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT OutputReportByteLength; 846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT FeatureReportByteLength; 847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT Reserved[17]; 848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberLinkCollectionNodes; 849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberInputButtonCaps; 850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberInputValueCaps; 851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberInputDataIndices; 852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberOutputButtonCaps; 853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberOutputValueCaps; 854ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberOutputDataIndices; 855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberFeatureButtonCaps; 856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberFeatureValueCaps; 857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT NumberFeatureDataIndices; 858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} HIDP_CAPS, *PHIDP_CAPS; 859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef enum _HIDP_REPORT_TYPE { 861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HidP_Input, 862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HidP_Output, 863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HidP_Feature 864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} HIDP_REPORT_TYPE; 865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef struct _HIDP_VALUE_CAPS { 867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE UsagePage; 868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR ReportID; 869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN IsAlias; 870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT BitField; 871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT LinkCollection; 872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE LinkUsage; 873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE LinkUsagePage; 874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN IsRange; 875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN IsStringRange; 876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN IsDesignatorRange; 877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN IsAbsolute; 878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch BOOLEAN HasNull; 879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UCHAR Reserved; 880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT BitSize; 881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT ReportCount; 882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT Reserved2[5]; 883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG UnitsExp; 884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ULONG Units; 885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LONG LogicalMin, LogicalMax; 886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LONG PhysicalMin, PhysicalMax; 887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch union { 888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch struct { 889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE UsageMin, UsageMax; 890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT StringMin, StringMax; 891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT DesignatorMin, DesignatorMax; 892ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT DataIndexMin, DataIndexMax; 893ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } Range; 894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch struct { 895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USAGE Usage, Reserved1; 896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT StringIndex, Reserved2; 897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT DesignatorIndex, Reserved3; 898ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch USHORT DataIndex, Reserved4; 899ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } NotRange; 900ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } u; 901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; 902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); 904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); 905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *)); 906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); 907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); 908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); 909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); 910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); 911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); 912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); 913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); 914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); 915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); 916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); 917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); 918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochDLL_DECLARE(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); 919