RtlOemStringToUnicodeString
NTSTATUS __stdcall RtlOemStringToUnicodeString(
_UNICODE_STRING *DestinationString,
const _STRING *SourceString,
UINT8 AllocateDestinationString){
unsigned int v6;
wchar_t *StringRoutine;
UINT32 v8;
int v9;
unsigned __int64 v11;
UINT64 BytesInOemString;
UINT64 BytesInUnicodeString;
LODWORD(BytesInUnicodeString) = 0;
v6 = RtlxOemStringToUnicodeSize(&SourceString->Length);
if( v6 > 0xFFFE )
return -1073741584;
DestinationString->Length = v6 - 2;
if( AllocateDestinationString )
{
DestinationString->MaximumLength = v6;
StringRoutine = (wchar_t *)ExpAllocateStringRoutine(v6);
DestinationString->Buffer = StringRoutine;
if( !StringRoutine )
return -1073741801;
}
else
{
v11 = (unsigned __int16)(v6 - 2) + 2i64;
if( v11 > DestinationString->MaximumLength || v11 < 2 )
return -2147483643;
}
LODWORD(BytesInOemString) = SourceString->Length;
v9 = RtlOemToUnicodeN(
DestinationString->Buffer,
DestinationString->Length,
&BytesInUnicodeString,
SourceString->Buffer,
BytesInOemString);
if( v9 >= 0 )
{
DestinationString->Buffer[(unsigned __int64)(unsigned int)BytesInUnicodeString >> 1] = 0;
v9 = 0;
}
if( v9 < 0 )
{
if( AllocateDestinationString )
{
ExFreePoolWithTag(DestinationString->Buffer, v8);
DestinationString->Buffer = 0i64;
}
}
return v9;
}Referenced by:
No references.