GetRawInputDeviceInfo с RIDI_DEVICENAME возвращает недопустимую памятьC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 GetRawInputDeviceInfo с RIDI_DEVICENAME возвращает недопустимую память

Сообщение Anonymous »

В моем коде я вызываю функцию GetRawInputDeviceInfo, передавая команду RIDI_DEVICENAME. Предполагается заполнить третий параметр строкой, содержащей имя буфера, и вернуть длину строки.
Однако, когда функция завершает работу, этот параметр указывает на недопустимую память. (внутри отладчика написано 0x234449485c3f5c5c, и просмотреть его содержимое невозможно).
Это полный код:

Код: Выделить всё

#include 
#include 

#define assert(x) do{if(!(x))__debugbreak();}while(0)

typedef size_t usize;
typedef uint8_t u8;
typedef unsigned int uint;

struct Raw_Input_Memory {
usize size;
usize used;
u8   *data;
};

#define raw_input_memory_push_array(memory, type, count) (type *)raw_input_memory_push_size(memory, sizeof(type) * count)
#define raw_input_memory_push_struct(memory, type) (type *)raw_input_memory_push_size(memory, sizeof(type))
void *raw_input_memory_push_size(Raw_Input_Memory *memory, usize size) {
assert(memory->used + size size);

void *result = memory->data + memory->used;
memory->used += size;

return result;
}

int main() {
HINSTANCE module_instance = GetModuleHandle(NULL);

WNDCLASSA window_class = {};
window_class.lpfnWndProc = DefWindowProc;
window_class.hInstance = module_instance;
window_class.hCursor = LoadCursorA(NULL, IDC_ARROW);
window_class.lpszClassName = "Toplevel";

ATOM window_class_atom = RegisterClassA(&window_class);
if (window_class_atom) {
HWND window = CreateWindowA(window_class.lpszClassName, "Raw Input",
WS_VISIBLE | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, module_instance, NULL);
if (window) {
Raw_Input_Memory raw_input_memory = {};
raw_input_memory.size = 1024 * 1024;
raw_input_memory.used = 0;
raw_input_memory.data = (u8 *)VirtualAlloc(NULL, raw_input_memory.size,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

RAWINPUTDEVICE raw_input_device;

raw_input_device.usUsagePage = 0x01;
raw_input_device.usUsage = 0x05;
raw_input_device.dwFlags = 0;
raw_input_device.hwndTarget = 0;

if (RegisterRawInputDevices(&raw_input_device, 1,
sizeof(RAWINPUTDEVICE))) {
MSG window_message = {};
while (GetMessageA(&window_message, NULL, 0, 0) > 0) {
UINT message_kind = window_message.message;
WPARAM wparam     = window_message.wParam;
LPARAM lparam     = window_message.lParam;

switch (message_kind) {
case WM_QUIT: {
break;
} break;

case WM_INPUT: {
if (raw_input_memory.data) {
raw_input_memory.used = 0;

UINT input_size;
if (GetRawInputData((HRAWINPUT)lparam, RID_INPUT, NULL, &input_size,
sizeof(RAWINPUTHEADER)) != -1) {
RAWINPUT *input = (RAWINPUT *)raw_input_memory_push_size(&raw_input_memory,
input_size);
if (GetRawInputData((HRAWINPUT)lparam, RID_INPUT, input,
&input_size, sizeof(RAWINPUTHEADER)) == input_size) {
assert(input->header.dwType == RIM_TYPEHID);

uint device_name_length = 128;
char *device_name = NULL;
device_name = raw_input_memory_push_array(&raw_input_memory, char,
device_name_length);
assert(device_name);
INT got_device_name = GetRawInputDeviceInfoA(input->header.hDevice,
RIDI_DEVICENAME,
&device_name,
&device_name_length);
if (got_device_name) {
/* ...  */
}
}
}
}
} break;

default: {
TranslateMessage(&window_message);
DispatchMessageA(&window_message);
}
}
}
}
}
}

return 0;
}
Обратите внимание, что вызов не приводит к явному сбою: он возвращает не -1 и не 0, а 83. код>; и GetLastError возвращает 0.
Я пробовал как выделить память самостоятельно (как вы можете видеть в опубликованном мной коде), так и передать NULL-указатель , и оба имеют одинаковый результат. Я тоже попробовал широкую версию, но все равно получаю 83 в качестве возвращаемого значения и указатель на 0x005c003f005c005c, который по-прежнему недействителен.
Что я делаю? делаешь неправильно? Почему функция передает мне недействительную память и как мне запретить ей это делать? Я видел этот ответ и другой ответ и читал документацию. Не знаю, что еще делать.
Кстати, пробую с контроллером PS4.

Подробнее здесь: https://stackoverflow.com/questions/752 ... lid-memory
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»