windows_winusb.h revision 92a327815bb46a2dd0b38782873df2e54ff13b7c
19a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
21eff220474f63d7ea7f8f99bef2a3da9da5324ebhjelmn@cs.unm.edu * Windows backend for libusb 1.0
3a544e5972bf2b0ac9e006439576f681a8439d311Pete Batard * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>
49a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * With contributions from Michael Plante, Orin Eman et al.
59a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer
69a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Major code testing contribution by Xiaofan Chen
79a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard *
89a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * This library is free software; you can redistribute it and/or
99a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * modify it under the terms of the GNU Lesser General Public
109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * License as published by the Free Software Foundation; either
119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * version 2.1 of the License, or (at your option) any later version.
129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard *
139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * This library is distributed in the hope that it will be useful,
149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * but WITHOUT ANY WARRANTY; without even the implied warranty of
159a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Lesser General Public License for more details.
179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard *
189a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * You should have received a copy of the GNU Lesser General Public
199a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * License along with this library; if not, write to the Free Software
209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma once
249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
25788e433d0a628fc8aa2aca3b23c1f64b16d5f4beToby Gray#include "windows_common.h"
2692a327815bb46a2dd0b38782873df2e54ff13b7cDmitry Fleytman#include "windows_nt_common.h"
27788e433d0a628fc8aa2aca3b23c1f64b16d5f4beToby Gray
289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if defined(_MSC_VER)
299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// disable /W4 MSVC warnings that are benign
30ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:4100)  // unreferenced formal parameter
31ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:4127)  // conditional expression is constant
32ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:4201)  // nameless struct/union
33ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:4214)  // bit field types other than int
34ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:4996)  // deprecated API calls
35ada59db186aa95215158129db8cd42e079daff07Pete Batard#pragma warning(disable:28159) // more deprecated API calls
369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// Missing from MSVC6 setupapi.h
399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(SPDRP_ADDRESS)
409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define SPDRP_ADDRESS	28
419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(SPDRP_INSTALL_STATE)
439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define SPDRP_INSTALL_STATE	34
449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4685e118aca6425108a408c3ce8b55a8d44fcef73cPete Batard// Missing from MinGW
4785e118aca6425108a408c3ce8b55a8d44fcef73cPete Batard#if !defined(FACILITY_SETUPAPI)
4885e118aca6425108a408c3ce8b55a8d44fcef73cPete Batard#define FACILITY_SETUPAPI	15
4985e118aca6425108a408c3ce8b55a8d44fcef73cPete Batard#endif
5085e118aca6425108a408c3ce8b55a8d44fcef73cPete Batard
519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if defined(__CYGWIN__ )
523313f48c107b7c14676f53feba445f2259ac49aeChris Dickens#define _stricmp strcasecmp
53ab8f71c03f8334df7b88a725a730d2020f2e9f80Pete Batard#define _snprintf snprintf
54ab8f71c03f8334df7b88a725a730d2020f2e9f80Pete Batard#define _strdup strdup
559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread
56871d1a471b463f68dce74964f870205bfcdf8136Chris Dickens#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, (LPDWORD)f)
579a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_CTRL_BUFFER_LENGTH      4096
609a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_USB_DEVICES             256
619a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_USB_STRING_LENGTH       128
623fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define MAX_HID_REPORT_SIZE         1024
633fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define MAX_HID_DESCRIPTOR_SIZE     256
649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_GUID_STRING_LENGTH      40
659a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_PATH_LENGTH             128
669a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAX_KEY_LENGTH              256
67116d34f608b02f4e14668450b158acf5db726f95Pete Batard#define LIST_SEPARATOR              ';'
689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
693fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// Handle code for HID interface that have been claimed ("dibs")
703fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define INTERFACE_CLAIMED           ((HANDLE)(intptr_t)0xD1B5)
713fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// Additional return code for HID operations that completed synchronously
723fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_COMPLETED            (LIBUSB_SUCCESS + 1)
733fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
743ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545978.aspx
753ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545972.aspx
763ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545982.aspx
779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER)
789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardconst GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} };
799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
809a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(GUID_DEVINTERFACE_USB_DEVICE)
819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardconst GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };
829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
833ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#if !defined(GUID_DEVINTERFACE_USB_HUB)
843ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stugeconst GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} };
853ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#endif
86f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER)
87f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardconst GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} };
88f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#endif
899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
909a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
929a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Multiple USB API backend support
939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_API_UNSUPPORTED 0
953ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#define USB_API_HUB         1
963ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#define USB_API_COMPOSITE   2
97f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define USB_API_WINUSBX     3
983fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define USB_API_HID         4
993fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define USB_API_MAX         5
100e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard// The following is used to indicate if the HID or composite extra props have already been set.
101e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard#define USB_API_SET         (1<<USB_API_MAX)
1029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
103f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL)
104f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard// Must have the same values as the KUSB_DRVID enum from libusbk.h
105f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define SUB_API_NOTSET      -1
106f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define SUB_API_LIBUSBK     0
107f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define SUB_API_LIBUSB0     1
108f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define SUB_API_WINUSB      2
109f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define SUB_API_MAX         3
110f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
111f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#define WINUSBX_DRV_NAMES   { "libusbK", "libusb0", "WinUSB"}
1129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_usb_api_backend {
1149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const uint8_t id;
115116d34f608b02f4e14668450b158acf5db726f95Pete Batard	const char* designation;
1169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp"
1179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const uint8_t nb_driver_names;
118f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*init)(int sub_api, struct libusb_context *ctx);
119f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*exit)(int sub_api);
120f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*open)(int sub_api, struct libusb_device_handle *dev_handle);
121f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	void (*close)(int sub_api, struct libusb_device_handle *dev_handle);
122f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
123f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
124f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
125f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
126f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
127f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle);
128f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer);
129f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer);
130f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer);
131f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*abort_control)(int sub_api, struct usbi_transfer *itransfer);
132f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer);
133f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
1349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
1359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardextern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX];
1379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define PRINT_UNSUPPORTED_API(fname)              \
1399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	usbi_dbg("unsupported API call for '"         \
1409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		#fname "' (unrecognized device driver)"); \
1419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	return LIBUSB_ERROR_NOT_SUPPORTED;
1429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
1449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * private structures definition
1459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * with inline pseudo constructors/destructors
1469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
1473fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1483fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// TODO (v2+): move hid desc to libusb.h?
1493fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardstruct libusb_hid_descriptor {
1503fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t  bLength;
1513fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t  bDescriptorType;
1523fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t bcdHID;
1533fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t  bCountryCode;
1543fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t  bNumDescriptors;
1553fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t  bClassDescriptorType;
1563fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t wClassDescriptorLength;
1573fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1583fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_DT_HID_SIZE              9
1593fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \
1603fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	+ LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE)
1613fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_MAX_REPORT_SIZE             1024
1623fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_IN_EP                       0x81
1633fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_OUT_EP                      0x02
1643fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F)
1653fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5))
1663fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN)
1673fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type))
1683fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1693fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// The following are used for HID reports IOCTLs
1703fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_CTL_CODE(id) \
1713fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS)
1723fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_BUFFER_CTL_CODE(id) \
1733fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
1743fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_IN_CTL_CODE(id) \
1753fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS)
1763fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_OUT_CTL_CODE(id) \
1773fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
1783fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1793fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define IOCTL_HID_GET_FEATURE                 HID_OUT_CTL_CODE(100)
1803fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define IOCTL_HID_GET_INPUT_REPORT            HID_OUT_CTL_CODE(104)
1813fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define IOCTL_HID_SET_FEATURE                 HID_IN_CTL_CODE(100)
1823fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define IOCTL_HID_SET_OUTPUT_REPORT           HID_IN_CTL_CODE(101)
1833fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1843fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardenum libusb_hid_request_type {
1853fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_REPORT = 0x01,
1863fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_IDLE = 0x02,
1873fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_PROTOCOL = 0x03,
1883fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_REPORT = 0x09,
1893fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_IDLE = 0x0A,
1903fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_PROTOCOL = 0x0B
1913fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1923fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1933fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardenum libusb_hid_report_type {
1943fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_INPUT = 0x01,
1953fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_OUTPUT = 0x02,
1963fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_FEATURE = 0x03
1973fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1983fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1993fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardstruct hid_device_priv {
2003fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t vid;
2013fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t pid;
2023fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t config;
2033fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t nb_interfaces;
2043fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	bool uses_report_ids[3];	// input, ouptput, feature
2053fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t input_report_size;
2063fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t output_report_size;
2073fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t feature_report_size;
2083fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	WCHAR string[3][MAX_USB_STRING_LENGTH];
2093fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t string_index[3];	// man, prod, ser
2103fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
2113fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
2129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_device_priv {
2133ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	uint8_t depth;						// distance to HCD
2143ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	uint8_t port;						// port number on the hub
215e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard	uint8_t active_config;
2163ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	struct libusb_device *parent_dev;	// access to parent is required for usermode ops
2179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct windows_usb_api_backend const *apib;
218e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard	char *path;							// device interface path
219f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int sub_api;						// for WinUSB-like APIs
2209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
2213ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge		char *path;						// each interface needs a device interface path,
2229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support),
223f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard		int sub_api;
2243ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge		int8_t nb_endpoints;			// and a set of endpoint addresses (USB_MAXENDPOINTS)
2259a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		uint8_t *endpoint;
2263fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		bool restricted_functionality;	// indicates if the interface functionality is restricted
2273fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard										// by Windows (eg. HID keyboards or mice cannot do R/W)
2289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} usb_interface[USB_MAXINTERFACES];
2293fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	struct hid_device_priv *hid;
2309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_DEVICE_DESCRIPTOR dev_descriptor;
2313ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	unsigned char **config_descriptor;	// list of pointers to the cached config descriptors
2329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
234d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmstatic inline struct windows_device_priv *_device_priv(struct libusb_device *dev) {
2353ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	return (struct windows_device_priv *)dev->os_priv;
2363ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge}
2373ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge
2383ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stugestatic inline void windows_device_priv_init(libusb_device* dev) {
239d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelm	struct windows_device_priv* p = _device_priv(dev);
2409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int i;
2413ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	p->depth = 0;
2423ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	p->port = 0;
2439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->parent_dev = NULL;
2449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->path = NULL;
2459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->apib = &usb_api_backend[USB_API_UNSUPPORTED];
246f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	p->sub_api = SUB_API_NOTSET;
2473fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	p->hid = NULL;
2489a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->active_config = 0;
2499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->config_descriptor = NULL;
2509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR));
2519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	for (i=0; i<USB_MAXINTERFACES; i++) {
2529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].path = NULL;
2539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED];
254f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard		p->usb_interface[i].sub_api = SUB_API_NOTSET;
2559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].nb_endpoints = 0;
2569a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].endpoint = NULL;
2573fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		p->usb_interface[i].restricted_functionality = false;
2589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2609a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2613ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stugestatic inline void windows_device_priv_release(libusb_device* dev) {
262d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelm	struct windows_device_priv* p = _device_priv(dev);
2639a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int i;
2649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	safe_free(p->path);
2653ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) {
2663ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge		for (i=0; i < dev->num_configurations; i++)
2679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			safe_free(p->config_descriptor[i]);
2689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	safe_free(p->config_descriptor);
2703fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	safe_free(p->hid);
2719a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	for (i=0; i<USB_MAXINTERFACES; i++) {
2729a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		safe_free(p->usb_interface[i].path);
2739a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		safe_free(p->usb_interface[i].endpoint);
2749a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2759a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct interface_handle_t {
2789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	HANDLE dev_handle; // WinUSB needs an extra handle for the file
2799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	HANDLE api_handle; // used by the API to communicate with the device
2809a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_device_handle_priv {
2839a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int active_interface;
2849a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct interface_handle_t interface_handle[USB_MAXINTERFACES];
2859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int autoclaim_count[USB_MAXINTERFACES]; // For auto-release
2869a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2879a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
288d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmstatic inline struct windows_device_handle_priv *_device_handle_priv(
2899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct libusb_device_handle *handle)
2909a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard{
2919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	return (struct windows_device_handle_priv *) handle->os_priv;
2929a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// used for async polling functions
2959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_transfer_priv {
2969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct winfd pollable_fd;
2979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	uint8_t interface_number;
2983fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID
2993fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t *hid_dest;   // transfer buffer destination, required for HID
3003fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	size_t hid_expected_size;
3019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
3029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
303116d34f608b02f4e14668450b158acf5db726f95Pete Batard// used to match a device driver (including filter drivers) against a supported API
304116d34f608b02f4e14668450b158acf5db726f95Pete Batardstruct driver_lookup {
305116d34f608b02f4e14668450b158acf5db726f95Pete Batard	char list[MAX_KEY_LENGTH+1];// REG_MULTI_SZ list of services (driver) names
30616ddfe1ddc487d30c71420c9135f149751cf45d5Tobias Klauser	const DWORD reg_prop;		// SPDRP registry key to use to retrieve list
307116d34f608b02f4e14668450b158acf5db726f95Pete Batard	const char* designation;	// internal designation (for debug output)
308116d34f608b02f4e14668450b158acf5db726f95Pete Batard};
3099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
310ae675c1f49dc00b695fce7296903f60998cc28edPete Batard/* OLE32 dependency */
311ae675c1f49dc00b695fce7296903f60998cc28edPete BatardDLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID));
312ae675c1f49dc00b695fce7296903f60998cc28edPete Batard
313d41802053c4f20691f38072879c9dd76806f0f91Pete Batard/* This call is only available from XP SP2 */
314d41802053c4f20691f38072879c9dd76806f0f91Pete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL));
315d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
316ae675c1f49dc00b695fce7296903f60998cc28edPete Batard/* SetupAPI dependencies */
3179da8cf5c9ed9bd381a77d8170fc0556edbcce4dcPete BatardDLL_DECLARE_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD));
318ae675c1f49dc00b695fce7296903f60998cc28edPete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA));
319ae675c1f49dc00b695fce7296903f60998cc28edPete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA,
32082af9f9d440ef49015652c699157cf62020f097aPete Batard			const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA));
3219da8cf5c9ed9bd381a77d8170fc0556edbcce4dcPete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA,
32282af9f9d440ef49015652c699157cf62020f097aPete Batard			PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA));
323ae675c1f49dc00b695fce7296903f60998cc28edPete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO));
324ae675c1f49dc00b695fce7296903f60998cc28edPete BatardDLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM));
3259da8cf5c9ed9bd381a77d8170fc0556edbcce4dcPete BatardDLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO,
32682af9f9d440ef49015652c699157cf62020f097aPete Batard			PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD));
327f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete BatardDLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD));
3283ccd9bddec316ee4b867959fd7f616eb4d410997Peter StugeDLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD));
3293ccd9bddec316ee4b867959fd7f616eb4d410997Peter StugeDLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY));
3309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3319a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
3329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Windows DDK API definitions. Most of it copied from MinGW's includes
3339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
3349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DWORD DEVNODE, DEVINST;
3359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DEVNODE *PDEVNODE, *PDEVINST;
3369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DWORD RETURN_TYPE;
3371feadb5f78e1d2cdfd2aaf0011e041c2848bae37Pete Batardtypedef RETURN_TYPE CONFIGRET;
3389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define CR_SUCCESS                              0x00000000
3409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define CR_NO_SUCH_DEVNODE                      0x0000000D
3419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_DEVICE_DESCRIPTOR_TYPE              LIBUSB_DT_DEVICE
3439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_CONFIGURATION_DESCRIPTOR_TYPE       LIBUSB_DT_CONFIG
3449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_STRING_DESCRIPTOR_TYPE              LIBUSB_DT_STRING
3459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_INTERFACE_DESCRIPTOR_TYPE           LIBUSB_DT_INTERFACE
3469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_ENDPOINT_DESCRIPTOR_TYPE            LIBUSB_DT_ENDPOINT
3479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3489a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_GET_STATUS                  LIBUSB_REQUEST_GET_STATUS
3499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_CLEAR_FEATURE               LIBUSB_REQUEST_CLEAR_FEATURE
3509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SET_FEATURE                 LIBUSB_REQUEST_SET_FEATURE
3519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SET_ADDRESS                 LIBUSB_REQUEST_SET_ADDRESS
3529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_GET_DESCRIPTOR              LIBUSB_REQUEST_GET_DESCRIPTOR
3539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SET_DESCRIPTOR              LIBUSB_REQUEST_SET_DESCRIPTOR
3549a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_GET_CONFIGURATION           LIBUSB_REQUEST_GET_CONFIGURATION
3559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SET_CONFIGURATION           LIBUSB_REQUEST_SET_CONFIGURATION
3569a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_GET_INTERFACE               LIBUSB_REQUEST_GET_INTERFACE
3579a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SET_INTERFACE               LIBUSB_REQUEST_SET_INTERFACE
3589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_REQUEST_SYNC_FRAME                  LIBUSB_REQUEST_SYNCH_FRAME
3599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3609a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_GET_NODE_INFORMATION                258
3619a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260
3629a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_GET_NODE_CONNECTION_NAME            261
3639a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_GET_HUB_CAPABILITIES                271
3640288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX)
3650288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#define USB_GET_NODE_CONNECTION_INFORMATION_EX  274
3660288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#endif
3679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(USB_GET_HUB_CAPABILITIES_EX)
3689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define USB_GET_HUB_CAPABILITIES_EX             276
3699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
370d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2)
371d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279
372d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#endif
3739a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3749a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef METHOD_BUFFERED
3759a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define METHOD_BUFFERED                         0
3769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_ANY_ACCESS
3789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define FILE_ANY_ACCESS                         0x00000000
3799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3809a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_DEVICE_UNKNOWN
3819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define FILE_DEVICE_UNKNOWN                     0x00000022
3829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3839a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_DEVICE_USB
3849a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define FILE_DEVICE_USB                         FILE_DEVICE_UNKNOWN
3859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3869a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3879a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef CTL_CODE
3889a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define CTL_CODE(DeviceType, Function, Method, Access)( \
3899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
3909a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
392d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USB_CONNECTION_STATUS {
3939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	NoDeviceConnected,
3949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceConnected,
3959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceFailedEnumeration,
3969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceGeneralFailure,
3979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceCausedOvercurrent,
3989a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceNotEnoughPower,
3999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceNotEnoughBandwidth,
4009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceHubNestedTooDeeply,
4019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceInLegacyHub
4029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
4039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
404d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USB_HUB_NODE {
4059a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbHub,
4069a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbMIParent
4079a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_NODE;
4089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/* Cfgmgr32.dll interface */
4109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete BatardDLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG));
4119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete BatardDLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG));
4129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete BatardDLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG));
4139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete BatardDLL_DECLARE(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG));
4149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4159a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \
4169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
4179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4189a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_HUB_CAPABILITIES \
4199a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)
4209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
4229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
4239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_ROOT_HUB_NAME \
4259a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
4269a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4279a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_INFORMATION \
4289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
4299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4300288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
4310288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
4329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
433d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \
434d41802053c4f20691f38072879c9dd76806f0f91Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS)
435d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
4369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
4379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
4389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_NAME \
4409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
4419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// Most of the structures below need to be packed
4439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(push, 1)
4449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
445d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_INTERFACE_DESCRIPTOR {
4469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bLength;
4479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bDescriptorType;
4489a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bInterfaceNumber;
4499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bAlternateSetting;
4509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bNumEndpoints;
4519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bInterfaceClass;
4529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bInterfaceSubClass;
4539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bInterfaceProtocol;
4549a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  iInterface;
4559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
4569a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
457d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT {
4589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
4599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		ULONG ConnectionIndex;
4609a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		struct {
4619a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			UCHAR bmRequest;
4629a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			UCHAR bRequest;
4639a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wValue;
4649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wIndex;
4659a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wLength;
4669a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		} SetupPacket;
4679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} req;
4689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_CONFIGURATION_DESCRIPTOR data;
4699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_CONFIGURATION_DESCRIPTOR_SHORT;
4709a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
471d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ENDPOINT_DESCRIPTOR {
4729a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bLength;
4739a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bDescriptorType;
4749a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bEndpointAddress;
4759a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bmAttributes;
4769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USHORT  wMaxPacketSize;
4779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  bInterval;
4789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
4799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
480d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_DESCRIPTOR_REQUEST {
4819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ConnectionIndex;
4829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
4839a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		UCHAR  bmRequest;
4849a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		UCHAR  bRequest;
4859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USHORT  wValue;
4869a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USHORT  wIndex;
4879a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USHORT  wLength;
4889a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} SetupPacket;
4899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard//	UCHAR  Data[0];
4909a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
4919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
492d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_DESCRIPTOR {
4939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bDescriptorLength;
4949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bDescriptorType;
4959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bNumberOfPorts;
4969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USHORT  wHubCharacteristics;
4979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bPowerOnToPowerGood;
4989a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bHubControlCurrent;
4999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  bRemoveAndPowerMask[64];
5009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;
5019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
502d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ROOT_HUB_NAME {
5039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ActualLength;
5049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR  RootHubName[1];
5059a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
5069a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
507d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ROOT_HUB_NAME_FIXED {
5089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ActualLength;
5099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR RootHubName[MAX_PATH_LENGTH];
5109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ROOT_HUB_NAME_FIXED;
5119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
512d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_NAME {
5139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ConnectionIndex;
5149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ActualLength;
5159a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR  NodeName[1];
5169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
5179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
518d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_NAME_FIXED {
5199a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ConnectionIndex;
5209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ActualLength;
5219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR NodeName[MAX_PATH_LENGTH];
5229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_CONNECTION_NAME_FIXED;
5239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
524d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_NAME_FIXED {
5259a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	union {
5269a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_ROOT_HUB_NAME_FIXED root;
5279a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_NODE_CONNECTION_NAME_FIXED node;
5289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} u;
5299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_NAME_FIXED;
5309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
531d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_INFORMATION {
5329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_HUB_DESCRIPTOR  HubDescriptor;
5339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	BOOLEAN  HubIsBusPowered;
5349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
5359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
536d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_MI_PARENT_INFORMATION {
5379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  ULONG  NumberOfInterfaces;
5389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
5399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
540d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_INFORMATION {
5419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_HUB_NODE  NodeType;
5429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	union {
5439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_HUB_INFORMATION  HubInformation;
5449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_MI_PARENT_INFORMATION  MiParentInformation;
5459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} u;
5469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
5479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
548d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_PIPE_INFO {
5499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_ENDPOINT_DESCRIPTOR  EndpointDescriptor;
5509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ScheduleOffset;
5519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_PIPE_INFO, *PUSB_PIPE_INFO;
5529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
553d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_INFORMATION_EX {
5549a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  ConnectionIndex;
5559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_DEVICE_DESCRIPTOR  DeviceDescriptor;
5569a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UCHAR  CurrentConfigurationValue;
5570288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard	UCHAR  Speed;
5589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	BOOLEAN  DeviceIsHub;
5599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USHORT  DeviceAddress;
5609a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG  NumberOfOpenPipes;
5619a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_CONNECTION_STATUS  ConnectionStatus;
5629a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard//	USB_PIPE_INFO  PipeList[0];
5630288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
5649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
565d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef union _USB_PROTOCOLS {
566d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG  ul;
567d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	struct {
568d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb110:1;
569d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb200:1;
570d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb300:1;
571d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG ReservedMBZ:29;
572d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	};
573d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_PROTOCOLS, *PUSB_PROTOCOLS;
574d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
575d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {
576d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG ul;
577d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	struct {
578d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1;
579d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG DeviceIsSuperSpeedCapableOrHigher:1;
580d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG ReservedMBZ:30;
581d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	};
582d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;
583d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
584d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {
585d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG ConnectionIndex;
586d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG Length;
587d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	USB_PROTOCOLS SupportedUsbProtocols;
588d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;
589d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2;
590d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
591d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAP_FLAGS {
5929a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsHighSpeedCapable:1;
5939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsHighSpeed:1;
5949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsMultiTtCapable:1;
5959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsMultiTt:1;
5969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsRoot:1;
5979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsArmedWakeOnConnect:1;
5989a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ReservedMBZ:26;
5999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS;
6009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
601d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAPABILITIES {
6029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  ULONG  HubIs2xCapable : 1;
6039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
6049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
605d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAPABILITIES_EX {
6069a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_HUB_CAP_FLAGS CapabilityFlags;
6079a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;
6089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(pop)
6109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/* winusb.dll interface */
6129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define SHORT_PACKET_TERMINATE  0x01
6149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define AUTO_CLEAR_STALL        0x02
6159a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define PIPE_TRANSFER_TIMEOUT   0x03
6169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IGNORE_SHORT_PACKETS    0x04
6179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define ALLOW_PARTIAL_READS     0x05
6189a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define AUTO_FLUSH              0x06
6199a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define RAW_IO                  0x07
6209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define MAXIMUM_TRANSFER_SIZE   0x08
6219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define AUTO_SUSPEND            0x81
6229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define SUSPEND_DELAY           0x83
6239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define DEVICE_SPEED            0x01
6249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define LowSpeed                0x01
6259a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define FullSpeed               0x02
6269a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define HighSpeed               0x03
6279a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
628d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USBD_PIPE_TYPE {
6299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeControl,
6309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeIsochronous,
6319a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeBulk,
6329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeInterrupt
6339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USBD_PIPE_TYPE;
6349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef struct {
6369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USBD_PIPE_TYPE PipeType;
6379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR          PipeId;
6389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USHORT         MaximumPacketSize;
6399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR          Interval;
6409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;
6419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(1)
6439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef struct {
6449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  request_type;
6459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  UCHAR  request;
6469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USHORT value;
6479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USHORT index;
6489a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard  USHORT length;
6499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
6509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack()
6519a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE;
6539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
654f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_AbortPipe_t)(
655f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
656f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
657f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
658f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ControlTransfer_t)(
659f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
660f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_SETUP_PACKET SetupPacket,
661f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
662f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
663f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
664f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
665f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
666f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_FlushPipe_t)(
667f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
668f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
669f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
670f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_Free_t)(
671f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle
672f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
673f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)(
674f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
675f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AssociatedInterfaceIndex,
676f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle
677f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
678f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)(
679f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
680f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR AlternateSetting
681f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
682f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetDescriptor_t)(
683f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
684f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR DescriptorType,
685f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR Index,
686f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	USHORT LanguageID,
687f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
688f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
689f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred
690f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
691f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)(
692f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
693f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED lpOverlapped,
694f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPDWORD lpNumberOfBytesTransferred,
695f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	BOOL bWait
696f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
697f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)(
698f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
699f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
700f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
701f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG ValueLength,
702f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
703f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
704f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)(
705f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
706f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
707f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG ValueLength,
708f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
709f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
710f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_Initialize_t)(
711f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	HANDLE DeviceHandle,
712f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_INTERFACE_HANDLE InterfaceHandle
713f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
714f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)(
715f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
716f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG InformationType,
717f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG BufferLength,
718f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Buffer
719f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
720f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)(
721f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
722f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateSettingNumber,
723f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor
724f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
725f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryPipe_t)(
726f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
727f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateInterfaceNumber,
728f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeIndex,
729f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_PIPE_INFORMATION PipeInformation
730f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
731f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ReadPipe_t)(
732f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
733f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
734f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
735f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
736f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
737f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
738f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
739f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ResetPipe_t)(
740f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
741f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
742f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
743f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)(
744f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
745f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateSetting
746f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
747f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)(
748f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
749f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
750f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
751f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG ValueLength,
752f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
753f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
754f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)(
755f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
756f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
757f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG ValueLength,
758f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
759f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
760f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_WritePipe_t)(
761f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
762f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
763f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
764f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
765f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
766f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
767f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
768f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ResetDevice_t)(
769f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle
770f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
771f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
772f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard/* /!\ These must match the ones from the official libusbk.h */
773f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef enum _KUSB_FNID
774f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard{
775f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Init,
776f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Free,
777f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ClaimInterface,
778f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ReleaseInterface,
779f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetAltInterface,
780f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetAltInterface,
781f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetDescriptor,
782f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ControlTransfer,
783f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetPowerPolicy,
784f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetPowerPolicy,
785f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetConfiguration,
786f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetConfiguration,
787f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ResetDevice,
788f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Initialize,
789f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SelectInterface,
790f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetAssociatedInterface,
791f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Clone,
792f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryInterfaceSettings,
793f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryDeviceInformation,
794f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetCurrentAlternateSetting,
795f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetCurrentAlternateSetting,
796f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryPipe,
797f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetPipePolicy,
798f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetPipePolicy,
799f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ReadPipe,
800f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_WritePipe,
801f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ResetPipe,
802f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_AbortPipe,
803f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_FlushPipe,
804f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_IsoReadPipe,
805f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_IsoWritePipe,
806f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetCurrentFrameNumber,
807f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetOverlappedResult,
808f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetProperty,
809f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_COUNT,
810f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard} KUSB_FNID;
811f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
812f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef struct _KLIB_VERSION {
813f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Major;
814f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Minor;
815f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Micro;
816f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Nano;
817f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard} KLIB_VERSION;
818f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef KLIB_VERSION* PKLIB_VERSION;
819f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
820f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *LibK_GetProcAddress_t)(
821f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID* ProcAddress,
822f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG DriverID,
823f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG FunctionID
824f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
825f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
826f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef VOID (WINAPI *LibK_GetVersion_t)(
827f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PKLIB_VERSION Version
828f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
829f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
830f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardstruct winusb_interface {
831f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	bool initialized;
832f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_AbortPipe_t AbortPipe;
833f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ControlTransfer_t ControlTransfer;
834f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_FlushPipe_t FlushPipe;
835f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_Free_t Free;
836f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetAssociatedInterface_t GetAssociatedInterface;
837f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting;
838f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetDescriptor_t GetDescriptor;
839f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetOverlappedResult_t GetOverlappedResult;
840f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetPipePolicy_t GetPipePolicy;
841f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetPowerPolicy_t GetPowerPolicy;
842f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_Initialize_t Initialize;
843f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryDeviceInformation_t QueryDeviceInformation;
844f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings;
845f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryPipe_t QueryPipe;
846f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ReadPipe_t ReadPipe;
847f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ResetPipe_t ResetPipe;
848f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting;
849f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetPipePolicy_t SetPipePolicy;
850f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetPowerPolicy_t SetPowerPolicy;
851f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_WritePipe_t WritePipe;
852f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ResetDevice_t ResetDevice;
853f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard};
8543fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8553fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard/* hid.dll interface */
8563fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8573fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HIDP_STATUS_SUCCESS  0x110000
8583fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef void* PHIDP_PREPARSED_DATA;
8593fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8603fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#pragma pack(1)
8613fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct {
8623fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	ULONG Size;
8633fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT VendorID;
8643fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT ProductID;
8653fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT VersionNumber;
8663fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
8673fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#pragma pack()
8683fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8693fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef USHORT USAGE;
8703fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct {
8713fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USAGE Usage;
8723fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USAGE UsagePage;
8733fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT InputReportByteLength;
8743fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT OutputReportByteLength;
8753fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT FeatureReportByteLength;
8763fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT Reserved[17];
8773fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberLinkCollectionNodes;
8783fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberInputButtonCaps;
8793fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberInputValueCaps;
8803fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberInputDataIndices;
8813fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberOutputButtonCaps;
8823fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberOutputValueCaps;
8833fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberOutputDataIndices;
8843fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberFeatureButtonCaps;
8853fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberFeatureValueCaps;
8863fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT NumberFeatureDataIndices;
8873fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_CAPS, *PHIDP_CAPS;
8883fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8893fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef enum _HIDP_REPORT_TYPE {
8903fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  HidP_Input,
8913fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  HidP_Output,
8923fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  HidP_Feature
8933fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_REPORT_TYPE;
8943fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8953fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct _HIDP_VALUE_CAPS {
8963fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USAGE  UsagePage;
8973fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  UCHAR  ReportID;
8983fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  IsAlias;
8993fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT  BitField;
9003fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT  LinkCollection;
9013fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USAGE  LinkUsage;
9023fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USAGE  LinkUsagePage;
9033fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  IsRange;
9043fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  IsStringRange;
9053fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  IsDesignatorRange;
9063fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  IsAbsolute;
9073fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  BOOLEAN  HasNull;
9083fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  UCHAR  Reserved;
9093fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT  BitSize;
9103fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT  ReportCount;
9113fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  USHORT  Reserved2[5];
9123fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  ULONG  UnitsExp;
9133fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  ULONG  Units;
9143fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  LONG  LogicalMin, LogicalMax;
9153fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard  LONG  PhysicalMin, PhysicalMax;
9163fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	union {
9173fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	  struct {
9183fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USAGE  UsageMin, UsageMax;
9193fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  StringMin, StringMax;
9203fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  DesignatorMin, DesignatorMax;
9213fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  DataIndexMin, DataIndexMax;
9223fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	  } Range;
9233fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	  struct {
9243fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USAGE  Usage, Reserved1;
9253fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  StringIndex, Reserved2;
9263fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  DesignatorIndex, Reserved3;
9273fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		USHORT  DataIndex, Reserved4;
9283fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	  } NotRange;
9293fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	} u;
9303fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;
9313fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
9323fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES));
9333fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID));
9343fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *));
9353fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA));
9363fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG));
9373fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG));
9383fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG));
9393fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS));
9403fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG));
9413fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG));
9423fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG));
9433fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG));
9443fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG));
9453fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG));
9463fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidD_FlushQueue, (HANDLE));
9473fae93a941669be8a87ca49dd09f836d2d9647aaPete BatardDLL_DECLARE(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA));
948