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