rawinput changes

This commit is contained in:
Hay1tsme
2025-05-06 18:03:28 -04:00
parent eccef99ae2
commit cf22a6542b
4 changed files with 109 additions and 36 deletions
+79 -18
View File
@@ -3,7 +3,6 @@
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <hidsdi.h>
#include <process.h>
#include "hook/iohook.h"
@@ -13,9 +12,17 @@
static HWND ri_hwnd;
static WNDCLASSEX ri_wndclass;
static HANDLE selected_ri_dev = (HANDLE)-1;
static uintptr_t ri_thread;
static struct RI_DEVICE selected_ri_dev =
{
.hDevice = INVALID_HANDLE_VALUE,
.capeabilities = NULL,
.preparsed_data = NULL,
.prod_name = L"",
.dev_name = L""
};
static ri_mouse_cb_t mouse_cb = NULL;
static ri_kb_cb_t kb_cb = NULL;
static ri_hid_cb_t hid_cb = NULL;
@@ -27,10 +34,15 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
{
wchar_t ri_dev_name[MAX_PATH] = L"\0";
wchar_t hid_prod_name[MAX_PATH] = L"\0";
PHIDP_PREPARSED_DATA ppdata = NULL;
PHIDP_CAPS caps = NULL;
UINT num_ri_devs = 0;
UINT len_ri_dev_name = 0;
UINT len_ri_preparsed_data = 0;
DWORD err = 0;
PRAWINPUTDEVICELIST ri_devs = NULL;
uint32_t num_final_devs = 0;
PRI_DEVICE final_dev_list;
mouse_cb = in_mouse_cb;
kb_cb = in_kb_cb;
@@ -55,6 +67,32 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
dprintf("RawInput: Raw Input device list (%d devices):\n", num_ri_devs);
for (int i = 0; i < num_ri_devs; i++) {
len_ri_dev_name = 0;
len_ri_preparsed_data = 0;
if (GetRawInputDeviceInfo(ri_devs[i].hDevice, RIDI_PREPARSEDDATA, NULL, &len_ri_preparsed_data) != 0) {
dprintf("RawInput: GetRawInputDeviceInfo #%d failed to get preprocessed data size\n", i);
break;
}
if (len_ri_preparsed_data <= 0) {
dprintf("RawInput: GetRawInputDeviceInfoW #%d len_ri_preparsed_data <= 0\n", i);
break;
}
if (GetRawInputDeviceInfo(ri_devs[i].hDevice, RIDI_PREPARSEDDATA, ppdata, &len_ri_preparsed_data) != 0) {
dprintf("RawInput: GetRawInputDeviceInfo #%d failed to get preprocessed data\n", i);
break;
}
if (HidP_GetCaps(ppdata, caps) != HIDP_STATUS_SUCCESS) {
dprintf("RawInput: HidP_GetCaps #%d failed to get capeabilities data size\n", i);
break;
}
if ((caps->UsagePage >> 8) == 0xFF) {
dprintf("RawInput: Skipping vendor-specific device #%d\n", i);
continue;
}
if (GetRawInputDeviceInfoW(ri_devs[i].hDevice, RIDI_DEVICENAME, NULL, &len_ri_dev_name) != 0) {
dprintf("RawInput: GetRawInputDeviceInfoW #%d failed to get name size\n", i);
break;
@@ -83,16 +121,37 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
}
if (!HidD_GetProductString(hiddev, hid_prod_name, MAX_PATH)) {
//dprintf("RawInput: HidD_GetProductString failed on dev #%d for device %ls\n", i, ri_dev_name);
continue;
}
PRI_DEVICE new_dev;
PRI_DEVICE new_mem = realloc(final_dev_list, (num_final_devs + 1) * sizeof(struct RI_DEVICE));
dprintf("\tDev #%d - %ls\n", i, hid_prod_name);
new_dev = &new_mem[num_final_devs];
new_dev->hDevice = ri_devs[i].hDevice;
// does this need memcpy?
new_dev->capeabilities = caps;
new_dev->preparsed_data = ppdata;
new_dev->dev_name = ri_dev_name;
new_dev->prod_name = hid_prod_name;
final_dev_list = new_mem;
num_final_devs++;
}
if (dev_num >= num_final_devs) {
dprintf("RawInput: No RawInput device set, please select from the list below:\n");
for (int i = 0; i < num_final_devs; i++) {
dprintf("\tDev #%d - %ls\n", i, hid_prod_name);
}
free(ri_devs);
free(final_dev_list);
return S_FALSE;
}
selected_ri_dev = ri_devs[dev_num].hDevice;
free(ri_devs);
selected_ri_dev = final_dev_list[dev_num];
dprintf("RawInput: Using device %ls\n", selected_ri_dev.prod_name);
ri_wndclass.cbSize = sizeof(WNDCLASSEX);
ri_wndclass.hInstance = GetModuleHandle(NULL);
@@ -101,13 +160,10 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
RegisterClassEx(&ri_wndclass);
ri_thread = _beginthreadex(
NULL,
0,
ri_thread_proc,
NULL,
0,
NULL);
ri_thread = _beginthreadex(NULL, 0, ri_thread_proc, NULL, 0, NULL);
free(ri_devs);
free(final_dev_list);
return S_OK;
}
@@ -120,6 +176,11 @@ void ri_exit()
static unsigned int __stdcall ri_thread_proc(void *ctx)
{
if (selected_ri_dev.hDevice == INVALID_HANDLE_VALUE) {
dprintf("RawInput: ri_thread_proc cannont begin, no device selected\n");
return (LRESULT)0;
}
dprintf("RawInput: ri_thread_proc begin\n");
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
@@ -174,7 +235,7 @@ LRESULT CALLBACK ri_win_proc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lParam)
PRAWINPUT ridata = (PRAWINPUT)malloc(pdata_size);
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, ridata, &pdata_size, sizeof(RAWINPUTHEADER));
if (ridata->header.hDevice != selected_ri_dev) {
if (ridata->header.hDevice != selected_ri_dev.hDevice) {
free(ridata);
return (LRESULT)0;
}
@@ -182,17 +243,17 @@ LRESULT CALLBACK ri_win_proc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lParam)
switch (ridata->header.dwType) {
case RIM_TYPEMOUSE:
if (mouse_cb != NULL) {
mouse_cb(&ridata->data.mouse);
mouse_cb(&selected_ri_dev, &ridata->data.mouse);
}
break;
case RIM_TYPEKEYBOARD:
if (kb_cb != NULL) {
kb_cb(&ridata->data.keyboard);
kb_cb(&selected_ri_dev, &ridata->data.keyboard);
}
break;
case RIM_TYPEHID:
if (hid_cb != NULL) {
hid_cb(&ridata->data.hid);
hid_cb(&selected_ri_dev, &ridata->data.hid);
}
break;
}
+15 -3
View File
@@ -1,10 +1,22 @@
#pragma once
#include <windows.h>
#include <stdint.h>
#include <hidsdi.h>
typedef void (*ri_mouse_cb_t)(PRAWMOUSE);
typedef void (*ri_kb_cb_t)(PRAWKEYBOARD);
typedef void (*ri_hid_cb_t)(PRAWHID);
#pragma pack(push,1)
typedef struct RI_DEVICE {
HANDLE hDevice;
PHIDP_PREPARSED_DATA preparsed_data;
PHIDP_CAPS capeabilities;
wchar_t *dev_name;
wchar_t *prod_name;
} *PRI_DEVICE;
#pragma pack(pop)
typedef void (*ri_mouse_cb_t)(PRI_DEVICE, PRAWMOUSE);
typedef void (*ri_kb_cb_t)(PRI_DEVICE, PRAWKEYBOARD);
typedef void (*ri_hid_cb_t)(PRI_DEVICE, PRAWHID);
HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb, ri_hid_cb_t in_hid_cb);
void ri_exit();