RtlUnicodeToMultiByteN
NTSTATUS __stdcall RtlUnicodeToMultiByteN(
PCHAR MultiByteString,
UINT64 MaxBytesInMultiByteString,
PULONG BytesInMultiByteString,
WCHAR *UnicodeString,
UINT64 BytesInUnicodeString){
unsigned int v8;
unsigned int v9;
INT64 v10;
__int64 v11;
__int64 v12;
unsigned int *v14;
int v15;
int v16;
PCHAR v17;
__int64 v18;
__int16 v19;
unsigned int v20;
UINT64 UnicodeStringByteCount;
char v22;
v8 = MaxBytesInMultiByteString;
if( RtlpIsUtf8Process(0) )
{
v14 = (unsigned int *)&v22;
if( BytesInMultiByteString )
v14 = BytesInMultiByteString;
if( (_DWORD)BytesInUnicodeString )
{
LODWORD(UnicodeStringByteCount) = BytesInUnicodeString;
RtlUnicodeToUTF8N(MultiByteString, v8, v14, UnicodeString, UnicodeStringByteCount);
}
else
{
*v14 = 0;
}
}
else
{
v9 = (unsigned int)BytesInUnicodeString >> 1;
if( (_BYTE)NlsMbCodePageTag )
{
v15 = (int)MultiByteString;
v16 = (int)MultiByteString;
if( v9 )
{
v17 = MultiByteString;
do
{
v16 = (int)v17;
if( !v8 )
break;
v18 = *UnicodeString++;
v19 = *(_WORD *)(NlsUnicodeToMbAnsiData + 2 * v18);
if( HIBYTE(v19) )
{
v20 = v8--;
if( v20 < 2 )
break;
*MultiByteString = HIBYTE(v19);
MultiByteString = ++v17;
}
*MultiByteString = v19;
--v8;
MultiByteString = v17 + 1;
v17 = MultiByteString;
v16 = (int)MultiByteString;
--v9;
}
while( v9 );
}
if( BytesInMultiByteString )
*BytesInMultiByteString = v16 - v15;
}
else
{
if( v9 < v8 )
v8 = (unsigned int)BytesInUnicodeString >> 1;
if( BytesInMultiByteString )
*BytesInMultiByteString = v8;
v10 = NlsUnicodeToAnsiData;
if( v8 )
{
v11 = v8;
do
{
v12 = *UnicodeString;
++MultiByteString;
++UnicodeString;
*(MultiByteString - 1) = *(_BYTE *)(v12 + v10);
--v11;
}
while( v11 );
}
}
}
return 0;
}Referenced by:
RtlUnicodeStringToAnsiString
safecrt_wctomb_s
wcstombs
wctomb_s_l