#pragma pack(push) #include #include #include "includes.h" bool kinectRunning = false; bool kinectStarted = false; extern VRFoot VR_FOOTS[2]; typedef struct { union { struct { WORD unk1; WORD unk2; WORD device_id; WORD vid; WORD pid; WORD pvn; WORD max_point_num; }; uint8_t raw[2356]; }; } dev_info_t; typedef struct { DWORD cid; DWORD type; DWORD unused; DWORD y; DWORD x; DWORD height; DWORD width; DWORD unk8; } touch_data_t; #pragma pack(pop) enum touch_type { TS_DOWN = 1, TS_MOVE = 2, TS_UP = 3, }; void *user_data = nullptr; void (*touch_callback)( dev_info_t *dev_info, const touch_data_t *touch_data, int touch_points, int unk1, const void *user_data); void* TouchSDK_Constructor(void* in) { return in; } bool TouchSDK_SendData(dev_info_t*, unsigned char* const, int, unsigned char* const, unsigned char* output, int output_size) { // fake success if (output_size >= 4) { output[0] = 0xfc; output[1] = 0xa5; } return true; } bool TouchSDK_SetSignalInit(dev_info_t*, int) { return true; } void TouchSDK_Destructor(void* This) { } int TouchSDK_GetYLedTotal(dev_info_t*, int) { return 53; } int TouchSDK_GetXLedTotal(dev_info_t*, int) { return 41; } bool TouchSDK_DisableTouch(dev_info_t*, int) { return true; } bool TouchSDK_DisableDrag(dev_info_t*, int) { return true; } bool TouchSDK_DisableWheel(dev_info_t*, int) { return true; } bool TouchSDK_DisableRightClick(dev_info_t*, int) { return true; } bool TouchSDK_SetMultiTouchMode(dev_info_t*, int) { return true; } bool TouchSDK_EnableTouchWidthData(dev_info_t*, int) { return true; } bool TouchSDK_EnableRawData(dev_info_t*, int) { return true; } bool TouchSDK_SetAllEnable(dev_info_t*, bool, int) { return true; } int TouchSDK_GetTouchDeviceCount(void* This) { return 1; } unsigned int TouchSDK_GetTouchSDKVersion(void) { return 0x01030307; } int TouchSDK_InitTouch(void* This, dev_info_t* devices, int max_devices, void* touch_event_cb, void* hotplug_callback, void* userdata) { // fake touch device memset(devices, 0, sizeof(devices[0].raw)); devices[0].unk1 = 0x1122; devices[0].unk2 = 0x3344; devices[0].device_id = 0; devices[0].vid = 0xDEAD; devices[0].pid = 0xBEEF; devices[0].pvn = 0xC0DE; devices[0].max_point_num = 16; // remember provided callback and userdata touch_callback = (decltype(touch_callback))touch_event_cb; user_data = userdata; // success return 1; } inline DWORD scale_double_to_xy(double val) { return static_cast(val * 32768); } inline DWORD scale_double_to_height(double val) { return static_cast(val * 1312); } inline DWORD scale_double_to_width(double val) { return static_cast(val * 1696); } void fire_touches(drs_touch_t* events, size_t event_count) { // check callback first if (!touch_callback) { return; } // generate touch data auto game_touches = std::make_unique(event_count); for (size_t i = 0; i < event_count; i++) { // initialize touch value game_touches[i].cid = (DWORD)events[i].id; game_touches[i].unk8 = 0; // copy scaled values game_touches[i].x = scale_double_to_xy(events[i].x); game_touches[i].y = scale_double_to_xy(events[i].y); game_touches[i].width = scale_double_to_width(events[i].width); game_touches[i].height = scale_double_to_height(events[i].height); // decide touch type switch (events[i].type) { case DRS_DOWN: game_touches[i].type = TS_DOWN; break; case DRS_UP: game_touches[i].type = TS_UP; break; case DRS_MOVE: game_touches[i].type = TS_MOVE; break; default: break; } } // build device information dev_info_t dev; dev.unk1 = 0; dev.unk2 = 0; dev.device_id = 0; dev.vid = 0xDEAD; dev.pid = 0xBEEF; dev.pvn = 0xC0DE; dev.max_point_num = 16; // fire callback touch_callback(&dev, game_touches.get(), (int)event_count, 0, user_data); } VRFoot feet[11]; unsigned long holdcounters[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; unsigned long releasecounters[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void start_kinect() { if (kinectRunning) return; if (!kinectStarted) { kinectStarted = true; std::thread t([] { puts("starting kinect thread"); // main loop while (true) { if (GetKeyState(VK_SHIFT) & 0x8000) { feet[0].id = 0; feet[0].index = 0; // update event details feet[0].event.id = feet[0].id; feet[0].event.x = 0.5; feet[0].event.y = 0.5; feet[0].event.width = 1; feet[0].event.height = feet[0].event.width; holdcounters[0] = 0; // holding down releasecounters[0]++; if (releasecounters[0] == 1) { feet[0].event.type = DRS_DOWN; fire_touches(&feet[0].event, 1); } else if (releasecounters[0] > 1) { feet[0].event.type = DRS_MOVE; fire_touches(&feet[0].event, 1); } } else { holdcounters[0]++; // released releasecounters[0] == 0; feet[0].event.type = DRS_UP; if (holdcounters[0] == 1) fire_touches(&feet[0].event, 1); // send up event very shortly } if (GetKeyState(0x31) & 0x8000) { feet[1].id = 1; feet[1].index = 1; // update event details feet[1].event.id = feet[1].id; feet[1].event.x = 0.05; feet[1].event.y = 0.5; feet[1].event.width = 0.1; feet[1].event.height = feet[1].event.width; holdcounters[1] = 0; // holding down releasecounters[1]++; if (releasecounters[1] == 1) { feet[1].event.type = DRS_DOWN; fire_touches(&feet[1].event, 1); } else if (releasecounters[1] > 1) { feet[1].event.type = DRS_MOVE; fire_touches(&feet[1].event, 1); } } else { holdcounters[1]++; // released releasecounters[1] == 0; feet[1].event.type = DRS_UP; if (holdcounters[1] == 1) fire_touches(&feet[1].event, 1); // send up event very shortly } if (GetKeyState(0x32) & 0x8000) { feet[2].id = 2; feet[2].index = 2; // update event details feet[2].event.id = feet[2].id; feet[2].event.x = 0.15; feet[2].event.y = 0.5; feet[2].event.width = 0.1; feet[2].event.height = feet[2].event.width; holdcounters[2] = 0; // holding down releasecounters[2]++; if (releasecounters[2] == 1) { feet[2].event.type = DRS_DOWN; fire_touches(&feet[2].event, 1); } else if (releasecounters[2] > 1) { feet[2].event.type = DRS_MOVE; fire_touches(&feet[2].event, 1); } } else { holdcounters[2]++; // released releasecounters[2] == 0; feet[2].event.type = DRS_UP; if (holdcounters[2] == 1) fire_touches(&feet[2].event, 1); // send up event very shortly } if (GetKeyState(0x33) & 0x8000) { feet[3].id = 3; feet[3].index = 3; // update event details feet[3].event.id = feet[3].id; feet[3].event.x = 0.25; feet[3].event.y = 0.5; feet[3].event.width = 0.1; feet[3].event.height = feet[3].event.width; holdcounters[3] = 0; // holding down releasecounters[3]++; if (releasecounters[3] == 1) { feet[3].event.type = DRS_DOWN; fire_touches(&feet[3].event, 1); } else if (releasecounters[3] > 1) { feet[3].event.type = DRS_MOVE; fire_touches(&feet[3].event, 1); } } else { holdcounters[3]++; // released releasecounters[3] == 0; feet[3].event.type = DRS_UP; if (holdcounters[3] == 1) fire_touches(&feet[3].event, 1); // send up event very shortly } if (GetKeyState(0x34) & 0x8000) { feet[4].id = 4; feet[4].index = 4; // update event details feet[4].event.id = feet[4].id; feet[4].event.x = 0.35; feet[4].event.y = 0.5; feet[4].event.width = 0.1; feet[4].event.height = feet[4].event.width; holdcounters[4] = 0; // holding down releasecounters[4]++; if (releasecounters[4] == 1) { feet[4].event.type = DRS_DOWN; fire_touches(&feet[4].event, 1); } else if (releasecounters[4] > 1) { feet[4].event.type = DRS_MOVE; fire_touches(&feet[4].event, 1); } } else { holdcounters[4]++; // released releasecounters[4] == 0; feet[4].event.type = DRS_UP; if (holdcounters[4] == 1) fire_touches(&feet[4].event, 1); // send up event very shortly } if (GetKeyState(0x35) & 0x8000) { feet[5].id = 5; feet[5].index = 5; // update event details feet[5].event.id = feet[5].id; feet[5].event.x = 0.45; feet[5].event.y = 0.5; feet[5].event.width = 0.1; feet[5].event.height = feet[5].event.width; holdcounters[5] = 0; // holding down releasecounters[5]++; if (releasecounters[5] == 1) { feet[5].event.type = DRS_DOWN; fire_touches(&feet[5].event, 1); } else if (releasecounters[5] > 1) { feet[5].event.type = DRS_MOVE; fire_touches(&feet[5].event, 1); } } else { holdcounters[5]++; // released releasecounters[5] == 0; feet[5].event.type = DRS_UP; if (holdcounters[5] == 1) fire_touches(&feet[5].event, 1); // send up event very shortly } if (GetKeyState(0x36) & 0x8000) { feet[6].id = 6; feet[6].index = 6; // update event details feet[6].event.id = feet[6].id; feet[6].event.x = 0.55; feet[6].event.y = 0.5; feet[6].event.width = 0.1; feet[6].event.height = feet[6].event.width; holdcounters[6] = 0; // holding down releasecounters[6]++; if (releasecounters[6] == 1) { feet[6].event.type = DRS_DOWN; fire_touches(&feet[6].event, 1); } else if (releasecounters[6] > 1) { feet[6].event.type = DRS_MOVE; fire_touches(&feet[6].event, 1); } } else { holdcounters[6]++; // released releasecounters[6] == 0; feet[6].event.type = DRS_UP; if (holdcounters[6] == 1) fire_touches(&feet[6].event, 1); // send up event very shortly } if (GetKeyState(0x37) & 0x8000) { feet[7].id = 7; feet[7].index = 7; // update event details feet[7].event.id = feet[7].id; feet[7].event.x = 0.65; feet[7].event.y = 0.5; feet[7].event.width = 0.1; feet[7].event.height = feet[7].event.width; holdcounters[7] = 0; // holding down releasecounters[7]++; if (releasecounters[7] == 1) { feet[7].event.type = DRS_DOWN; fire_touches(&feet[7].event, 1); } else if (releasecounters[7] > 1) { feet[7].event.type = DRS_MOVE; fire_touches(&feet[7].event, 1); } } else { holdcounters[7]++; // released releasecounters[7] == 0; feet[7].event.type = DRS_UP; if (holdcounters[7] == 1) fire_touches(&feet[7].event, 1); // send up event very shortly } if (GetKeyState(0x38) & 0x8000) { feet[8].id = 8; feet[8].index = 8; // update event details feet[8].event.id = feet[8].id; feet[8].event.x = 0.75; feet[8].event.y = 0.5; feet[8].event.width = 0.1; feet[8].event.height = feet[8].event.width; holdcounters[8] = 0; // holding down releasecounters[8]++; if (releasecounters[8] == 1) { feet[8].event.type = DRS_DOWN; fire_touches(&feet[8].event, 1); } else if (releasecounters[8] > 1) { feet[8].event.type = DRS_MOVE; fire_touches(&feet[8].event, 1); } } else { holdcounters[8]++; // released releasecounters[8] == 0; feet[8].event.type = DRS_UP; if (holdcounters[8] == 1) fire_touches(&feet[8].event, 1); // send up event very shortly } if (GetKeyState(0x39) & 0x8000) { feet[9].id = 9; feet[9].index = 9; // update event details feet[9].event.id = feet[9].id; feet[9].event.x = 0.85; feet[9].event.y = 0.5; feet[9].event.width = 0.1; feet[9].event.height = feet[9].event.width; holdcounters[9] = 0; // holding down releasecounters[9]++; if (releasecounters[9] == 1) { feet[9].event.type = DRS_DOWN; fire_touches(&feet[9].event, 1); } else if (releasecounters[9] > 1) { feet[9].event.type = DRS_MOVE; fire_touches(&feet[9].event, 1); } } else { holdcounters[9]++; // released releasecounters[9] == 0; feet[9].event.type = DRS_UP; if (holdcounters[9] == 1) fire_touches(&feet[9].event, 1); // send up event very shortly } if (GetKeyState(0x30) & 0x8000) { feet[10].id = 10; feet[10].index = 10; // update event details feet[10].event.id = feet[10].id; feet[10].event.x = 0.95; feet[10].event.y = 0.5; feet[10].event.width = 0.1; feet[10].event.height = feet[10].event.width; holdcounters[10] = 0; // holding down releasecounters[10]++; if (releasecounters[10] == 1) { feet[10].event.type = DRS_DOWN; fire_touches(&feet[10].event, 1); } else if (releasecounters[10] > 1) { feet[10].event.type = DRS_MOVE; fire_touches(&feet[10].event, 1); } } else { holdcounters[10]++; // released releasecounters[10] == 0; feet[10].event.type = DRS_UP; if (holdcounters[10] == 1) fire_touches(&feet[10].event, 1); // send up event very shortly } // slow down std::this_thread::sleep_for(std::chrono::milliseconds(1)); } kinectStarted = false; return nullptr; }); t.detach(); } } void hookDancepad() { MH_Initialize(); MH_CreateHookApi(L"TouchSDKDll.dll", "??0TouchSDK@@QEAA@XZ", TouchSDK_Constructor, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SendData@TouchSDK@@QEAA_NU_DeviceInfo@@QEAEH1HH@Z", TouchSDK_SendData, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SetSignalInit@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_SetSignalInit, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?GetYLedTotal@TouchSDK@@QEAAHU_DeviceInfo@@H@Z", TouchSDK_GetYLedTotal, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?GetXLedTotal@TouchSDK@@QEAAHU_DeviceInfo@@H@Z", TouchSDK_GetXLedTotal, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?DisableTouch@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_DisableTouch, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?DisableDrag@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_DisableDrag, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?DisableWheel@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_DisableWheel, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?DisableRightClick@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_DisableRightClick, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SetMultiTouchMode@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_SetMultiTouchMode, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?EnableTouchWidthData@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_EnableTouchWidthData, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?EnableRawData@TouchSDK@@QEAA_NU_DeviceInfo@@H@Z", TouchSDK_EnableRawData, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?SetAllEnable@TouchSDK@@QEAA_NU_DeviceInfo@@_NH@Z", TouchSDK_SetAllEnable, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?GetTouchDeviceCount@TouchSDK@@QEAAHXZ", TouchSDK_GetTouchDeviceCount, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?GetTouchSDKVersion@TouchSDK@@QEAAIXZ", TouchSDK_GetTouchSDKVersion, NULL); MH_CreateHookApi(L"TouchSDKDll.dll", "?InitTouch@TouchSDK@@QEAAHPEAU_DeviceInfo@@HP6AXU2@PEBU_TouchPointData@@HHPEBX@ZP6AX1_N3@ZPEAX@Z", TouchSDK_InitTouch, NULL); MH_EnableHook(MH_ALL_HOOKS); start_kinect(); }