Index: third_party/libusb/src/libusb/os/windows_usb.h |
diff --git a/third_party/libusb/src/libusb/os/windows_usb.h b/third_party/libusb/src/libusb/os/windows_usb.h |
index 7c2fae55ae9f5676f1637383ab0cc740f2124911..5d67a562e80acb418e14f8ed60cdf88a89c38933 100644 |
--- a/third_party/libusb/src/libusb/os/windows_usb.h |
+++ b/third_party/libusb/src/libusb/os/windows_usb.h |
@@ -1,6 +1,6 @@ |
/* |
- * Windows backend for libusb 1.0 |
- * Copyright (C) 2009-2010 Pete Batard <pbatard@gmail.com> |
+ * Windows backend for libusbx 1.0 |
+ * Copyright © 2009-2012 Pete Batard <pete@akeo.ie> |
* With contributions from Michael Plante, Orin Eman et al. |
* Parts of this code adapted from libusb-win32-v1 by Stephan Meyer |
* Major code testing contribution by Xiaofan Chen |
@@ -22,6 +22,8 @@ |
#pragma once |
+#include "windows_common.h" |
+ |
#if defined(_MSC_VER) |
// disable /W4 MSVC warnings that are benign |
#pragma warning(disable:4127) // conditional expression is constant |
@@ -30,17 +32,6 @@ |
#pragma warning(disable:4201) // nameless struct/union |
#endif |
-// Windows API default is uppercase - ugh! |
-#if !defined(bool) |
-#define bool BOOL |
-#endif |
-#if !defined(true) |
-#define true TRUE |
-#endif |
-#if !defined(false) |
-#define false FALSE |
-#endif |
- |
// Missing from MSVC6 setupapi.h |
#if !defined(SPDRP_ADDRESS) |
#define SPDRP_ADDRESS 28 |
@@ -50,45 +41,30 @@ |
#endif |
#if defined(__CYGWIN__ ) |
+#define _stricmp stricmp |
// cygwin produces a warning unless these prototypes are defined |
extern int _snprintf(char *buffer, size_t count, const char *format, ...); |
extern char *_strdup(const char *strSource); |
// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread |
#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, f) |
#endif |
-#define safe_free(p) do {if (p != NULL) {free((void*)p); p = NULL;}} while(0) |
-#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) |
-#define safe_min(a, b) min((size_t)(a), (size_t)(b)) |
-#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \ |
- ((char*)dst)[safe_min(count, dst_max)-1] = 0;} while(0) |
-#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1) |
-#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, dst_max - safe_strlen(dst) - 1)) |
-#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1) |
-#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2)) |
-#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count) |
-#define safe_strlen(str) ((str==NULL)?0:strlen(str)) |
-#define safe_sprintf _snprintf |
-#define safe_unref_device(dev) do {if (dev != NULL) {libusb_unref_device(dev); dev = NULL;}} while(0) |
-#define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL) |
-static inline void upperize(char* str) { |
- size_t i; |
- if (str == NULL) return; |
- for (i=0; i<safe_strlen(str); i++) |
- str[i] = (char)toupper((int)str[i]); |
-} |
#define MAX_CTRL_BUFFER_LENGTH 4096 |
#define MAX_USB_DEVICES 256 |
#define MAX_USB_STRING_LENGTH 128 |
+#define MAX_HID_REPORT_SIZE 1024 |
+#define MAX_HID_DESCRIPTOR_SIZE 256 |
#define MAX_GUID_STRING_LENGTH 40 |
#define MAX_PATH_LENGTH 128 |
#define MAX_KEY_LENGTH 256 |
-#define MAX_TIMER_SEMAPHORES 128 |
-#define TIMER_REQUEST_RETRY_MS 100 |
-#define ERR_BUFFER_SIZE 256 |
#define LIST_SEPARATOR ';' |
#define HTAB_SIZE 1021 |
+// Handle code for HID interface that have been claimed ("dibs") |
+#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) |
+// Additional return code for HID operations that completed synchronously |
+#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) |
+ |
// http://msdn.microsoft.com/en-us/library/ff545978.aspx |
// http://msdn.microsoft.com/en-us/library/ff545972.aspx |
// http://msdn.microsoft.com/en-us/library/ff545982.aspx |
@@ -101,7 +77,9 @@ const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0 |
#if !defined(GUID_DEVINTERFACE_USB_HUB) |
const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; |
#endif |
-static const GUID GUID_NULL = { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; |
+#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) |
+const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; |
+#endif |
/* |
@@ -110,34 +88,43 @@ static const GUID GUID_NULL = { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0 |
#define USB_API_UNSUPPORTED 0 |
#define USB_API_HUB 1 |
#define USB_API_COMPOSITE 2 |
-#define USB_API_WINUSB 3 |
-#define USB_API_MAX 4 |
- |
-#define CLASS_GUID_UNSUPPORTED GUID_NULL |
-const GUID CLASS_GUID_LIBUSB_WINUSB = { 0x78A1C341, 0x4539, 0x11D3, {0xB8, 0x8D, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71} }; |
-const GUID CLASS_GUID_COMPOSITE = { 0x36FC9E60, 0xC465, 0x11cF, {0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} }; |
+#define USB_API_WINUSBX 3 |
+#define USB_API_HID 4 |
+#define USB_API_MAX 5 |
+// The following is used to indicate if the HID or composite extra props have already been set. |
+#define USB_API_SET (1<<USB_API_MAX) |
+ |
+// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) |
+// Must have the same values as the KUSB_DRVID enum from libusbk.h |
+#define SUB_API_NOTSET -1 |
+#define SUB_API_LIBUSBK 0 |
+#define SUB_API_LIBUSB0 1 |
+#define SUB_API_WINUSB 2 |
+#define SUB_API_MAX 3 |
+ |
+#define WINUSBX_DRV_NAMES { "libusbK", "libusb0", "WinUSB"} |
struct windows_usb_api_backend { |
const uint8_t id; |
const char* designation; |
- const GUID *class_guid; // The Class GUID (for fallback in case the driver name cannot be read) |
const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" |
const uint8_t nb_driver_names; |
- int (*init)(struct libusb_context *ctx); |
- int (*exit)(void); |
- int (*open)(struct libusb_device_handle *dev_handle); |
- void (*close)(struct libusb_device_handle *dev_handle); |
- int (*claim_interface)(struct libusb_device_handle *dev_handle, int iface); |
- int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle, int iface, int altsetting); |
- int (*release_interface)(struct libusb_device_handle *dev_handle, int iface); |
- int (*clear_halt)(struct libusb_device_handle *dev_handle, unsigned char endpoint); |
- int (*reset_device)(struct libusb_device_handle *dev_handle); |
- int (*submit_bulk_transfer)(struct usbi_transfer *itransfer); |
- int (*submit_iso_transfer)(struct usbi_transfer *itransfer); |
- int (*submit_control_transfer)(struct usbi_transfer *itransfer); |
- int (*abort_control)(struct usbi_transfer *itransfer); |
- int (*abort_transfers)(struct usbi_transfer *itransfer); |
- int (*copy_transfer_data)(struct usbi_transfer *itransfer, uint32_t io_size); |
+ int (*init)(int sub_api, struct libusb_context *ctx); |
+ int (*exit)(int sub_api); |
+ int (*open)(int sub_api, struct libusb_device_handle *dev_handle); |
+ void (*close)(int sub_api, struct libusb_device_handle *dev_handle); |
+ int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); |
+ int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); |
+ int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); |
+ int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); |
+ int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); |
+ int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); |
+ int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); |
+ int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); |
+ int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); |
+ int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); |
+ int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); |
+ int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); |
}; |
extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; |
@@ -151,21 +138,90 @@ extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; |
* private structures definition |
* with inline pseudo constructors/destructors |
*/ |
+ |
+// TODO (v2+): move hid desc to libusb.h? |
+struct libusb_hid_descriptor { |
+ uint8_t bLength; |
+ uint8_t bDescriptorType; |
+ uint16_t bcdHID; |
+ uint8_t bCountryCode; |
+ uint8_t bNumDescriptors; |
+ uint8_t bClassDescriptorType; |
+ uint16_t wClassDescriptorLength; |
+}; |
+#define LIBUSB_DT_HID_SIZE 9 |
+#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ |
+ + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) |
+#define HID_MAX_REPORT_SIZE 1024 |
+#define HID_IN_EP 0x81 |
+#define HID_OUT_EP 0x02 |
+#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) |
+#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) |
+#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) |
+#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) |
+ |
+// The following are used for HID reports IOCTLs |
+#define HID_CTL_CODE(id) \ |
+ CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) |
+#define HID_BUFFER_CTL_CODE(id) \ |
+ CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) |
+#define HID_IN_CTL_CODE(id) \ |
+ CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) |
+#define HID_OUT_CTL_CODE(id) \ |
+ CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) |
+ |
+#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) |
+#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) |
+#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) |
+#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) |
+ |
+enum libusb_hid_request_type { |
+ HID_REQ_GET_REPORT = 0x01, |
+ HID_REQ_GET_IDLE = 0x02, |
+ HID_REQ_GET_PROTOCOL = 0x03, |
+ HID_REQ_SET_REPORT = 0x09, |
+ HID_REQ_SET_IDLE = 0x0A, |
+ HID_REQ_SET_PROTOCOL = 0x0B |
+}; |
+ |
+enum libusb_hid_report_type { |
+ HID_REPORT_TYPE_INPUT = 0x01, |
+ HID_REPORT_TYPE_OUTPUT = 0x02, |
+ HID_REPORT_TYPE_FEATURE = 0x03 |
+}; |
+ |
+struct hid_device_priv { |
+ uint16_t vid; |
+ uint16_t pid; |
+ uint8_t config; |
+ uint8_t nb_interfaces; |
+ bool uses_report_ids[3]; // input, ouptput, feature |
+ uint16_t input_report_size; |
+ uint16_t output_report_size; |
+ uint16_t feature_report_size; |
+ WCHAR string[3][MAX_USB_STRING_LENGTH]; |
+ uint8_t string_index[3]; // man, prod, ser |
+}; |
+ |
typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; |
struct windows_device_priv { |
uint8_t depth; // distance to HCD |
uint8_t port; // port number on the hub |
+ uint8_t active_config; |
struct libusb_device *parent_dev; // access to parent is required for usermode ops |
- char *path; // device interface path |
struct windows_usb_api_backend const *apib; |
+ char *path; // device interface path |
+ int sub_api; // for WinUSB-like APIs |
struct { |
char *path; // each interface needs a device interface path, |
struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), |
+ int sub_api; |
int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) |
uint8_t *endpoint; |
+ bool restricted_functionality; // indicates if the interface functionality is restricted |
+ // by Windows (eg. HID keyboards or mice cannot do R/W) |
} usb_interface[USB_MAXINTERFACES]; |
- uint8_t composite_api_flags; // composite devices require additional data |
- uint8_t active_config; |
+ struct hid_device_priv *hid; |
USB_DEVICE_DESCRIPTOR dev_descriptor; |
unsigned char **config_descriptor; // list of pointers to the cached config descriptors |
}; |
@@ -182,15 +238,18 @@ static inline void windows_device_priv_init(libusb_device* dev) { |
p->parent_dev = NULL; |
p->path = NULL; |
p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; |
- p->composite_api_flags = 0; |
+ p->sub_api = SUB_API_NOTSET; |
+ p->hid = NULL; |
p->active_config = 0; |
p->config_descriptor = NULL; |
memset(&(p->dev_descriptor), 0, sizeof(USB_DEVICE_DESCRIPTOR)); |
for (i=0; i<USB_MAXINTERFACES; i++) { |
p->usb_interface[i].path = NULL; |
p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; |
+ p->usb_interface[i].sub_api = SUB_API_NOTSET; |
p->usb_interface[i].nb_endpoints = 0; |
p->usb_interface[i].endpoint = NULL; |
+ p->usb_interface[i].restricted_functionality = false; |
} |
} |
@@ -203,6 +262,7 @@ static inline void windows_device_priv_release(libusb_device* dev) { |
safe_free(p->config_descriptor[i]); |
} |
safe_free(p->config_descriptor); |
+ safe_free(p->hid); |
for (i=0; i<USB_MAXINTERFACES; i++) { |
safe_free(p->usb_interface[i].path); |
safe_free(p->usb_interface[i].endpoint); |
@@ -230,6 +290,9 @@ static inline struct windows_device_handle_priv *_device_handle_priv( |
struct windows_transfer_priv { |
struct winfd pollable_fd; |
uint8_t interface_number; |
+ uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID |
+ uint8_t *hid_dest; // transfer buffer destination, required for HID |
+ size_t hid_expected_size; |
}; |
// used to match a device driver (including filter drivers) against a supported API |
@@ -239,37 +302,6 @@ struct driver_lookup { |
const char* designation; // internal designation (for debug output) |
}; |
-/* |
- * API macros - from libusb-win32 1.x |
- */ |
-#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args) \ |
- typedef ret (api * __dll_##name##_t)args; \ |
- static __dll_##name##_t prefixname = NULL |
- |
-#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ |
- do { \ |
- HMODULE h = GetModuleHandleA(#dll); \ |
- if (!h) \ |
- h = LoadLibraryA(#dll); \ |
- if (!h) { \ |
- if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; }\ |
- else { break; } \ |
- } \ |
- prefixname = (__dll_##name##_t)GetProcAddress(h, #name); \ |
- if (prefixname) break; \ |
- prefixname = (__dll_##name##_t)GetProcAddress(h, #name "A"); \ |
- if (prefixname) break; \ |
- prefixname = (__dll_##name##_t)GetProcAddress(h, #name "W"); \ |
- if (prefixname) break; \ |
- if(ret_on_failure) \ |
- return LIBUSB_ERROR_NOT_FOUND; \ |
- } while(0) |
- |
-#define DLL_DECLARE(api, ret, name, args) DLL_DECLARE_PREFIXNAME(api, ret, name, name, args) |
-#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure) |
-#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args) DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args) |
-#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure) |
- |
/* OLE32 dependency */ |
DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); |
@@ -284,6 +316,7 @@ DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); |
DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); |
DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, |
PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); |
+DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); |
DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); |
DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); |
@@ -589,20 +622,297 @@ typedef struct { |
typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_Initialize, (HANDLE, PWINUSB_INTERFACE_HANDLE)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_Free, (WINUSB_INTERFACE_HANDLE)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_GetAssociatedInterface, (WINUSB_INTERFACE_HANDLE, UCHAR, PWINUSB_INTERFACE_HANDLE)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_GetDescriptor, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, USHORT, PUCHAR, ULONG, PULONG)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryInterfaceSettings, (WINUSB_INTERFACE_HANDLE, UCHAR, PUSB_INTERFACE_DESCRIPTOR)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryDeviceInformation, (WINUSB_INTERFACE_HANDLE, ULONG, PULONG, PVOID)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_SetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, UCHAR)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_GetCurrentAlternateSetting, (WINUSB_INTERFACE_HANDLE, PUCHAR)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_QueryPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, UCHAR, PWINUSB_PIPE_INFORMATION)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_SetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, ULONG, PVOID)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_GetPipePolicy, (WINUSB_INTERFACE_HANDLE, UCHAR, ULONG, PULONG, PVOID)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_ReadPipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_WritePipe, (WINUSB_INTERFACE_HANDLE, UCHAR, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_ControlTransfer, (WINUSB_INTERFACE_HANDLE, WINUSB_SETUP_PACKET, PUCHAR, ULONG, PULONG, LPOVERLAPPED)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_ResetPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_AbortPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); |
-DLL_DECLARE(WINAPI, BOOL, WinUsb_FlushPipe, (WINUSB_INTERFACE_HANDLE, UCHAR)); |
+typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID |
+); |
+typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ WINUSB_SETUP_PACKET SetupPacket, |
+ PUCHAR Buffer, |
+ ULONG BufferLength, |
+ PULONG LengthTransferred, |
+ LPOVERLAPPED Overlapped |
+); |
+typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID |
+); |
+typedef BOOL (WINAPI *WinUsb_Free_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle |
+); |
+typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR AssociatedInterfaceIndex, |
+ PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle |
+); |
+typedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ PUCHAR AlternateSetting |
+); |
+typedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR DescriptorType, |
+ UCHAR Index, |
+ USHORT LanguageID, |
+ PUCHAR Buffer, |
+ ULONG BufferLength, |
+ PULONG LengthTransferred |
+); |
+typedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ LPOVERLAPPED lpOverlapped, |
+ LPDWORD lpNumberOfBytesTransferred, |
+ BOOL bWait |
+); |
+typedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID, |
+ ULONG PolicyType, |
+ PULONG ValueLength, |
+ PVOID Value |
+); |
+typedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ ULONG PolicyType, |
+ PULONG ValueLength, |
+ PVOID Value |
+); |
+typedef BOOL (WINAPI *WinUsb_Initialize_t)( |
+ HANDLE DeviceHandle, |
+ PWINUSB_INTERFACE_HANDLE InterfaceHandle |
+); |
+typedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ ULONG InformationType, |
+ PULONG BufferLength, |
+ PVOID Buffer |
+); |
+typedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR AlternateSettingNumber, |
+ PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor |
+); |
+typedef BOOL (WINAPI *WinUsb_QueryPipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR AlternateInterfaceNumber, |
+ UCHAR PipeIndex, |
+ PWINUSB_PIPE_INFORMATION PipeInformation |
+); |
+typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID, |
+ PUCHAR Buffer, |
+ ULONG BufferLength, |
+ PULONG LengthTransferred, |
+ LPOVERLAPPED Overlapped |
+); |
+typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID |
+); |
+typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR AlternateSetting |
+); |
+typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID, |
+ ULONG PolicyType, |
+ ULONG ValueLength, |
+ PVOID Value |
+); |
+typedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ ULONG PolicyType, |
+ ULONG ValueLength, |
+ PVOID Value |
+); |
+typedef BOOL (WINAPI *WinUsb_WritePipe_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle, |
+ UCHAR PipeID, |
+ PUCHAR Buffer, |
+ ULONG BufferLength, |
+ PULONG LengthTransferred, |
+ LPOVERLAPPED Overlapped |
+); |
+typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( |
+ WINUSB_INTERFACE_HANDLE InterfaceHandle |
+); |
+ |
+/* /!\ These must match the ones from the official libusbk.h */ |
+typedef enum _KUSB_FNID |
+{ |
+ KUSB_FNID_Init, |
+ KUSB_FNID_Free, |
+ KUSB_FNID_ClaimInterface, |
+ KUSB_FNID_ReleaseInterface, |
+ KUSB_FNID_SetAltInterface, |
+ KUSB_FNID_GetAltInterface, |
+ KUSB_FNID_GetDescriptor, |
+ KUSB_FNID_ControlTransfer, |
+ KUSB_FNID_SetPowerPolicy, |
+ KUSB_FNID_GetPowerPolicy, |
+ KUSB_FNID_SetConfiguration, |
+ KUSB_FNID_GetConfiguration, |
+ KUSB_FNID_ResetDevice, |
+ KUSB_FNID_Initialize, |
+ KUSB_FNID_SelectInterface, |
+ KUSB_FNID_GetAssociatedInterface, |
+ KUSB_FNID_Clone, |
+ KUSB_FNID_QueryInterfaceSettings, |
+ KUSB_FNID_QueryDeviceInformation, |
+ KUSB_FNID_SetCurrentAlternateSetting, |
+ KUSB_FNID_GetCurrentAlternateSetting, |
+ KUSB_FNID_QueryPipe, |
+ KUSB_FNID_SetPipePolicy, |
+ KUSB_FNID_GetPipePolicy, |
+ KUSB_FNID_ReadPipe, |
+ KUSB_FNID_WritePipe, |
+ KUSB_FNID_ResetPipe, |
+ KUSB_FNID_AbortPipe, |
+ KUSB_FNID_FlushPipe, |
+ KUSB_FNID_IsoReadPipe, |
+ KUSB_FNID_IsoWritePipe, |
+ KUSB_FNID_GetCurrentFrameNumber, |
+ KUSB_FNID_GetOverlappedResult, |
+ KUSB_FNID_GetProperty, |
+ KUSB_FNID_COUNT, |
+} KUSB_FNID; |
+ |
+typedef struct _KLIB_VERSION { |
+ INT Major; |
+ INT Minor; |
+ INT Micro; |
+ INT Nano; |
+} KLIB_VERSION; |
+typedef KLIB_VERSION* PKLIB_VERSION; |
+ |
+typedef BOOL (WINAPI *LibK_GetProcAddress_t)( |
+ PVOID* ProcAddress, |
+ ULONG DriverID, |
+ ULONG FunctionID |
+); |
+ |
+typedef VOID (WINAPI *LibK_GetVersion_t)( |
+ PKLIB_VERSION Version |
+); |
+ |
+struct winusb_interface { |
+ bool initialized; |
+ WinUsb_AbortPipe_t AbortPipe; |
+ WinUsb_ControlTransfer_t ControlTransfer; |
+ WinUsb_FlushPipe_t FlushPipe; |
+ WinUsb_Free_t Free; |
+ WinUsb_GetAssociatedInterface_t GetAssociatedInterface; |
+ WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; |
+ WinUsb_GetDescriptor_t GetDescriptor; |
+ WinUsb_GetOverlappedResult_t GetOverlappedResult; |
+ WinUsb_GetPipePolicy_t GetPipePolicy; |
+ WinUsb_GetPowerPolicy_t GetPowerPolicy; |
+ WinUsb_Initialize_t Initialize; |
+ WinUsb_QueryDeviceInformation_t QueryDeviceInformation; |
+ WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; |
+ WinUsb_QueryPipe_t QueryPipe; |
+ WinUsb_ReadPipe_t ReadPipe; |
+ WinUsb_ResetPipe_t ResetPipe; |
+ WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; |
+ WinUsb_SetPipePolicy_t SetPipePolicy; |
+ WinUsb_SetPowerPolicy_t SetPowerPolicy; |
+ WinUsb_WritePipe_t WritePipe; |
+ WinUsb_ResetDevice_t ResetDevice; |
+}; |
+ |
+/* hid.dll interface */ |
+ |
+#define HIDP_STATUS_SUCCESS 0x110000 |
+typedef void* PHIDP_PREPARSED_DATA; |
+ |
+#pragma pack(1) |
+typedef struct { |
+ ULONG Size; |
+ USHORT VendorID; |
+ USHORT ProductID; |
+ USHORT VersionNumber; |
+} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; |
+#pragma pack() |
+ |
+typedef USHORT USAGE; |
+typedef struct { |
+ USAGE Usage; |
+ USAGE UsagePage; |
+ USHORT InputReportByteLength; |
+ USHORT OutputReportByteLength; |
+ USHORT FeatureReportByteLength; |
+ USHORT Reserved[17]; |
+ USHORT NumberLinkCollectionNodes; |
+ USHORT NumberInputButtonCaps; |
+ USHORT NumberInputValueCaps; |
+ USHORT NumberInputDataIndices; |
+ USHORT NumberOutputButtonCaps; |
+ USHORT NumberOutputValueCaps; |
+ USHORT NumberOutputDataIndices; |
+ USHORT NumberFeatureButtonCaps; |
+ USHORT NumberFeatureValueCaps; |
+ USHORT NumberFeatureDataIndices; |
+} HIDP_CAPS, *PHIDP_CAPS; |
+ |
+typedef enum _HIDP_REPORT_TYPE { |
+ HidP_Input, |
+ HidP_Output, |
+ HidP_Feature |
+} HIDP_REPORT_TYPE; |
+ |
+typedef struct _HIDP_VALUE_CAPS { |
+ USAGE UsagePage; |
+ UCHAR ReportID; |
+ BOOLEAN IsAlias; |
+ USHORT BitField; |
+ USHORT LinkCollection; |
+ USAGE LinkUsage; |
+ USAGE LinkUsagePage; |
+ BOOLEAN IsRange; |
+ BOOLEAN IsStringRange; |
+ BOOLEAN IsDesignatorRange; |
+ BOOLEAN IsAbsolute; |
+ BOOLEAN HasNull; |
+ UCHAR Reserved; |
+ USHORT BitSize; |
+ USHORT ReportCount; |
+ USHORT Reserved2[5]; |
+ ULONG UnitsExp; |
+ ULONG Units; |
+ LONG LogicalMin, LogicalMax; |
+ LONG PhysicalMin, PhysicalMax; |
+ union { |
+ struct { |
+ USAGE UsageMin, UsageMax; |
+ USHORT StringMin, StringMax; |
+ USHORT DesignatorMin, DesignatorMax; |
+ USHORT DataIndexMin, DataIndexMax; |
+ } Range; |
+ struct { |
+ USAGE Usage, Reserved1; |
+ USHORT StringIndex, Reserved2; |
+ USHORT DesignatorIndex, Reserved3; |
+ USHORT DataIndex, Reserved4; |
+ } NotRange; |
+ } u; |
+} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; |
+ |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); |
+DLL_DECLARE(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); |
+DLL_DECLARE(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); |
+DLL_DECLARE(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); |