On 3/15/19 9:47 AM, Zebediah Figura wrote:
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.
Agreed, patch sent.
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...
It is easier for me here as I am being passed a UNICODE_STRING with the full path for the driver registry path in an NT API format.
-aric