21 #include "../../SDL_internal.h"
23 #ifdef SDL_JOYSTICK_HIDAPI
30 #include "../SDL_sysjoystick.h"
35 #ifdef SDL_JOYSTICK_HIDAPI_XBOXONE
43 #define CONTROLLER_NEGOTIATION_TIMEOUT_MS 300
44 #define CONTROLLER_PREPARE_INPUT_TIMEOUT_MS 50
48 static const Uint8 xboxone_init0[] = {
49 0x04, 0x20, 0x00, 0x00
52 static const Uint8 xboxone_init1[] = {
53 0x05, 0x20, 0x00, 0x0F, 0x06, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x55, 0x53, 0x00, 0x00, 0x00,
58 static const Uint8 xboxone_init2[] = {
59 0x05, 0x20, 0x03, 0x01, 0x00
62 static const Uint8 xboxone_init3[] = {
63 0x0A, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14
66 static const Uint8 xboxone_init4[] = {
67 0x06, 0x20, 0x00, 0x02, 0x01, 0x00
70 static const Uint8 xboxone_init5[] = {
71 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
72 0x00, 0x00, 0xFF, 0x00, 0xEB
88 const Uint8 response[2];
89 } SDL_DriverXboxOne_InitPacket;
92 static const SDL_DriverXboxOne_InitPacket xboxone_init_packets[] = {
93 { 0x0000, 0x0000, 0x0000, 0x0000, xboxone_init0,
sizeof(xboxone_init0), { 0x04, 0xb0 } },
94 { 0x0000, 0x0000, 0x0000, 0x0000, xboxone_init1,
sizeof(xboxone_init1), { 0x00, 0x00 } },
95 { 0x0000, 0x0000, 0x0000, 0x0000, xboxone_init2,
sizeof(xboxone_init2), { 0x00, 0x00 } },
96 { 0x0000, 0x0000, 0x0000, 0x0000, xboxone_init3,
sizeof(xboxone_init3), { 0x00, 0x00 } },
101 { 0x0000, 0x0000, 0x045e, 0x0000, xboxone_init4,
sizeof(xboxone_init4), { 0x00, 0x00 } },
102 { 0x0000, 0x0000, 0x045e, 0x0000, xboxone_init5,
sizeof(xboxone_init5), { 0x00, 0x00 } },
106 XBOX_ONE_INIT_STATE_START_NEGOTIATING = 0,
107 XBOX_ONE_INIT_STATE_NEGOTIATING = 1,
108 XBOX_ONE_INIT_STATE_PREPARE_INPUT = 2,
109 XBOX_ONE_INIT_STATE_COMPLETE = 3
110 } SDL_XboxOneInitState;
116 SDL_XboxOneInitState init_state;
126 Uint8 low_frequency_rumble;
127 Uint8 high_frequency_rumble;
128 Uint8 left_trigger_rumble;
129 Uint8 right_trigger_rumble;
130 } SDL_DriverXboxOne_Context;
134 IsBluetoothXboxOneController(
Uint16 vendor_id,
Uint16 product_id)
149 ControllerHasPaddles(
Uint16 vendor_id,
Uint16 product_id)
155 ControllerHasTriggerRumble(
Uint16 vendor_id,
Uint16 product_id)
161 ControllerHasShareButton(
Uint16 vendor_id,
Uint16 product_id)
167 SetInitState(SDL_DriverXboxOne_Context *
ctx, SDL_XboxOneInitState
state)
169 #ifdef DEBUG_JOYSTICK
181 if ((
data[1] & 0x30) == 0x30) {
182 Uint8 ack_packet[] = { 0x01, 0x20,
data[2], 0x09, 0x00,
data[0], 0x20,
data[3], 0x00, 0x00, 0x00, 0x00, 0x00 };
185 if (
data[0] == 0x04 &&
data[1] == 0xF0) {
186 ack_packet[11] = 0x80;
189 #ifdef DEBUG_XBOX_PROTOCOL
190 HIDAPI_DumpPacket(
"Xbox One sending ACK packet: size = %d", ack_packet,
sizeof(ack_packet));
201 Uint8 serial_packet[] = { 0x1E, 0x30, 0x07, 0x01, 0x04 };
210 if (SDL_HIDAPI_LockRumble() < 0 ||
211 SDL_HIDAPI_SendRumbleAndUnlock(
device, serial_packet,
sizeof(serial_packet)) !=
sizeof(serial_packet)) {
220 ControllerNeedsNegotiation(SDL_DriverXboxOne_Context *
ctx)
237 const SDL_DriverXboxOne_InitPacket *packet = &xboxone_init_packets[
ctx->init_packet];
239 if (packet->vendor_id && (vendor_id != packet->vendor_id)) {
243 if (packet->product_id && (product_id != packet->product_id)) {
247 if (packet->exclude_vendor_id && (vendor_id == packet->exclude_vendor_id)) {
251 if (packet->exclude_product_id && (product_id == packet->exclude_product_id)) {
255 SDL_memcpy(init_packet, packet->data, packet->size);
256 if (init_packet[0] != 0x01) {
257 init_packet[2] =
ctx->sequence++;
259 #ifdef DEBUG_XBOX_PROTOCOL
260 HIDAPI_DumpPacket(
"Xbox One sending INIT packet: size = %d", init_packet, packet->size);
264 if (SDL_HIDAPI_LockRumble() < 0 ||
265 SDL_HIDAPI_SendRumbleAndUnlock(
device, init_packet, packet->size) != packet->size) {
266 SDL_SetError(
"Couldn't write Xbox One initialization packet");
270 if (packet->response[0]) {
276 SetInitState(
ctx, XBOX_ONE_INIT_STATE_PREPARE_INPUT);
292 if (!IsBluetoothXboxOneController(vendor_id, product_id)) {
300 HIDAPI_DriverXboxOne_GetDeviceName(
Uint16 vendor_id,
Uint16 product_id)
328 SDL_DriverXboxOne_Context *
ctx;
346 ctx->bluetooth = IsBluetoothXboxOneController(
device->vendor_id,
device->product_id);
349 ctx->has_paddles = ControllerHasPaddles(
ctx->vendor_id,
ctx->product_id);
350 ctx->has_trigger_rumble = ControllerHasTriggerRumble(
ctx->vendor_id,
ctx->product_id);
351 ctx->has_share_button = ControllerHasShareButton(
ctx->vendor_id,
ctx->product_id);
354 if (ControllerNeedsNegotiation(
ctx)) {
355 ctx->init_state = XBOX_ONE_INIT_STATE_START_NEGOTIATING;
357 ctx->init_state = XBOX_ONE_INIT_STATE_COMPLETE;
360 #ifdef DEBUG_JOYSTICK
366 if (
ctx->has_share_button) {
369 if (
ctx->has_paddles) {
374 if (!
ctx->bluetooth) {
384 SDL_DriverXboxOne_Context *
ctx = (SDL_DriverXboxOne_Context *)
device->context;
386 if (
ctx->bluetooth) {
387 Uint8 rumble_packet[] = { 0x03, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xEB };
389 rumble_packet[2] =
ctx->left_trigger_rumble;
390 rumble_packet[3] =
ctx->right_trigger_rumble;
391 rumble_packet[4] =
ctx->low_frequency_rumble;
392 rumble_packet[5] =
ctx->high_frequency_rumble;
394 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
398 Uint8 rumble_packet[] = { 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xEB };
400 rumble_packet[6] =
ctx->left_trigger_rumble;
401 rumble_packet[7] =
ctx->right_trigger_rumble;
402 rumble_packet[8] =
ctx->low_frequency_rumble;
403 rumble_packet[9] =
ctx->high_frequency_rumble;
405 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
415 SDL_DriverXboxOne_Context *
ctx = (SDL_DriverXboxOne_Context *)
device->context;
418 ctx->low_frequency_rumble = low_frequency_rumble / 655;
419 ctx->high_frequency_rumble = high_frequency_rumble / 655;
421 return HIDAPI_DriverXboxOne_UpdateRumble(
device);
427 SDL_DriverXboxOne_Context *
ctx = (SDL_DriverXboxOne_Context *)
device->context;
429 if (!
ctx->has_trigger_rumble) {
434 ctx->left_trigger_rumble = left_rumble / 655;
435 ctx->right_trigger_rumble = right_rumble / 655;
437 return HIDAPI_DriverXboxOne_UpdateRumble(
device);
460 HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
464 if (
ctx->last_state[4] !=
data[4]) {
473 if (
ctx->last_state[5] !=
data[5]) {
490 if (
ctx->has_share_button) {
492 if (
ctx->last_state[18] !=
data[18]) {
497 if (
ctx->last_state[22] !=
data[22]) {
512 if (
ctx->has_paddles && (
size == 33 ||
size == 38)) {
538 paddles_mapped = (
data[19] != 0);
540 #ifdef DEBUG_XBOX_PROTOCOL
541 SDL_Log(
">>> Paddles: %d,%d,%d,%d mapped = %s\n",
542 (
data[paddle_index] & button1_bit) ? 1 : 0,
543 (
data[paddle_index] & button2_bit) ? 1 : 0,
544 (
data[paddle_index] & button3_bit) ? 1 : 0,
545 (
data[paddle_index] & button4_bit) ? 1 : 0,
546 paddles_mapped ?
"TRUE" :
"FALSE"
550 if (paddles_mapped) {
552 data[paddle_index] = 0;
555 if (
ctx->last_state[paddle_index] !=
data[paddle_index]) {
568 if (
axis == -32768 &&
size == 30 && (
data[22] & 0x80) != 0) {
574 if (
axis == -32768 &&
size == 30 && (
data[22] & 0x40) != 0) {
595 HIDAPI_DriverXboxOne_HandleModePacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
604 HIDAPI_DriverXboxOneBluetooth_HandleButtons16(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
606 if (
ctx->last_state[14] !=
data[14]) {
617 if (
ctx->last_state[15] !=
data[15]) {
631 HIDAPI_DriverXboxOneBluetooth_HandleButtons(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
633 if (
ctx->last_state[14] !=
data[14]) {
642 if (
ctx->last_state[15] !=
data[15]) {
643 if (
ctx->has_share_button) {
646 }
else if (!
ctx->has_guide_packet) {
654 if (
ctx->last_state[16] !=
data[16]) {
655 if (
ctx->has_share_button) {
667 if (
ctx->has_paddles && (
size == 39 ||
size == 55)) {
682 paddles_mapped = (
data[35] != 0);
690 paddles_mapped = (
data[19] != 0);
693 #ifdef DEBUG_XBOX_PROTOCOL
694 SDL_Log(
">>> Paddles: %d,%d,%d,%d mapped = %s\n",
695 (
data[paddle_index] & button1_bit) ? 1 : 0,
696 (
data[paddle_index] & button2_bit) ? 1 : 0,
697 (
data[paddle_index] & button3_bit) ? 1 : 0,
698 (
data[paddle_index] & button4_bit) ? 1 : 0,
699 paddles_mapped ?
"TRUE" :
"FALSE"
703 if (paddles_mapped) {
705 data[paddle_index] = 0;
708 if (
ctx->last_state[paddle_index] !=
data[paddle_index]) {
719 HIDAPI_DriverXboxOneBluetooth_HandleStatePacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
730 if (
ctx->last_state[13] !=
data[13]) {
799 HIDAPI_DriverXboxOneBluetooth_HandleGuidePacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
806 HIDAPI_DriverXboxOneBluetooth_HandleBatteryPacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
815 switch ((
flags & 0x03)) {
829 #ifdef SET_SERIAL_AFTER_OPEN
831 HIDAPI_DriverXboxOne_HandleSerialIDPacket(SDL_Joystick *
joystick, SDL_DriverXboxOne_Context *
ctx,
Uint8 *
data,
int size)
836 for (
i = 0;
i < 14; ++
i) {
839 serial[
i * 2] =
'\0';
842 #ifdef DEBUG_JOYSTICK
843 SDL_Log(
"Setting serial number to %s\n", serial);
853 SDL_XboxOneInitState prev_state;
856 prev_state =
ctx->init_state;
858 switch (
ctx->init_state) {
859 case XBOX_ONE_INIT_STATE_START_NEGOTIATING:
862 SetInitState(
ctx, XBOX_ONE_INIT_STATE_COMPLETE);
864 SetInitState(
ctx, XBOX_ONE_INIT_STATE_NEGOTIATING);
865 ctx->init_packet = 0;
871 case XBOX_ONE_INIT_STATE_NEGOTIATING:
874 #ifdef DEBUG_JOYSTICK
883 case XBOX_ONE_INIT_STATE_PREPARE_INPUT:
885 #ifdef DEBUG_JOYSTICK
888 SetInitState(
ctx, XBOX_ONE_INIT_STATE_COMPLETE);
891 case XBOX_ONE_INIT_STATE_COMPLETE:
895 }
while (
ctx->init_state != prev_state);
903 SDL_DriverXboxOne_Context *
ctx = (SDL_DriverXboxOne_Context *)
device->context;
908 #ifdef DEBUG_XBOX_PROTOCOL
911 if (
ctx->bluetooth) {
917 #ifdef DEBUG_JOYSTICK
918 SDL_Log(
"Unknown Xbox One Bluetooth packet size: %d\n",
size);
929 #ifdef DEBUG_JOYSTICK
930 SDL_Log(
"Unknown Xbox One packet: 0x%.2x\n",
data[0]);
960 #ifdef DEBUG_JOYSTICK
963 SetInitState(
ctx, XBOX_ONE_INIT_STATE_START_NEGOTIATING);
967 if (
ctx->init_state < XBOX_ONE_INIT_STATE_COMPLETE) {
968 SetInitState(
ctx, XBOX_ONE_INIT_STATE_COMPLETE);
990 #ifdef SET_SERIAL_AFTER_OPEN
991 if (
size == 20 &&
data[3] == 0x10) {
997 if (
ctx->init_state < XBOX_ONE_INIT_STATE_COMPLETE) {
998 SetInitState(
ctx, XBOX_ONE_INIT_STATE_COMPLETE);
1001 #ifdef DEBUG_JOYSTICK
1002 SDL_Log(
"Controller ignoring spurious input\n");
1009 #ifdef DEBUG_JOYSTICK
1010 SDL_Log(
"Unknown Xbox One packet: 0x%.2x\n",
data[0]);
1017 if (
ctx->init_state == XBOX_ONE_INIT_STATE_NEGOTIATING) {
1018 const SDL_DriverXboxOne_InitPacket *packet = &xboxone_init_packets[
ctx->init_packet];
1020 if (
size >= 4 &&
data[0] == packet->response[0] &&
data[1] == packet->response[1]) {
1021 #ifdef DEBUG_JOYSTICK
1031 HIDAPI_DriverXboxOne_UpdateInitState(
device,
ctx);
1045 if (
device->num_joysticks > 0) {
1073 HIDAPI_DriverXboxOne_IsSupportedDevice,
1074 HIDAPI_DriverXboxOne_GetDeviceName,
1075 HIDAPI_DriverXboxOne_InitDevice,
1076 HIDAPI_DriverXboxOne_GetDevicePlayerIndex,
1077 HIDAPI_DriverXboxOne_SetDevicePlayerIndex,
1078 HIDAPI_DriverXboxOne_UpdateDevice,
1079 HIDAPI_DriverXboxOne_OpenJoystick,
1080 HIDAPI_DriverXboxOne_RumbleJoystick,
1081 HIDAPI_DriverXboxOne_RumbleJoystickTriggers,
1082 HIDAPI_DriverXboxOne_HasJoystickLED,
1083 HIDAPI_DriverXboxOne_SetJoystickLED,
1084 HIDAPI_DriverXboxOne_SetJoystickSensorsEnabled,
1085 HIDAPI_DriverXboxOne_CloseJoystick,
1086 HIDAPI_DriverXboxOne_FreeDevice,
#define SDL_JoystickFromInstanceID
#define SDL_OutOfMemory()
#define SDL_Unsupported()
@ SDL_CONTROLLER_AXIS_LEFTX
@ SDL_CONTROLLER_AXIS_TRIGGERRIGHT
@ SDL_CONTROLLER_AXIS_RIGHTY
@ SDL_CONTROLLER_AXIS_RIGHTX
@ SDL_CONTROLLER_AXIS_MAX
@ SDL_CONTROLLER_AXIS_TRIGGERLEFT
@ SDL_CONTROLLER_AXIS_LEFTY
@ SDL_CONTROLLER_BUTTON_B
@ SDL_CONTROLLER_BUTTON_BACK
@ SDL_CONTROLLER_BUTTON_LEFTSTICK
@ SDL_CONTROLLER_BUTTON_START
@ SDL_CONTROLLER_BUTTON_DPAD_LEFT
@ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
@ SDL_CONTROLLER_BUTTON_DPAD_DOWN
@ SDL_CONTROLLER_BUTTON_DPAD_UP
@ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
@ SDL_CONTROLLER_BUTTON_GUIDE
@ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
@ SDL_CONTROLLER_BUTTON_MISC1
@ SDL_CONTROLLER_BUTTON_X
@ SDL_CONTROLLER_BUTTON_RIGHTSTICK
@ SDL_CONTROLLER_BUTTON_Y
@ SDL_CONTROLLER_BUTTON_A
@ SDL_CONTROLLER_TYPE_XBOXONE
#define USB_PACKET_LENGTH
void HIDAPI_DumpPacket(const char *prefix, Uint8 *data, int size)
SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJoystickID)
void HIDAPI_JoystickDisconnected(SDL_HIDAPI_Device *device, SDL_JoystickID joystickID)
SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne
#define SDL_HINT_JOYSTICK_HIDAPI_XBOX
A variable controlling whether the HIDAPI driver for XBox controllers should be used.
void SDL_PrivateJoystickBatteryLevel(SDL_Joystick *joystick, SDL_JoystickPowerLevel ePowerLevel)
SDL_bool SDL_IsJoystickXboxOneElite(Uint16 vendor_id, Uint16 product_id)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
SDL_bool SDL_IsJoystickXboxOneSeriesX(Uint16 vendor_id, Uint16 product_id)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
@ SDL_JOYSTICK_POWER_FULL
@ SDL_JOYSTICK_POWER_MEDIUM
@ SDL_JOYSTICK_POWER_WIRED
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLuint GLsizei GLenum type
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLuint const GLchar * name
#define SDL_arraysize(array)
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds)
Read an Input report from a HID device with timeout.
HID_API_EXPORT hid_device *HID_API_CALL hid_open_path(const char *path, int bExclusive)
Open a HID device by its path name.
void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device)
Close a HID device.
int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length)
Write an Output report to a HID device.
static SDL_AudioDeviceID device
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
static SDL_Joystick * joystick
#define USB_VENDOR_POWERA
#define USB_PRODUCT_XBOX_ONE_SERIES_X_BLUETOOTH
#define USB_PRODUCT_XBOX_ONE_S_REV1_BLUETOOTH
#define USB_VENDOR_MICROSOFT
#define USB_PRODUCT_XBOX_ONE_ELITE_SERIES_2_BLUETOOTH
#define USB_PRODUCT_XBOX_ONE_S_REV2_BLUETOOTH
#define USB_PRODUCT_RAZER_ATROX
typedef int(__stdcall *FARPROC)()