RtlMultiByteToUnicodeN
NTSTATUS __stdcall RtlMultiByteToUnicodeN(
WCHAR *UnicodeString,
UINT64 MaxBytesInUnicodeString,
UINT64 *BytesInUnicodeString,
INT8 *MultiByteString,
UINT64 BytesInMultiByteString){
unsigned int v8;
unsigned int v9;
unsigned int v10;
INT64 v11;
__int64 v12;
__int64 v13;
UINT64 *v15;
__int64 v16;
int v17;
int v18;
int v19;
__int64 v20;
__int64 v21;
UINT64 UTF8StringByteCount;
char v23;
v8 = MaxBytesInUnicodeString;
if( RtlpIsUtf8Process(0) )
{
v15 = (UINT64 *)&v23;
if( BytesInUnicodeString )
v15 = BytesInUnicodeString;
if( (_DWORD)BytesInMultiByteString )
{
LODWORD(UTF8StringByteCount) = BytesInMultiByteString;
RtlUTF8ToUnicodeN(UnicodeString, v8, v15, MultiByteString, UTF8StringByteCount);
}
else
{
*(_DWORD *)v15 = 0;
}
}
else
{
v9 = v8 >> 1;
if( (_BYTE)NlsMbCodePageTag )
{
v16 = NlsMbAnsiCodePageTables;
v17 = (int)UnicodeString;
if( v9 )
{
v18 = BytesInMultiByteString;
v19 = (int)UnicodeString;
while( v18 )
{
v20 = (unsigned __int8)*MultiByteString;
--v9;
--v18;
v21 = (unsigned __int16)NlsLeadByteInfoTable[v20];
if( (_WORD)v21 )
{
if( !v18 )
{
*UnicodeString = 0;
LODWORD(UnicodeString) = v19 + 2;
break;
}
*UnicodeString++ = *(_WORD *)(v16 + 2 * (v21 + (unsigned __int8)*++MultiByteString));
--v18;
}
else
{
*UnicodeString++ = *(_WORD *)(NlsAnsiToUnicodeData + 2 * v20);
}
++MultiByteString;
v19 = (int)UnicodeString;
if( !v9 )
break;
}
}
if( BytesInUnicodeString )
*(_DWORD *)BytesInUnicodeString = (_DWORD)UnicodeString - v17;
}
else
{
v10 = BytesInMultiByteString;
if( v9 < (unsigned int)BytesInMultiByteString )
v10 = v9;
if( BytesInUnicodeString )
*(_DWORD *)BytesInUnicodeString = 2 * v10;
v11 = NlsAnsiToUnicodeData;
if( v10 )
{
v12 = v10;
do
{
v13 = (unsigned __int8)*MultiByteString++;
*UnicodeString++ = *(_WORD *)(v11 + 2 * v13);
--v12;
}
while( v12 );
}
}
}
return 0;
}Referenced by:
RtlAnsiStringToUnicodeString
mbstowcs