Blame libusb/os/windows_winusb.h

Packit Service b0a153
/*
Packit Service b0a153
 * Windows backend for libusb 1.0
Packit Service b0a153
 * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>
Packit Service b0a153
 * With contributions from Michael Plante, Orin Eman et al.
Packit Service b0a153
 * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer
Packit Service b0a153
 * Major code testing contribution by Xiaofan Chen
Packit Service b0a153
 *
Packit Service b0a153
 * This library is free software; you can redistribute it and/or
Packit Service b0a153
 * modify it under the terms of the GNU Lesser General Public
Packit Service b0a153
 * License as published by the Free Software Foundation; either
Packit Service b0a153
 * version 2.1 of the License, or (at your option) any later version.
Packit Service b0a153
 *
Packit Service b0a153
 * This library is distributed in the hope that it will be useful,
Packit Service b0a153
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b0a153
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service b0a153
 * Lesser General Public License for more details.
Packit Service b0a153
 *
Packit Service b0a153
 * You should have received a copy of the GNU Lesser General Public
Packit Service b0a153
 * License along with this library; if not, write to the Free Software
Packit Service b0a153
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Packit Service b0a153
 */
Packit Service b0a153
Packit Service b0a153
#pragma once
Packit Service b0a153
Packit Service b0a153
#include "windows_common.h"
Packit Service b0a153
#include "windows_nt_common.h"
Packit Service b0a153
Packit Service b0a153
#if defined(_MSC_VER)
Packit Service b0a153
// disable /W4 MSVC warnings that are benign
Packit Service b0a153
#pragma warning(disable:4100)  // unreferenced formal parameter
Packit Service b0a153
#pragma warning(disable:4127)  // conditional expression is constant
Packit Service b0a153
#pragma warning(disable:4201)  // nameless struct/union
Packit Service b0a153
#pragma warning(disable:4214)  // bit field types other than int
Packit Service b0a153
#pragma warning(disable:4996)  // deprecated API calls
Packit Service b0a153
#pragma warning(disable:28159) // more deprecated API calls
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
// Missing from MSVC6 setupapi.h
Packit Service b0a153
#ifndef SPDRP_ADDRESS
Packit Service b0a153
#define SPDRP_ADDRESS		28
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef SPDRP_INSTALL_STATE
Packit Service b0a153
#define SPDRP_INSTALL_STATE	34
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
#define MAX_CTRL_BUFFER_LENGTH	4096
Packit Service b0a153
#define MAX_USB_STRING_LENGTH	128
Packit Service b0a153
#define MAX_HID_REPORT_SIZE	1024
Packit Service b0a153
#define MAX_HID_DESCRIPTOR_SIZE	256
Packit Service b0a153
#define MAX_GUID_STRING_LENGTH	40
Packit Service b0a153
#define MAX_PATH_LENGTH		128
Packit Service b0a153
#define MAX_KEY_LENGTH		256
Packit Service b0a153
#define LIST_SEPARATOR		';'
Packit Service b0a153
Packit Service b0a153
// Handle code for HID interface that have been claimed ("dibs")
Packit Service b0a153
#define INTERFACE_CLAIMED	((HANDLE)(intptr_t)0xD1B5)
Packit Service b0a153
// Additional return code for HID operations that completed synchronously
Packit Service b0a153
#define LIBUSB_COMPLETED	(LIBUSB_SUCCESS + 1)
Packit Service b0a153
Packit Service b0a153
// http://msdn.microsoft.com/en-us/library/ff545978.aspx
Packit Service b0a153
// http://msdn.microsoft.com/en-us/library/ff545972.aspx
Packit Service b0a153
// http://msdn.microsoft.com/en-us/library/ff545982.aspx
Packit Service b0a153
#ifndef GUID_DEVINTERFACE_USB_HOST_CONTROLLER
Packit Service b0a153
const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = {0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27}};
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef GUID_DEVINTERFACE_USB_DEVICE
Packit Service b0a153
const GUID GUID_DEVINTERFACE_USB_DEVICE = {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}};
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef GUID_DEVINTERFACE_USB_HUB
Packit Service b0a153
const GUID GUID_DEVINTERFACE_USB_HUB = {0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8}};
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef GUID_DEVINTERFACE_LIBUSB0_FILTER
Packit Service b0a153
const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = {0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9}};
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
Packit Service b0a153
/*
Packit Service b0a153
 * Multiple USB API backend support
Packit Service b0a153
 */
Packit Service b0a153
#define USB_API_UNSUPPORTED	0
Packit Service b0a153
#define USB_API_HUB		1
Packit Service b0a153
#define USB_API_COMPOSITE	2
Packit Service b0a153
#define USB_API_WINUSBX		3
Packit Service b0a153
#define USB_API_HID		4
Packit Service b0a153
#define USB_API_MAX		5
Packit Service b0a153
Packit Service b0a153
// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL)
Packit Service b0a153
// Must have the same values as the KUSB_DRVID enum from libusbk.h
Packit Service b0a153
#define SUB_API_NOTSET		-1
Packit Service b0a153
#define SUB_API_LIBUSBK		0
Packit Service b0a153
#define SUB_API_LIBUSB0		1
Packit Service b0a153
#define SUB_API_WINUSB		2
Packit Service b0a153
#define SUB_API_MAX		3
Packit Service b0a153
Packit Service b0a153
struct windows_usb_api_backend {
Packit Service b0a153
	const uint8_t id;
Packit Service b0a153
	const char * const designation;
Packit Service b0a153
	const char * const * const driver_name_list; // Driver name, without .sys, e.g. "usbccgp"
Packit Service b0a153
	const uint8_t nb_driver_names;
Packit Service b0a153
	int (*init)(struct libusb_context *ctx);
Packit Service b0a153
	void (*exit)(void);
Packit Service b0a153
	int (*open)(int sub_api, struct libusb_device_handle *dev_handle);
Packit Service b0a153
	void (*close)(int sub_api, struct libusb_device_handle *dev_handle);
Packit Service b0a153
	int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
Packit Service b0a153
	int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
Packit Service b0a153
	int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
Packit Service b0a153
	int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);
Packit Service b0a153
	int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
Packit Service b0a153
	int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle);
Packit Service b0a153
	int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer);
Packit Service b0a153
	int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer);
Packit Service b0a153
	int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer);
Packit Service b0a153
	int (*abort_control)(int sub_api, struct usbi_transfer *itransfer);
Packit Service b0a153
	int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer);
Packit Service b0a153
	int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX];
Packit Service b0a153
Packit Service b0a153
#define PRINT_UNSUPPORTED_API(fname)				\
Packit Service b0a153
	usbi_dbg("unsupported API call for '%s' "		\
Packit Service b0a153
		"(unrecognized device driver)", #fname)
Packit Service b0a153
Packit Service b0a153
#define CHECK_SUPPORTED_API(apip, fname)			\
Packit Service b0a153
	do {							\
Packit Service b0a153
		if ((apip)->fname == NULL) {			\
Packit Service b0a153
			PRINT_UNSUPPORTED_API(fname);		\
Packit Service b0a153
			return LIBUSB_ERROR_NOT_SUPPORTED;	\
Packit Service b0a153
		}						\
Packit Service b0a153
	} while (0)
Packit Service b0a153
Packit Service b0a153
/*
Packit Service b0a153
 * private structures definition
Packit Service b0a153
 * with inline pseudo constructors/destructors
Packit Service b0a153
 */
Packit Service b0a153
Packit Service b0a153
// TODO (v2+): move hid desc to libusb.h?
Packit Service b0a153
struct libusb_hid_descriptor {
Packit Service b0a153
	uint8_t bLength;
Packit Service b0a153
	uint8_t bDescriptorType;
Packit Service b0a153
	uint16_t bcdHID;
Packit Service b0a153
	uint8_t bCountryCode;
Packit Service b0a153
	uint8_t bNumDescriptors;
Packit Service b0a153
	uint8_t bClassDescriptorType;
Packit Service b0a153
	uint16_t wClassDescriptorLength;
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
#define LIBUSB_DT_HID_SIZE		9
Packit Service b0a153
#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \
Packit Service b0a153
	+ LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE)
Packit Service b0a153
#define HID_MAX_REPORT_SIZE		1024
Packit Service b0a153
#define HID_IN_EP			0x81
Packit Service b0a153
#define HID_OUT_EP			0x02
Packit Service b0a153
#define LIBUSB_REQ_RECIPIENT(request_type)	((request_type) & 0x1F)
Packit Service b0a153
#define LIBUSB_REQ_TYPE(request_type)		((request_type) & (0x03 << 5))
Packit Service b0a153
#define LIBUSB_REQ_IN(request_type)		((request_type) & LIBUSB_ENDPOINT_IN)
Packit Service b0a153
#define LIBUSB_REQ_OUT(request_type)		(!LIBUSB_REQ_IN(request_type))
Packit Service b0a153
Packit Service b0a153
#ifndef CTL_CODE
Packit Service b0a153
#define CTL_CODE(DeviceType, Function, Method, Access) \
Packit Service b0a153
	(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
// The following are used for HID reports IOCTLs
Packit Service b0a153
#define HID_IN_CTL_CODE(id) \
Packit Service b0a153
	CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS)
Packit Service b0a153
#define HID_OUT_CTL_CODE(id) \
Packit Service b0a153
	CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
Packit Service b0a153
Packit Service b0a153
#define IOCTL_HID_GET_FEATURE		HID_OUT_CTL_CODE(100)
Packit Service b0a153
#define IOCTL_HID_GET_INPUT_REPORT	HID_OUT_CTL_CODE(104)
Packit Service b0a153
#define IOCTL_HID_SET_FEATURE		HID_IN_CTL_CODE(100)
Packit Service b0a153
#define IOCTL_HID_SET_OUTPUT_REPORT	HID_IN_CTL_CODE(101)
Packit Service b0a153
Packit Service b0a153
enum libusb_hid_request_type {
Packit Service b0a153
	HID_REQ_GET_REPORT = 0x01,
Packit Service b0a153
	HID_REQ_GET_IDLE = 0x02,
Packit Service b0a153
	HID_REQ_GET_PROTOCOL = 0x03,
Packit Service b0a153
	HID_REQ_SET_REPORT = 0x09,
Packit Service b0a153
	HID_REQ_SET_IDLE = 0x0A,
Packit Service b0a153
	HID_REQ_SET_PROTOCOL = 0x0B
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
enum libusb_hid_report_type {
Packit Service b0a153
	HID_REPORT_TYPE_INPUT = 0x01,
Packit Service b0a153
	HID_REPORT_TYPE_OUTPUT = 0x02,
Packit Service b0a153
	HID_REPORT_TYPE_FEATURE = 0x03
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
struct hid_device_priv {
Packit Service b0a153
	uint16_t vid;
Packit Service b0a153
	uint16_t pid;
Packit Service b0a153
	uint8_t config;
Packit Service b0a153
	uint8_t nb_interfaces;
Packit Service b0a153
	bool uses_report_ids[3]; // input, ouptput, feature
Packit Service b0a153
	uint16_t input_report_size;
Packit Service b0a153
	uint16_t output_report_size;
Packit Service b0a153
	uint16_t feature_report_size;
Packit Service b0a153
	uint16_t usage;
Packit Service b0a153
	uint16_t usagePage;
Packit Service b0a153
	WCHAR string[3][MAX_USB_STRING_LENGTH];
Packit Service b0a153
	uint8_t string_index[3]; // man, prod, ser
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
static inline struct winusb_device_priv *_device_priv(struct libusb_device *dev)
Packit Service b0a153
{
Packit Service b0a153
	return (struct winusb_device_priv *)dev->os_priv;
Packit Service b0a153
}
Packit Service b0a153
Packit Service b0a153
static inline struct winusb_device_priv *winusb_device_priv_init(struct libusb_device *dev)
Packit Service b0a153
{
Packit Service b0a153
	struct winusb_device_priv *p = _device_priv(dev);
Packit Service b0a153
	int i;
Packit Service b0a153
Packit Service b0a153
	p->apib = &usb_api_backend[USB_API_UNSUPPORTED];
Packit Service b0a153
	p->sub_api = SUB_API_NOTSET;
Packit Service b0a153
	for (i = 0; i < USB_MAXINTERFACES; i++) {
Packit Service b0a153
		p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED];
Packit Service b0a153
		p->usb_interface[i].sub_api = SUB_API_NOTSET;
Packit Service b0a153
	}
Packit Service b0a153
Packit Service b0a153
	return p;
Packit Service b0a153
}
Packit Service b0a153
Packit Service b0a153
static inline void winusb_device_priv_release(struct libusb_device *dev)
Packit Service b0a153
{
Packit Service b0a153
	struct winusb_device_priv *p = _device_priv(dev);
Packit Service b0a153
	int i;
Packit Service b0a153
Packit Service b0a153
	free(p->dev_id);
Packit Service b0a153
	free(p->path);
Packit Service b0a153
	if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) {
Packit Service b0a153
		for (i = 0; i < dev->num_configurations; i++)
Packit Service b0a153
			free(p->config_descriptor[i]);
Packit Service b0a153
	}
Packit Service b0a153
	free(p->config_descriptor);
Packit Service b0a153
	free(p->hid);
Packit Service b0a153
	for (i = 0; i < USB_MAXINTERFACES; i++) {
Packit Service b0a153
		free(p->usb_interface[i].path);
Packit Service b0a153
		free(p->usb_interface[i].endpoint);
Packit Service b0a153
	}
Packit Service b0a153
}
Packit Service b0a153
Packit Service b0a153
static inline struct winusb_device_handle_priv *_device_handle_priv(
Packit Service b0a153
	struct libusb_device_handle *handle)
Packit Service b0a153
{
Packit Service b0a153
	return (struct winusb_device_handle_priv *)handle->os_priv;
Packit Service b0a153
}
Packit Service b0a153
Packit Service b0a153
// used to match a device driver (including filter drivers) against a supported API
Packit Service b0a153
struct driver_lookup {
Packit Service b0a153
	char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names
Packit Service b0a153
	const DWORD reg_prop;          // SPDRP registry key to use to retrieve list
Packit Service b0a153
	const char* designation;       // internal designation (for debug output)
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
/*
Packit Service b0a153
 * Windows DDK API definitions. Most of it copied from MinGW's includes
Packit Service b0a153
 */
Packit Service b0a153
typedef DWORD DEVNODE, DEVINST;
Packit Service b0a153
typedef DEVNODE *PDEVNODE, *PDEVINST;
Packit Service b0a153
typedef DWORD RETURN_TYPE;
Packit Service b0a153
typedef RETURN_TYPE CONFIGRET;
Packit Service b0a153
Packit Service b0a153
#define CR_SUCCESS	0x00000000
Packit Service b0a153
Packit Service b0a153
/* Cfgmgr32 dependencies */
Packit Service b0a153
DLL_DECLARE_HANDLE(Cfgmgr32);
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG));
Packit Service b0a153
Packit Service b0a153
/* AdvAPI32 dependencies */
Packit Service b0a153
DLL_DECLARE_HANDLE(AdvAPI32);
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY));
Packit Service b0a153
Packit Service b0a153
/* OLE32 dependency */
Packit Service b0a153
DLL_DECLARE_HANDLE(OLE32);
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, IIDFromString, (LPCOLESTR, LPIID));
Packit Service b0a153
Packit Service b0a153
/* SetupAPI dependencies */
Packit Service b0a153
DLL_DECLARE_HANDLE(SetupAPI);
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (LPCGUID, PCSTR, HWND, DWORD));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA,
Packit Service b0a153
			LPCGUID, DWORD, PSP_DEVICE_INTERFACE_DATA));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInstanceIdA, (HDEVINFO, PSP_DEVINFO_DATA,
Packit Service b0a153
			PCSTR, DWORD, PDWORD));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA,
Packit Service b0a153
			PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO,
Packit Service b0a153
			PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM));
Packit Service b0a153
DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD));
Packit Service b0a153
Packit Service b0a153
Packit Service b0a153
#ifndef USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
Packit Service b0a153
#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION		260
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef USB_GET_NODE_CONNECTION_INFORMATION_EX
Packit Service b0a153
#define USB_GET_NODE_CONNECTION_INFORMATION_EX		274
Packit Service b0a153
#endif
Packit Service b0a153
#ifndef USB_GET_NODE_CONNECTION_INFORMATION_EX_V2
Packit Service b0a153
#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2	279
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
#ifndef FILE_DEVICE_USB
Packit Service b0a153
#define FILE_DEVICE_USB		FILE_DEVICE_UNKNOWN
Packit Service b0a153
#endif
Packit Service b0a153
Packit Service b0a153
#define USB_CTL_CODE(id) \
Packit Service b0a153
	CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
Packit Service b0a153
Packit Service b0a153
#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \
Packit Service b0a153
	USB_CTL_CODE(USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION)
Packit Service b0a153
Packit Service b0a153
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \
Packit Service b0a153
	USB_CTL_CODE(USB_GET_NODE_CONNECTION_INFORMATION_EX)
Packit Service b0a153
Packit Service b0a153
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \
Packit Service b0a153
	USB_CTL_CODE(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2)
Packit Service b0a153
Packit Service b0a153
typedef enum USB_CONNECTION_STATUS {
Packit Service b0a153
	NoDeviceConnected,
Packit Service b0a153
	DeviceConnected,
Packit Service b0a153
	DeviceFailedEnumeration,
Packit Service b0a153
	DeviceGeneralFailure,
Packit Service b0a153
	DeviceCausedOvercurrent,
Packit Service b0a153
	DeviceNotEnoughPower,
Packit Service b0a153
	DeviceNotEnoughBandwidth,
Packit Service b0a153
	DeviceHubNestedTooDeeply,
Packit Service b0a153
	DeviceInLegacyHub
Packit Service b0a153
} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
Packit Service b0a153
Packit Service b0a153
typedef enum USB_HUB_NODE {
Packit Service b0a153
	UsbHub,
Packit Service b0a153
	UsbMIParent
Packit Service b0a153
} USB_HUB_NODE;
Packit Service b0a153
Packit Service b0a153
// Most of the structures below need to be packed
Packit Service b0a153
#include <pshpack1.h>
Packit Service b0a153
Packit Service b0a153
typedef struct _USB_DESCRIPTOR_REQUEST {
Packit Service b0a153
	ULONG ConnectionIndex;
Packit Service b0a153
	struct {
Packit Service b0a153
		UCHAR bmRequest;
Packit Service b0a153
		UCHAR bRequest;
Packit Service b0a153
		USHORT wValue;
Packit Service b0a153
		USHORT wIndex;
Packit Service b0a153
		USHORT wLength;
Packit Service b0a153
	} SetupPacket;
Packit Service b0a153
//	UCHAR Data[0];
Packit Service b0a153
} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
Packit Service b0a153
Packit Service b0a153
typedef struct _USB_CONFIGURATION_DESCRIPTOR_SHORT {
Packit Service b0a153
	USB_DESCRIPTOR_REQUEST req;
Packit Service b0a153
	USB_CONFIGURATION_DESCRIPTOR desc;
Packit Service b0a153
} USB_CONFIGURATION_DESCRIPTOR_SHORT;
Packit Service b0a153
Packit Service b0a153
typedef struct USB_INTERFACE_DESCRIPTOR {
Packit Service b0a153
	UCHAR bLength;
Packit Service b0a153
	UCHAR bDescriptorType;
Packit Service b0a153
	UCHAR bInterfaceNumber;
Packit Service b0a153
	UCHAR bAlternateSetting;
Packit Service b0a153
	UCHAR bNumEndpoints;
Packit Service b0a153
	UCHAR bInterfaceClass;
Packit Service b0a153
	UCHAR bInterfaceSubClass;
Packit Service b0a153
	UCHAR bInterfaceProtocol;
Packit Service b0a153
	UCHAR iInterface;
Packit Service b0a153
} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
Packit Service b0a153
Packit Service b0a153
typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
Packit Service b0a153
	ULONG ConnectionIndex;
Packit Service b0a153
	USB_DEVICE_DESCRIPTOR DeviceDescriptor;
Packit Service b0a153
	UCHAR CurrentConfigurationValue;
Packit Service b0a153
	UCHAR Speed;
Packit Service b0a153
	BOOLEAN DeviceIsHub;
Packit Service b0a153
	USHORT DeviceAddress;
Packit Service b0a153
	ULONG NumberOfOpenPipes;
Packit Service b0a153
	USB_CONNECTION_STATUS ConnectionStatus;
Packit Service b0a153
//	USB_PIPE_INFO PipeList[0];
Packit Service b0a153
} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
Packit Service b0a153
Packit Service b0a153
typedef union _USB_PROTOCOLS {
Packit Service b0a153
	ULONG ul;
Packit Service b0a153
	struct {
Packit Service b0a153
		ULONG Usb110:1;
Packit Service b0a153
		ULONG Usb200:1;
Packit Service b0a153
		ULONG Usb300:1;
Packit Service b0a153
		ULONG ReservedMBZ:29;
Packit Service b0a153
	};
Packit Service b0a153
} USB_PROTOCOLS, *PUSB_PROTOCOLS;
Packit Service b0a153
Packit Service b0a153
typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {
Packit Service b0a153
	ULONG ul;
Packit Service b0a153
	struct {
Packit Service b0a153
		ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1;
Packit Service b0a153
		ULONG DeviceIsSuperSpeedCapableOrHigher:1;
Packit Service b0a153
		ULONG DeviceIsOperatingAtSuperSpeedPlusOrHigher:1;
Packit Service b0a153
		ULONG DeviceIsSuperSpeedPlusCapableOrHigher:1;
Packit Service b0a153
		ULONG ReservedMBZ:28;
Packit Service b0a153
	};
Packit Service b0a153
} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;
Packit Service b0a153
Packit Service b0a153
typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {
Packit Service b0a153
	ULONG ConnectionIndex;
Packit Service b0a153
	ULONG Length;
Packit Service b0a153
	USB_PROTOCOLS SupportedUsbProtocols;
Packit Service b0a153
	USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;
Packit Service b0a153
} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2;
Packit Service b0a153
Packit Service b0a153
#include <poppack.h>
Packit Service b0a153
Packit Service b0a153
/* winusb.dll interface */
Packit Service b0a153
Packit Service b0a153
/* pipe policies */
Packit Service b0a153
#define SHORT_PACKET_TERMINATE	0x01
Packit Service b0a153
#define AUTO_CLEAR_STALL	0x02
Packit Service b0a153
#define PIPE_TRANSFER_TIMEOUT	0x03
Packit Service b0a153
#define IGNORE_SHORT_PACKETS	0x04
Packit Service b0a153
#define ALLOW_PARTIAL_READS	0x05
Packit Service b0a153
#define AUTO_FLUSH		0x06
Packit Service b0a153
#define RAW_IO			0x07
Packit Service b0a153
#define MAXIMUM_TRANSFER_SIZE	0x08
Packit Service b0a153
/* libusbK */
Packit Service b0a153
#define ISO_ALWAYS_START_ASAP	0x21
Packit Service b0a153
Packit Service b0a153
typedef enum _USBD_PIPE_TYPE {
Packit Service b0a153
	UsbdPipeTypeControl,
Packit Service b0a153
	UsbdPipeTypeIsochronous,
Packit Service b0a153
	UsbdPipeTypeBulk,
Packit Service b0a153
	UsbdPipeTypeInterrupt
Packit Service b0a153
} USBD_PIPE_TYPE;
Packit Service b0a153
Packit Service b0a153
#include <pshpack1.h>
Packit Service b0a153
Packit Service b0a153
typedef struct _WINUSB_SETUP_PACKET {
Packit Service b0a153
	UCHAR RequestType;
Packit Service b0a153
	UCHAR Request;
Packit Service b0a153
	USHORT Value;
Packit Service b0a153
	USHORT Index;
Packit Service b0a153
	USHORT Length;
Packit Service b0a153
} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
Packit Service b0a153
Packit Service b0a153
#include <poppack.h>
Packit Service b0a153
Packit Service b0a153
typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE;
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_AbortPipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	WINUSB_SETUP_PACKET SetupPacket,
Packit Service b0a153
	PUCHAR Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	PULONG LengthTransferred,
Packit Service b0a153
	LPOVERLAPPED Overlapped
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_FlushPipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_Free_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR AssociatedInterfaceIndex,
Packit Service b0a153
	PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_Initialize_t)(
Packit Service b0a153
	HANDLE DeviceHandle,
Packit Service b0a153
	PWINUSB_INTERFACE_HANDLE InterfaceHandle
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_ReadPipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	PUCHAR Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	PULONG LengthTransferred,
Packit Service b0a153
	LPOVERLAPPED Overlapped
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_ResetDevice_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_ResetPipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR AlternateSetting
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	ULONG PolicyType,
Packit Service b0a153
	ULONG ValueLength,
Packit Service b0a153
	PVOID Value
Packit Service b0a153
);
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_WritePipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	PUCHAR Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	PULONG LengthTransferred,
Packit Service b0a153
	LPOVERLAPPED Overlapped
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef PVOID WINUSB_ISOCH_BUFFER_HANDLE, *PWINUSB_ISOCH_BUFFER_HANDLE;
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_RegisterIsochBuffer_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	PVOID Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_UnregisterIsochBuffer_t)(
Packit Service b0a153
	WINUSB_ISOCH_BUFFER_HANDLE BufferHandle
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_WriteIsochPipeAsap_t)(
Packit Service b0a153
	WINUSB_ISOCH_BUFFER_HANDLE BufferHandle,
Packit Service b0a153
	ULONG Offset,
Packit Service b0a153
	ULONG Length,
Packit Service b0a153
	BOOL ContinueStream,
Packit Service b0a153
	LPOVERLAPPED Overlapped
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef LONG USBD_STATUS;
Packit Service b0a153
typedef struct {
Packit Service b0a153
	ULONG Offset;
Packit Service b0a153
	ULONG Length;
Packit Service b0a153
	USBD_STATUS Status;
Packit Service b0a153
} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR;
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_ReadIsochPipeAsap_t)(
Packit Service b0a153
	PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle,
Packit Service b0a153
	ULONG Offset,
Packit Service b0a153
	ULONG Length,
Packit Service b0a153
	BOOL ContinueStream,
Packit Service b0a153
	ULONG NumberOfPackets,
Packit Service b0a153
	PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors,
Packit Service b0a153
	LPOVERLAPPED Overlapped
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef struct {
Packit Service b0a153
	USBD_PIPE_TYPE PipeType;
Packit Service b0a153
	UCHAR PipeId;
Packit Service b0a153
	USHORT MaximumPacketSize;
Packit Service b0a153
	UCHAR Interval;
Packit Service b0a153
	ULONG MaximumBytesPerInterval;
Packit Service b0a153
} WINUSB_PIPE_INFORMATION_EX, *PWINUSB_PIPE_INFORMATION_EX;
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *WinUsb_QueryPipeEx_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR AlternateInterfaceHandle,
Packit Service b0a153
	UCHAR PipeIndex,
Packit Service b0a153
	PWINUSB_PIPE_INFORMATION_EX PipeInformationEx
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
/* /!\ These must match the ones from the official libusbk.h */
Packit Service b0a153
typedef enum _KUSB_FNID {
Packit Service b0a153
	KUSB_FNID_Init,
Packit Service b0a153
	KUSB_FNID_Free,
Packit Service b0a153
	KUSB_FNID_ClaimInterface,
Packit Service b0a153
	KUSB_FNID_ReleaseInterface,
Packit Service b0a153
	KUSB_FNID_SetAltInterface,
Packit Service b0a153
	KUSB_FNID_GetAltInterface,
Packit Service b0a153
	KUSB_FNID_GetDescriptor,
Packit Service b0a153
	KUSB_FNID_ControlTransfer,
Packit Service b0a153
	KUSB_FNID_SetPowerPolicy,
Packit Service b0a153
	KUSB_FNID_GetPowerPolicy,
Packit Service b0a153
	KUSB_FNID_SetConfiguration,
Packit Service b0a153
	KUSB_FNID_GetConfiguration,
Packit Service b0a153
	KUSB_FNID_ResetDevice,
Packit Service b0a153
	KUSB_FNID_Initialize,
Packit Service b0a153
	KUSB_FNID_SelectInterface,
Packit Service b0a153
	KUSB_FNID_GetAssociatedInterface,
Packit Service b0a153
	KUSB_FNID_Clone,
Packit Service b0a153
	KUSB_FNID_QueryInterfaceSettings,
Packit Service b0a153
	KUSB_FNID_QueryDeviceInformation,
Packit Service b0a153
	KUSB_FNID_SetCurrentAlternateSetting,
Packit Service b0a153
	KUSB_FNID_GetCurrentAlternateSetting,
Packit Service b0a153
	KUSB_FNID_QueryPipe,
Packit Service b0a153
	KUSB_FNID_SetPipePolicy,
Packit Service b0a153
	KUSB_FNID_GetPipePolicy,
Packit Service b0a153
	KUSB_FNID_ReadPipe,
Packit Service b0a153
	KUSB_FNID_WritePipe,
Packit Service b0a153
	KUSB_FNID_ResetPipe,
Packit Service b0a153
	KUSB_FNID_AbortPipe,
Packit Service b0a153
	KUSB_FNID_FlushPipe,
Packit Service b0a153
	KUSB_FNID_IsoReadPipe,
Packit Service b0a153
	KUSB_FNID_IsoWritePipe,
Packit Service b0a153
	KUSB_FNID_GetCurrentFrameNumber,
Packit Service b0a153
	KUSB_FNID_GetOverlappedResult,
Packit Service b0a153
	KUSB_FNID_GetProperty,
Packit Service b0a153
	KUSB_FNID_COUNT,
Packit Service b0a153
} KUSB_FNID;
Packit Service b0a153
Packit Service b0a153
typedef struct _KLIB_VERSION {
Packit Service b0a153
	INT Major;
Packit Service b0a153
	INT Minor;
Packit Service b0a153
	INT Micro;
Packit Service b0a153
	INT Nano;
Packit Service b0a153
} KLIB_VERSION, *PKLIB_VERSION;
Packit Service b0a153
Packit Service b0a153
typedef BOOL (WINAPI *LibK_GetProcAddress_t)(
Packit Service b0a153
	PVOID *ProcAddress,
Packit Service b0a153
	ULONG DriverID,
Packit Service b0a153
	ULONG FunctionID
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef VOID (WINAPI *LibK_GetVersion_t)(
Packit Service b0a153
	PKLIB_VERSION Version
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
//KISO_PACKET is equivalent of libusb_iso_packet_descriptor except uses absolute "offset" field instead of sequential Lengths
Packit Service b0a153
typedef struct _KISO_PACKET {
Packit Service b0a153
	UINT offset;
Packit Service b0a153
	USHORT actual_length; //changed from libusbk_shared.h "Length" for clarity
Packit Service b0a153
	USHORT status;
Packit Service b0a153
} KISO_PACKET, *PKISO_PACKET;
Packit Service b0a153
Packit Service b0a153
typedef enum _KISO_FLAG {
Packit Service b0a153
	KISO_FLAG_NONE = 0,
Packit Service b0a153
	KISO_FLAG_SET_START_FRAME = 0x00000001,
Packit Service b0a153
} KISO_FLAG;
Packit Service b0a153
Packit Service b0a153
//KISO_CONTEXT is the conceptual equivalent of libusb_transfer except is isochronous-specific and must match libusbk's version
Packit Service b0a153
typedef struct _KISO_CONTEXT {
Packit Service b0a153
	KISO_FLAG Flags;
Packit Service b0a153
	UINT StartFrame;
Packit Service b0a153
	SHORT ErrorCount;
Packit Service b0a153
	SHORT NumberOfPackets;
Packit Service b0a153
	UINT UrbHdrStatus;
Packit Service b0a153
	KISO_PACKET IsoPackets[0];
Packit Service b0a153
} KISO_CONTEXT, *PKISO_CONTEXT;
Packit Service b0a153
Packit Service b0a153
typedef BOOL(WINAPI *WinUsb_IsoReadPipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	PUCHAR Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	LPOVERLAPPED Overlapped,
Packit Service b0a153
	PKISO_CONTEXT IsoContext
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
typedef BOOL(WINAPI *WinUsb_IsoWritePipe_t)(
Packit Service b0a153
	WINUSB_INTERFACE_HANDLE InterfaceHandle,
Packit Service b0a153
	UCHAR PipeID,
Packit Service b0a153
	PUCHAR Buffer,
Packit Service b0a153
	ULONG BufferLength,
Packit Service b0a153
	LPOVERLAPPED Overlapped,
Packit Service b0a153
	PKISO_CONTEXT IsoContext
Packit Service b0a153
);
Packit Service b0a153
Packit Service b0a153
struct winusb_interface {
Packit Service b0a153
	bool initialized;
Packit Service b0a153
	bool CancelIoEx_supported;
Packit Service b0a153
	WinUsb_AbortPipe_t AbortPipe;
Packit Service b0a153
	WinUsb_ControlTransfer_t ControlTransfer;
Packit Service b0a153
	WinUsb_FlushPipe_t FlushPipe;
Packit Service b0a153
	WinUsb_Free_t Free;
Packit Service b0a153
	WinUsb_GetAssociatedInterface_t GetAssociatedInterface;
Packit Service b0a153
	WinUsb_Initialize_t Initialize;
Packit Service b0a153
	WinUsb_ReadPipe_t ReadPipe;
Packit Service b0a153
	WinUsb_ResetDevice_t ResetDevice;
Packit Service b0a153
	WinUsb_ResetPipe_t ResetPipe;
Packit Service b0a153
	WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting;
Packit Service b0a153
	WinUsb_SetPipePolicy_t SetPipePolicy;
Packit Service b0a153
	WinUsb_WritePipe_t WritePipe;
Packit Service b0a153
Packit Service b0a153
	// Isochoronous functions for LibUSBk sub api:
Packit Service b0a153
	WinUsb_IsoReadPipe_t IsoReadPipe;
Packit Service b0a153
	WinUsb_IsoWritePipe_t IsoWritePipe;
Packit Service b0a153
Packit Service b0a153
	// Isochronous functions for Microsoft WinUSB sub api (native WinUSB):
Packit Service b0a153
	WinUsb_RegisterIsochBuffer_t RegisterIsochBuffer;
Packit Service b0a153
	WinUsb_UnregisterIsochBuffer_t UnregisterIsochBuffer;
Packit Service b0a153
	WinUsb_WriteIsochPipeAsap_t WriteIsochPipeAsap;
Packit Service b0a153
	WinUsb_ReadIsochPipeAsap_t ReadIsochPipeAsap;
Packit Service b0a153
	WinUsb_QueryPipeEx_t QueryPipeEx;
Packit Service b0a153
};
Packit Service b0a153
Packit Service b0a153
/* hid.dll interface */
Packit Service b0a153
Packit Service b0a153
#define HIDP_STATUS_SUCCESS	0x110000
Packit Service b0a153
typedef void * PHIDP_PREPARSED_DATA;
Packit Service b0a153
Packit Service b0a153
#include <pshpack1.h>
Packit Service b0a153
Packit Service b0a153
typedef struct _HIDD_ATTIRBUTES {
Packit Service b0a153
	ULONG Size;
Packit Service b0a153
	USHORT VendorID;
Packit Service b0a153
	USHORT ProductID;
Packit Service b0a153
	USHORT VersionNumber;
Packit Service b0a153
} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
Packit Service b0a153
Packit Service b0a153
#include <poppack.h>
Packit Service b0a153
Packit Service b0a153
typedef USHORT USAGE;
Packit Service b0a153
typedef struct _HIDP_CAPS {
Packit Service b0a153
	USAGE Usage;
Packit Service b0a153
	USAGE UsagePage;
Packit Service b0a153
	USHORT InputReportByteLength;
Packit Service b0a153
	USHORT OutputReportByteLength;
Packit Service b0a153
	USHORT FeatureReportByteLength;
Packit Service b0a153
	USHORT Reserved[17];
Packit Service b0a153
	USHORT NumberLinkCollectionNodes;
Packit Service b0a153
	USHORT NumberInputButtonCaps;
Packit Service b0a153
	USHORT NumberInputValueCaps;
Packit Service b0a153
	USHORT NumberInputDataIndices;
Packit Service b0a153
	USHORT NumberOutputButtonCaps;
Packit Service b0a153
	USHORT NumberOutputValueCaps;
Packit Service b0a153
	USHORT NumberOutputDataIndices;
Packit Service b0a153
	USHORT NumberFeatureButtonCaps;
Packit Service b0a153
	USHORT NumberFeatureValueCaps;
Packit Service b0a153
	USHORT NumberFeatureDataIndices;
Packit Service b0a153
} HIDP_CAPS, *PHIDP_CAPS;
Packit Service b0a153
Packit Service b0a153
typedef enum _HIDP_REPORT_TYPE {
Packit Service b0a153
	HidP_Input,
Packit Service b0a153
	HidP_Output,
Packit Service b0a153
	HidP_Feature
Packit Service b0a153
} HIDP_REPORT_TYPE;
Packit Service b0a153
Packit Service b0a153
typedef struct _HIDP_VALUE_CAPS {
Packit Service b0a153
	USAGE UsagePage;
Packit Service b0a153
	UCHAR ReportID;
Packit Service b0a153
	BOOLEAN IsAlias;
Packit Service b0a153
	USHORT BitField;
Packit Service b0a153
	USHORT LinkCollection;
Packit Service b0a153
	USAGE LinkUsage;
Packit Service b0a153
	USAGE LinkUsagePage;
Packit Service b0a153
	BOOLEAN IsRange;
Packit Service b0a153
	BOOLEAN IsStringRange;
Packit Service b0a153
	BOOLEAN IsDesignatorRange;
Packit Service b0a153
	BOOLEAN IsAbsolute;
Packit Service b0a153
	BOOLEAN HasNull;
Packit Service b0a153
	UCHAR Reserved;
Packit Service b0a153
	USHORT BitSize;
Packit Service b0a153
	USHORT ReportCount;
Packit Service b0a153
	USHORT Reserved2[5];
Packit Service b0a153
	ULONG UnitsExp;
Packit Service b0a153
	ULONG Units;
Packit Service b0a153
	LONG LogicalMin, LogicalMax;
Packit Service b0a153
	LONG PhysicalMin, PhysicalMax;
Packit Service b0a153
	union {
Packit Service b0a153
		struct {
Packit Service b0a153
			USAGE UsageMin, UsageMax;
Packit Service b0a153
			USHORT StringMin, StringMax;
Packit Service b0a153
			USHORT DesignatorMin, DesignatorMax;
Packit Service b0a153
			USHORT DataIndexMin, DataIndexMax;
Packit Service b0a153
		} Range;
Packit Service b0a153
		struct {
Packit Service b0a153
			USAGE Usage, Reserved1;
Packit Service b0a153
			USHORT StringIndex, Reserved2;
Packit Service b0a153
			USHORT DesignatorIndex, Reserved3;
Packit Service b0a153
			USHORT DataIndex, Reserved4;
Packit Service b0a153
		} NotRange;
Packit Service b0a153
	} u;
Packit Service b0a153
} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;
Packit Service b0a153
Packit Service b0a153
DLL_DECLARE_HANDLE(hid);
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetIndexedString, (HANDLE, ULONG, PVOID, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE));
Packit Service b0a153
DLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA));