Альтернативный код, который преобразуется в ANSI и не требует количества символов Юникода в UNICODE_STRING, который должен быть передан в качестве параметра в WideCharToMultiByte. (Обратите внимание, что UNICODE_STRING.Length - это число байтов, а не символов Юникода, и wcslen не работает, если буфер не заканчивается нулем).
UNICODE_STRING tmp;
// ...
STRING dest; // or ANSI_STRING in kernel mode
LONG (WINAPI *RtlUnicodeStringToAnsiString)(PVOID, PVOID, BOOL);
*(FARPROC *)&RtlUnicodeStringToAnsiString =
GetProcAddress(LoadLibraryA("NTDLL.DLL"), "RtlUnicodeStringToAnsiString");
if(!RtlUnicodeStringToAnsiString)
{
return;
}
ULONG unicodeBufferSize = tmp.Length;
dest.Buffer = (PCHAR)malloc(unicodeBufferSize+1); // that must be enough...
dest.Length = 0;
dest.MaximumLength = unicodeBufferSize+1;
RtlUnicodeStringToAnsiString(&dest, &tmp, FALSE);
dest.Buffer[dest.Length] = 0; // now we get it in dest.Buffer