RtlUnicodeStringToAnsiString
NTSTATUS __stdcall RtlUnicodeStringToAnsiString(
_STRING *DestinationString,
_UNICODE_STRING *SourceString,
UINT8 AllocateDestinationString){
NTSTATUS v6;
UINT64 v7;
unsigned __int16 v8;
unsigned __int16 MaximumLength;
UINT32 v10;
int v11;
char *StringRoutine;
UINT64 BytesInUnicodeString;
UINT64 v15;
UINT8 v16;
UINT64 BytesInMultiByteString;
v16 = AllocateDestinationString;
LODWORD(BytesInMultiByteString) = 0;
v6 = 0;
LODWORD(v15) = 0;
RtlUnicodeToMultiByteSize(&v15, SourceString->Buffer, SourceString->Length);
v7 = (unsigned int)(v15 + 1);
if( (unsigned int)v7 > 0xFFFF )
return -1073741584;
v8 = v15;
DestinationString->Length = v15;
if( AllocateDestinationString )
{
DestinationString->MaximumLength = v7;
StringRoutine = (char *)ExpAllocateStringRoutine(v7);
DestinationString->Buffer = StringRoutine;
if( !StringRoutine )
return -1073741801;
}
else
{
MaximumLength = DestinationString->MaximumLength;
if( v8 >= MaximumLength )
{
if( !MaximumLength )
return -2147483643;
v6 = -2147483643;
DestinationString->Length = MaximumLength - 1;
}
}
LODWORD(BytesInUnicodeString) = SourceString->Length;
v11 = RtlUnicodeToMultiByteN(
DestinationString->Buffer,
DestinationString->Length,
(PULONG)&BytesInMultiByteString,
SourceString->Buffer,
BytesInUnicodeString);
if( v11 >= 0 )
{
v10 = BytesInMultiByteString;
DestinationString->Buffer[(unsigned int)BytesInMultiByteString] = 0;
}
if( v11 >= 0 )
return v6;
if( AllocateDestinationString )
{
ExFreePoolWithTag(DestinationString->Buffer, v10);
DestinationString->Buffer = 0i64;
}
return v11;
}Referenced by:
AslStringUpcaseToMultiByteN
CmpQueryEditionVersion
DbgUnicodeStringToAnsiString
EtwpBuildProcessEvent
ExpConvertLdrEntryToModuleInfo
ExpQueryModuleInformation
ExpSystemErrorHandler2
HdlspProcessDumpCommand
IopReassignSystemRoot
KsepGetModuleInfoByName
MmGetSystemRoutineAddress
NtQuerySystemEnvironmentValue
NtSetSystemEnvironmentValue
ObCreateObjectTypeEx
ViThunkAdjustExportAddressIfHooked