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...