On 3/7/19 11:36 AM, Aric Stewart wrote:
ULONG index = 0;KEY_VALUE_PARTIAL_INFORMATION *info;DWORD length, result_len;NTSTATUS status;length = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + (1000 *
sizeof(WCHAR));
info = HeapAlloc(GetProcessHeap(), 0, length);do {status = NtEnumerateValueKey(key, index,
KeyValuePartialInformation,
info, length, &result_len);if (status == STATUS_SUCCESS){CHAR mapping[1000] = {0};WideCharToMultiByte(CP_ACP, 0, info->Data,(info->DataLength / sizeof(WCHAR)), mapping,
sizeof(mapping),
NULL, NULL);if (mapping[0] != 0){TRACE("Setting mapping
%s\n",debugstr_a(mapping));
pSDL_GameControllerAddMapping(mapping);} else {ERR("Failed to convert mapping
%s\n",debugstr_w(info->Data));
}index ++;}} while (status == STATUS_SUCCESS);HeapFree(GetProcessHeap(), 0, info);NtClose(key);
I have to imagine that these strings can be arbitrarily long, and so I'd think it would be better to dynamically reallocate the structure.
I still don't like the use of NT APIs here: just because a real native driver uses it doesn't mean we have to, and they're generally more complex and harder to read. Still, if you insist...