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)
40a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#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
46a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_CTRL_BUFFER_LENGTH	4096
47a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_USB_DEVICES		256
48a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_USB_STRING_LENGTH	128
49a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_HID_REPORT_SIZE	1024
50a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_HID_DESCRIPTOR_SIZE	256
51a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_GUID_STRING_LENGTH	40
52a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_PATH_LENGTH		128
53a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAX_KEY_LENGTH		256
54a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIST_SEPARATOR		';'
559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
563fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// Handle code for HID interface that have been claimed ("dibs")
57a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define INTERFACE_CLAIMED	((HANDLE)(intptr_t)0xD1B5)
583fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// Additional return code for HID operations that completed synchronously
59a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_COMPLETED	(LIBUSB_SUCCESS + 1)
603fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
613ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545978.aspx
623ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545972.aspx
633ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge// http://msdn.microsoft.com/en-us/library/ff545982.aspx
649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER)
659a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardconst GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} };
669a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(GUID_DEVINTERFACE_USB_DEVICE)
689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardconst GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };
699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
703ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#if !defined(GUID_DEVINTERFACE_USB_HUB)
713ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stugeconst GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} };
723ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge#endif
73f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER)
74f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardconst GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} };
75f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard#endif
769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Multiple USB API backend support
809a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
81a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_UNSUPPORTED	0
82a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_HUB		1
83a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_COMPOSITE	2
84a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_WINUSBX		3
85a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_HID		4
86a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_MAX		5
87e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard// The following is used to indicate if the HID or composite extra props have already been set.
88a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_API_SET		(1 << USB_API_MAX)
899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
90f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL)
91f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard// Must have the same values as the KUSB_DRVID enum from libusbk.h
92a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUB_API_NOTSET		-1
93a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUB_API_LIBUSBK		0
94a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUB_API_LIBUSB0		1
95a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUB_API_WINUSB		2
96a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUB_API_MAX		3
97f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
98a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define WINUSBX_DRV_NAMES	{"libusbK", "libusb0", "WinUSB"}
999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_usb_api_backend {
1019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const uint8_t id;
102a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	const char *designation;
1039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp"
1049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	const uint8_t nb_driver_names;
105f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*init)(int sub_api, struct libusb_context *ctx);
106f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*exit)(int sub_api);
107f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*open)(int sub_api, struct libusb_device_handle *dev_handle);
108f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	void (*close)(int sub_api, struct libusb_device_handle *dev_handle);
109f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
110f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
111f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
112f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
113f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
114f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle);
115f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer);
116f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer);
117f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer);
118f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*abort_control)(int sub_api, struct usbi_transfer *itransfer);
119f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer);
120f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
1219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
1229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardextern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX];
1249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
125a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define PRINT_UNSUPPORTED_API(fname)				\
126a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	usbi_dbg("unsupported API call for '"			\
127a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		#fname "' (unrecognized device driver)");	\
1289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	return LIBUSB_ERROR_NOT_SUPPORTED;
1299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
1309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
1319a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * private structures definition
1329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * with inline pseudo constructors/destructors
1339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
1343fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1353fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// TODO (v2+): move hid desc to libusb.h?
1363fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardstruct libusb_hid_descriptor {
137a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t bLength;
138a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t bDescriptorType;
1393fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t bcdHID;
140a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t bCountryCode;
141a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t bNumDescriptors;
142a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t bClassDescriptorType;
1433fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t wClassDescriptorLength;
1443fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
145a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
146a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_DT_HID_SIZE		9
1473fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \
1483fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	+ LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE)
149a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define HID_MAX_REPORT_SIZE		1024
150a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define HID_IN_EP			0x81
151a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define HID_OUT_EP			0x02
152a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_REQ_RECIPIENT(request_type)	((request_type) & 0x1F)
153a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_REQ_TYPE(request_type)		((request_type) & (0x03 << 5))
154a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_REQ_IN(request_type)		((request_type) & LIBUSB_ENDPOINT_IN)
155a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LIBUSB_REQ_OUT(request_type)		(!LIBUSB_REQ_IN(request_type))
1563fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1573fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard// The following are used for HID reports IOCTLs
1583fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_CTL_CODE(id) \
159a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS)
1603fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_BUFFER_CTL_CODE(id) \
161a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
1623fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_IN_CTL_CODE(id) \
163a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS)
1643fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#define HID_OUT_CTL_CODE(id) \
165a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
1663fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
167a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define IOCTL_HID_GET_FEATURE		HID_OUT_CTL_CODE(100)
168a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define IOCTL_HID_GET_INPUT_REPORT	HID_OUT_CTL_CODE(104)
169a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define IOCTL_HID_SET_FEATURE		HID_IN_CTL_CODE(100)
170a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define IOCTL_HID_SET_OUTPUT_REPORT	HID_IN_CTL_CODE(101)
1713fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1723fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardenum libusb_hid_request_type {
1733fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_REPORT = 0x01,
1743fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_IDLE = 0x02,
1753fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_GET_PROTOCOL = 0x03,
1763fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_REPORT = 0x09,
1773fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_IDLE = 0x0A,
1783fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REQ_SET_PROTOCOL = 0x0B
1793fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1803fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1813fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardenum libusb_hid_report_type {
1823fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_INPUT = 0x01,
1833fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_OUTPUT = 0x02,
1843fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	HID_REPORT_TYPE_FEATURE = 0x03
1853fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1863fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
1873fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardstruct hid_device_priv {
1883fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t vid;
1893fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t pid;
1903fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t config;
1913fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t nb_interfaces;
192a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	bool uses_report_ids[3]; // input, ouptput, feature
1933fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t input_report_size;
1943fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t output_report_size;
1953fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint16_t feature_report_size;
1963fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	WCHAR string[3][MAX_USB_STRING_LENGTH];
197a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t string_index[3]; // man, prod, ser
1983fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard};
1993fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
2009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_device_priv {
201a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t depth; // distance to HCD
202a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	uint8_t port;  // port number on the hub
203e82c677b5f10a966c89f6b58caa1ae4341260527Pete Batard	uint8_t active_config;
204a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	struct libusb_device *parent_dev; // access to parent is required for usermode ops
2059a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct windows_usb_api_backend const *apib;
206a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	char *path;  // device interface path
207a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	int sub_api; // for WinUSB-like APIs
2089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
209a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		char *path; // each interface needs a device interface path,
2109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support),
211f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard		int sub_api;
212a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS)
2139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		uint8_t *endpoint;
214a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		bool restricted_functionality;  // indicates if the interface functionality is restricted
215a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens                                                // by Windows (eg. HID keyboards or mice cannot do R/W)
2169a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} usb_interface[USB_MAXINTERFACES];
2173fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	struct hid_device_priv *hid;
2189a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_DEVICE_DESCRIPTOR dev_descriptor;
219a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	unsigned char **config_descriptor; // list of pointers to the cached config descriptors
2209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
222a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickensstatic inline struct windows_device_priv *_device_priv(struct libusb_device *dev)
223a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens{
2243ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	return (struct windows_device_priv *)dev->os_priv;
2253ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge}
2263ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge
2270b947e5f9b2dfffa4def7007f4fb5b23fe2eb05fChris Dickensstatic inline struct windows_device_priv *windows_device_priv_init(struct libusb_device *dev)
228a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens{
229a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	struct windows_device_priv *p = _device_priv(dev);
2309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int i;
231a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
2323ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	p->depth = 0;
2333ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	p->port = 0;
2349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->parent_dev = NULL;
2359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->path = NULL;
2369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->apib = &usb_api_backend[USB_API_UNSUPPORTED];
237f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	p->sub_api = SUB_API_NOTSET;
2383fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	p->hid = NULL;
2399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->active_config = 0;
2409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	p->config_descriptor = NULL;
241a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	memset(&p->dev_descriptor, 0, sizeof(USB_DEVICE_DESCRIPTOR));
242a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	for (i = 0; i < USB_MAXINTERFACES; i++) {
2439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].path = NULL;
2449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED];
245f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard		p->usb_interface[i].sub_api = SUB_API_NOTSET;
2469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].nb_endpoints = 0;
2479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		p->usb_interface[i].endpoint = NULL;
2483fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard		p->usb_interface[i].restricted_functionality = false;
2499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2500b947e5f9b2dfffa4def7007f4fb5b23fe2eb05fChris Dickens
2510b947e5f9b2dfffa4def7007f4fb5b23fe2eb05fChris Dickens	return p;
2529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
254a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickensstatic inline void windows_device_priv_release(struct libusb_device *dev)
255a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens{
256a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	struct windows_device_priv *p = _device_priv(dev);
2579a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int i;
258a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
2599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	safe_free(p->path);
2603ccd9bddec316ee4b867959fd7f616eb4d410997Peter Stuge	if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) {
261a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		for (i = 0; i < dev->num_configurations; i++)
2629a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			safe_free(p->config_descriptor[i]);
2639a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	safe_free(p->config_descriptor);
2653fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	safe_free(p->hid);
266a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	for (i = 0; i < USB_MAXINTERFACES; i++) {
2679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		safe_free(p->usb_interface[i].path);
2689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		safe_free(p->usb_interface[i].endpoint);
2699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	}
2709a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2719a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2729a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct interface_handle_t {
2739a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	HANDLE dev_handle; // WinUSB needs an extra handle for the file
2749a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	HANDLE api_handle; // used by the API to communicate with the device
2759a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2779a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_device_handle_priv {
2789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int active_interface;
2799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct interface_handle_t interface_handle[USB_MAXINTERFACES];
2809a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	int autoclaim_count[USB_MAXINTERFACES]; // For auto-release
2819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
283d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmstatic inline struct windows_device_handle_priv *_device_handle_priv(
2849a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct libusb_device_handle *handle)
2859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard{
286a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	return (struct windows_device_handle_priv *)handle->os_priv;
2879a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard}
2889a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
2899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// used for async polling functions
2909a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardstruct windows_transfer_priv {
2919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct winfd pollable_fd;
2929a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	uint8_t interface_number;
2933fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID
2943fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	uint8_t *hid_dest;   // transfer buffer destination, required for HID
2953fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	size_t hid_expected_size;
2969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard};
2979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
298116d34f608b02f4e14668450b158acf5db726f95Pete Batard// used to match a device driver (including filter drivers) against a supported API
299116d34f608b02f4e14668450b158acf5db726f95Pete Batardstruct driver_lookup {
300a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names
301a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	const DWORD reg_prop;          // SPDRP registry key to use to retrieve list
302a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	const char* designation;       // internal designation (for debug output)
303116d34f608b02f4e14668450b158acf5db726f95Pete Batard};
3049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
305ae675c1f49dc00b695fce7296903f60998cc28edPete Batard/* OLE32 dependency */
30657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(OLE32);
30757cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID));
308ae675c1f49dc00b695fce7296903f60998cc28edPete Batard
30957cfbb444e03179a4e4eafba18416209f0db1d1cChris Dickens/* Kernel32 dependencies */
31057cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(Kernel32);
311d41802053c4f20691f38072879c9dd76806f0f91Pete Batard/* This call is only available from XP SP2 */
31257cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL));
313d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
314ae675c1f49dc00b695fce7296903f60998cc28edPete Batard/* SetupAPI dependencies */
31557cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(SetupAPI);
31657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD));
31757cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA));
31857cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA,
31982af9f9d440ef49015652c699157cf62020f097aPete Batard			const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA));
32057cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA,
32182af9f9d440ef49015652c699157cf62020f097aPete Batard			PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA));
32257cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO));
32357cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM));
32457cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO,
32582af9f9d440ef49015652c699157cf62020f097aPete Batard			PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD));
32657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD));
32757cfbb444e03179a4e4eafba18416209f0db1d1cChris Dickens
32857cfbb444e03179a4e4eafba18416209f0db1d1cChris Dickens/* AdvAPI32 dependencies */
32957cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(AdvAPI32);
33057cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD));
33157cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY));
3329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/*
3349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard * Windows DDK API definitions. Most of it copied from MinGW's includes
3359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard */
3369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DWORD DEVNODE, DEVINST;
3379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DEVNODE *PDEVNODE, *PDEVINST;
3389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef DWORD RETURN_TYPE;
3391feadb5f78e1d2cdfd2aaf0011e041c2848bae37Pete Batardtypedef RETURN_TYPE CONFIGRET;
3409a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
341a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define CR_SUCCESS				0x00000000
342a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define CR_NO_SUCH_DEVNODE			0x0000000D
343a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
344a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_DEVICE_DESCRIPTOR_TYPE		LIBUSB_DT_DEVICE
345a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_CONFIGURATION_DESCRIPTOR_TYPE	LIBUSB_DT_CONFIG
346a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_STRING_DESCRIPTOR_TYPE		LIBUSB_DT_STRING
347a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_INTERFACE_DESCRIPTOR_TYPE		LIBUSB_DT_INTERFACE
348a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_ENDPOINT_DESCRIPTOR_TYPE		LIBUSB_DT_ENDPOINT
349a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
350a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_GET_STATUS			LIBUSB_REQUEST_GET_STATUS
351a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_CLEAR_FEATURE		LIBUSB_REQUEST_CLEAR_FEATURE
352a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SET_FEATURE			LIBUSB_REQUEST_SET_FEATURE
353a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SET_ADDRESS			LIBUSB_REQUEST_SET_ADDRESS
354a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_GET_DESCRIPTOR		LIBUSB_REQUEST_GET_DESCRIPTOR
355a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SET_DESCRIPTOR		LIBUSB_REQUEST_SET_DESCRIPTOR
356a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_GET_CONFIGURATION		LIBUSB_REQUEST_GET_CONFIGURATION
357a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SET_CONFIGURATION		LIBUSB_REQUEST_SET_CONFIGURATION
358a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_GET_INTERFACE		LIBUSB_REQUEST_GET_INTERFACE
359a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SET_INTERFACE		LIBUSB_REQUEST_SET_INTERFACE
360a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_REQUEST_SYNC_FRAME			LIBUSB_REQUEST_SYNCH_FRAME
361a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens
362a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_NODE_INFORMATION		258
363a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION	260
364a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_NODE_CONNECTION_NAME		261
365a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_HUB_CAPABILITIES		271
3660288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX)
367a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_NODE_CONNECTION_INFORMATION_EX	274
3680288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#endif
3699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#if !defined(USB_GET_HUB_CAPABILITIES_EX)
370a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_HUB_CAPABILITIES_EX		276
3719a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
372d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2)
373a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2	279
374d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#endif
3759a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3769a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef METHOD_BUFFERED
377a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define METHOD_BUFFERED				0
3789a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3799a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_ANY_ACCESS
380a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define FILE_ANY_ACCESS				0x00000000
3819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_DEVICE_UNKNOWN
383a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define FILE_DEVICE_UNKNOWN			0x00000022
3849a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef FILE_DEVICE_USB
386a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define FILE_DEVICE_USB				FILE_DEVICE_UNKNOWN
3879a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3889a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
3899a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#ifndef CTL_CODE
390a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define CTL_CODE(DeviceType, Function, Method, Access) \
391a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
3929a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#endif
3939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
394d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USB_CONNECTION_STATUS {
3959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	NoDeviceConnected,
3969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceConnected,
3979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceFailedEnumeration,
3989a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceGeneralFailure,
3999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceCausedOvercurrent,
4009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceNotEnoughPower,
4019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceNotEnoughBandwidth,
4029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceHubNestedTooDeeply,
4039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	DeviceInLegacyHub
4049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
4059a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
406d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USB_HUB_NODE {
4079a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbHub,
4089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbMIParent
4099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_NODE;
4109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/* Cfgmgr32.dll interface */
41257cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(Cfgmgr32);
41357cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG));
41457cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG));
41557cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG));
41657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG));
4179a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4189a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \
419a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
4209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4219a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_HUB_CAPABILITIES \
422a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)
4239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
425a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
4269a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4279a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_ROOT_HUB_NAME \
428a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
4299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_INFORMATION \
431a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
4329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4330288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
434a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)
4359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
436d41802053c4f20691f38072879c9dd76806f0f91Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \
437a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS)
438d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
4399a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \
440a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)
4419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#define IOCTL_USB_GET_NODE_CONNECTION_NAME \
443a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
4449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
4459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard// Most of the structures below need to be packed
4469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(push, 1)
4479a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
448d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_INTERFACE_DESCRIPTOR {
449a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bLength;
450a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bDescriptorType;
451a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bInterfaceNumber;
452a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bAlternateSetting;
453a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bNumEndpoints;
454a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bInterfaceClass;
455a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bInterfaceSubClass;
456a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bInterfaceProtocol;
457a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR iInterface;
4589a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
4599a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
460d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT {
4619a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
4629a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		ULONG ConnectionIndex;
4639a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		struct {
4649a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			UCHAR bmRequest;
4659a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			UCHAR bRequest;
4669a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wValue;
4679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wIndex;
4689a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard			USHORT wLength;
4699a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		} SetupPacket;
4709a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} req;
4719a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_CONFIGURATION_DESCRIPTOR data;
4729a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_CONFIGURATION_DESCRIPTOR_SHORT;
4739a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
474d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ENDPOINT_DESCRIPTOR {
475a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bLength;
476a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bDescriptorType;
477a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bEndpointAddress;
478a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bmAttributes;
479a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT wMaxPacketSize;
480a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bInterval;
4819a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
4829a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
483d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_DESCRIPTOR_REQUEST {
484a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ConnectionIndex;
4859a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	struct {
486a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		UCHAR bmRequest;
487a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		UCHAR bRequest;
488a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		USHORT wValue;
489a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		USHORT wIndex;
490a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		USHORT wLength;
4919a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} SetupPacket;
492a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens//	UCHAR Data[0];
4939a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
4949a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
495d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_DESCRIPTOR {
496a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bDescriptorLength;
497a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bDescriptorType;
498a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bNumberOfPorts;
499a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT wHubCharacteristics;
500a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bPowerOnToPowerGood;
501a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bHubControlCurrent;
502a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR bRemoveAndPowerMask[64];
5039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;
5049a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
505d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ROOT_HUB_NAME {
506a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ActualLength;
507a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	WCHAR RootHubName[1];
5089a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
5099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
510d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_ROOT_HUB_NAME_FIXED {
5119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ActualLength;
5129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR RootHubName[MAX_PATH_LENGTH];
5139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_ROOT_HUB_NAME_FIXED;
5149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
515d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_NAME {
516a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ConnectionIndex;
517a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ActualLength;
518a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	WCHAR NodeName[1];
5199a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
5209a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
521d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_NAME_FIXED {
5229a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ConnectionIndex;
5239a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ActualLength;
5249a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	WCHAR NodeName[MAX_PATH_LENGTH];
5259a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_CONNECTION_NAME_FIXED;
5269a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
527d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_NAME_FIXED {
5289a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	union {
5299a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_ROOT_HUB_NAME_FIXED root;
5309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard		USB_NODE_CONNECTION_NAME_FIXED node;
5319a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} u;
5329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_NAME_FIXED;
5339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
534d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_INFORMATION {
535a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USB_HUB_DESCRIPTOR HubDescriptor;
536a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN HubIsBusPowered;
5379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
5389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
539d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_MI_PARENT_INFORMATION {
540a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG NumberOfInterfaces;
5419a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
5429a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
543d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_INFORMATION {
544a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USB_HUB_NODE NodeType;
5459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	union {
546a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		USB_HUB_INFORMATION HubInformation;
547a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		USB_MI_PARENT_INFORMATION MiParentInformation;
5489a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	} u;
5499a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
5509a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
551d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_PIPE_INFO {
552a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
553a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ScheduleOffset;
5549a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_PIPE_INFO, *PUSB_PIPE_INFO;
5559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
556d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_NODE_CONNECTION_INFORMATION_EX {
557a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ConnectionIndex;
558a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USB_DEVICE_DESCRIPTOR DeviceDescriptor;
559a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR CurrentConfigurationValue;
560a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR Speed;
561a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN DeviceIsHub;
562a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT DeviceAddress;
563a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG NumberOfOpenPipes;
564a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USB_CONNECTION_STATUS ConnectionStatus;
565a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens//	USB_PIPE_INFO PipeList[0];
5660288bf24f91eca9f433ebad91a7eb6c0e3e29133Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
5679a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
568d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef union _USB_PROTOCOLS {
569a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG ul;
570d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	struct {
571d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb110:1;
572d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb200:1;
573d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG Usb300:1;
574d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG ReservedMBZ:29;
575d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	};
576d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_PROTOCOLS, *PUSB_PROTOCOLS;
577d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
578d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {
579d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG ul;
580d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	struct {
581d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1;
582d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG DeviceIsSuperSpeedCapableOrHigher:1;
583d41802053c4f20691f38072879c9dd76806f0f91Pete Batard		ULONG ReservedMBZ:30;
584d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	};
585d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;
586d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
587d41802053c4f20691f38072879c9dd76806f0f91Pete Batardtypedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {
588d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG ConnectionIndex;
589d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	ULONG Length;
590d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	USB_PROTOCOLS SupportedUsbProtocols;
591d41802053c4f20691f38072879c9dd76806f0f91Pete Batard	USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;
592d41802053c4f20691f38072879c9dd76806f0f91Pete Batard} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2;
593d41802053c4f20691f38072879c9dd76806f0f91Pete Batard
594d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAP_FLAGS {
5959a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsHighSpeedCapable:1;
5969a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsHighSpeed:1;
5979a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsMultiTtCapable:1;
5989a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsMultiTt:1;
5999a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsRoot:1;
6009a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG HubIsArmedWakeOnConnect:1;
6019a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	ULONG ReservedMBZ:26;
6029a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS;
6039a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
604d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAPABILITIES {
605a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG HubIs2xCapable:1;
6069a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
6079a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
608d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef struct USB_HUB_CAPABILITIES_EX {
6099a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	USB_HUB_CAP_FLAGS CapabilityFlags;
6109a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;
6119a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6129a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(pop)
6139a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6149a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard/* winusb.dll interface */
6159a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
616a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SHORT_PACKET_TERMINATE	0x01
617a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define AUTO_CLEAR_STALL	0x02
618a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define PIPE_TRANSFER_TIMEOUT	0x03
619a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define IGNORE_SHORT_PACKETS	0x04
620a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define ALLOW_PARTIAL_READS	0x05
621a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define AUTO_FLUSH		0x06
622a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define RAW_IO			0x07
623a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define MAXIMUM_TRANSFER_SIZE	0x08
624a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define AUTO_SUSPEND		0x81
625a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define SUSPEND_DELAY		0x83
626a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define DEVICE_SPEED		0x01
627a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define LowSpeed		0x01
628a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define FullSpeed		0x02
629a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define HighSpeed		0x03
6309a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
631d1bd234f7e1b1ff4168b8f605e2038e87a0e361fNathan Hjelmtypedef enum USBD_PIPE_TYPE {
6329a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeControl,
6339a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeIsochronous,
6349a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeBulk,
6359a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard	UsbdPipeTypeInterrupt
6369a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} USBD_PIPE_TYPE;
6379a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6389a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef struct {
639a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USBD_PIPE_TYPE PipeType;
640a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR PipeId;
641a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT MaximumPacketSize;
642a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR Interval;
6439a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;
6449a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6459a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack(1)
6469a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef struct {
647a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR request_type;
648a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR request;
649a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT value;
650a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT index;
651a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT length;
6529a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
6539a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard#pragma pack()
6549a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
6559a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batardtypedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE;
6569a4249f8a104b98a15a7e3ba7ecae9a385ed9027Pete Batard
657f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_AbortPipe_t)(
658f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
659f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
660f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
661f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ControlTransfer_t)(
662f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
663f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_SETUP_PACKET SetupPacket,
664f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
665f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
666f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
667f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
668f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
669f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_FlushPipe_t)(
670f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
671f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
672f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
673f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_Free_t)(
674f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle
675f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
676f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)(
677f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
678f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AssociatedInterfaceIndex,
679f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle
680f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
681f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)(
682f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
683f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR AlternateSetting
684f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
685f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetDescriptor_t)(
686f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
687f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR DescriptorType,
688f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR Index,
689f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	USHORT LanguageID,
690f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
691f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
692f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred
693f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
694f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)(
695f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
696f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED lpOverlapped,
697f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPDWORD lpNumberOfBytesTransferred,
698f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	BOOL bWait
699f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
700f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)(
701f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
702f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
703f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
704f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG ValueLength,
705f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
706f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
707f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)(
708f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
709f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
710f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG ValueLength,
711f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
712f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
713f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_Initialize_t)(
714f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	HANDLE DeviceHandle,
715f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_INTERFACE_HANDLE InterfaceHandle
716f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
717f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)(
718f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
719f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG InformationType,
720f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG BufferLength,
721f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Buffer
722f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
723f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)(
724f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
725f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateSettingNumber,
726f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor
727f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
728f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_QueryPipe_t)(
729f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
730f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateInterfaceNumber,
731f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeIndex,
732f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PWINUSB_PIPE_INFORMATION PipeInformation
733f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
734f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ReadPipe_t)(
735f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
736f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
737f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
738f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
739f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
740f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
741f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
742f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ResetPipe_t)(
743f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
744f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID
745f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
746f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)(
747f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
748f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR AlternateSetting
749f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
750f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)(
751f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
752f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
753f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
754f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG ValueLength,
755f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
756f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
757f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)(
758f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
759f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG PolicyType,
760f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG ValueLength,
761f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PVOID Value
762f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
763f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_WritePipe_t)(
764f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle,
765f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	UCHAR PipeID,
766f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PUCHAR Buffer,
767f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG BufferLength,
768f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PULONG LengthTransferred,
769f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	LPOVERLAPPED Overlapped
770f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
771f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *WinUsb_ResetDevice_t)(
772f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WINUSB_INTERFACE_HANDLE InterfaceHandle
773f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
774f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
775f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard/* /!\ These must match the ones from the official libusbk.h */
776a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickenstypedef enum _KUSB_FNID {
777f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Init,
778f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Free,
779f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ClaimInterface,
780f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ReleaseInterface,
781f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetAltInterface,
782f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetAltInterface,
783f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetDescriptor,
784f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ControlTransfer,
785f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetPowerPolicy,
786f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetPowerPolicy,
787f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetConfiguration,
788f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetConfiguration,
789f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ResetDevice,
790f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Initialize,
791f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SelectInterface,
792f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetAssociatedInterface,
793f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_Clone,
794f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryInterfaceSettings,
795f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryDeviceInformation,
796f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetCurrentAlternateSetting,
797f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetCurrentAlternateSetting,
798f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_QueryPipe,
799f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_SetPipePolicy,
800f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetPipePolicy,
801f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ReadPipe,
802f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_WritePipe,
803f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_ResetPipe,
804f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_AbortPipe,
805f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_FlushPipe,
806f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_IsoReadPipe,
807f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_IsoWritePipe,
808f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetCurrentFrameNumber,
809f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetOverlappedResult,
810f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_GetProperty,
811f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	KUSB_FNID_COUNT,
8125d83abac3ff2804b4ac9cb1516b25e431d0bad06Dmitry Fleytman} KUSB_FNID;
813f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
814f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef struct _KLIB_VERSION {
815f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Major;
816f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Minor;
817f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Micro;
818f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	INT Nano;
819f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard} KLIB_VERSION;
820f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef KLIB_VERSION* PKLIB_VERSION;
821f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
822f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef BOOL (WINAPI *LibK_GetProcAddress_t)(
823a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	PVOID *ProcAddress,
824f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG DriverID,
825f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	ULONG FunctionID
826f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
827f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
828f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardtypedef VOID (WINAPI *LibK_GetVersion_t)(
829f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	PKLIB_VERSION Version
830f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard);
831f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard
832f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batardstruct winusb_interface {
833f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	bool initialized;
834f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_AbortPipe_t AbortPipe;
835f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ControlTransfer_t ControlTransfer;
836f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_FlushPipe_t FlushPipe;
837f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_Free_t Free;
838f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetAssociatedInterface_t GetAssociatedInterface;
839f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting;
840f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetDescriptor_t GetDescriptor;
841f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetOverlappedResult_t GetOverlappedResult;
842f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetPipePolicy_t GetPipePolicy;
843f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_GetPowerPolicy_t GetPowerPolicy;
844f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_Initialize_t Initialize;
845f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryDeviceInformation_t QueryDeviceInformation;
846f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings;
847f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_QueryPipe_t QueryPipe;
848f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ReadPipe_t ReadPipe;
849f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ResetPipe_t ResetPipe;
850f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting;
851f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetPipePolicy_t SetPipePolicy;
852f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_SetPowerPolicy_t SetPowerPolicy;
853f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_WritePipe_t WritePipe;
854f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard	WinUsb_ResetDevice_t ResetDevice;
855f2b19e4a32c1445f4fea06beca61e8c7e7757950Pete Batard};
8563fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8573fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard/* hid.dll interface */
8583fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
859a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens#define HIDP_STATUS_SUCCESS	0x110000
860a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickenstypedef void * PHIDP_PREPARSED_DATA;
8613fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8623fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#pragma pack(1)
8633fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct {
8643fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	ULONG Size;
8653fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT VendorID;
8663fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT ProductID;
8673fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	USHORT VersionNumber;
8683fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
8693fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard#pragma pack()
8703fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8713fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef USHORT USAGE;
8723fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct {
873a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USAGE Usage;
874a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USAGE UsagePage;
875a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT InputReportByteLength;
876a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT OutputReportByteLength;
877a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT FeatureReportByteLength;
878a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT Reserved[17];
879a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberLinkCollectionNodes;
880a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberInputButtonCaps;
881a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberInputValueCaps;
882a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberInputDataIndices;
883a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberOutputButtonCaps;
884a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberOutputValueCaps;
885a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberOutputDataIndices;
886a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberFeatureButtonCaps;
887a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberFeatureValueCaps;
888a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT NumberFeatureDataIndices;
8893fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_CAPS, *PHIDP_CAPS;
8903fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8913fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef enum _HIDP_REPORT_TYPE {
892a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	HidP_Input,
893a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	HidP_Output,
894a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	HidP_Feature
8953fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_REPORT_TYPE;
8963fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
8973fae93a941669be8a87ca49dd09f836d2d9647aaPete Batardtypedef struct _HIDP_VALUE_CAPS {
898a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USAGE UsagePage;
899a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR ReportID;
900a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN IsAlias;
901a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT BitField;
902a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT LinkCollection;
903a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USAGE LinkUsage;
904a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USAGE LinkUsagePage;
905a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN IsRange;
906a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN IsStringRange;
907a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN IsDesignatorRange;
908a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN IsAbsolute;
909a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	BOOLEAN HasNull;
910a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	UCHAR Reserved;
911a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT BitSize;
912a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT ReportCount;
913a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	USHORT Reserved2[5];
914a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG UnitsExp;
915a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	ULONG Units;
916a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	LONG LogicalMin, LogicalMax;
917a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens	LONG PhysicalMin, PhysicalMax;
9183fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	union {
919a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		struct {
920a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USAGE UsageMin, UsageMax;
921a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT StringMin, StringMax;
922a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT DesignatorMin, DesignatorMax;
923a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT DataIndexMin, DataIndexMax;
924a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		} Range;
925a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		struct {
926a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USAGE Usage, Reserved1;
927a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT StringIndex, Reserved2;
928a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT DesignatorIndex, Reserved3;
929a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens			USHORT DataIndex, Reserved4;
930a3ec36d3ecc268d2f8b9f1f9800cd438c57cab56Chris Dickens		} NotRange;
9313fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard	} u;
9323fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;
9333fae93a941669be8a87ca49dd09f836d2d9647aaPete Batard
93457cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_HANDLE(hid);
93557cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES));
93657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID));
93757cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *));
93857cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA));
93957cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG));
94057cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG));
94157cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG));
94257cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS));
94357cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG));
94457cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG));
94557cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG));
94657cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG));
94757cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG));
94857cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG));
94957cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE));
95057cfbb444e03179a4e4eafba18416209f0db1d1cChris DickensDLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA));