RtlOemToUnicodeN
NTSTATUS __stdcall RtlOemToUnicodeN(
WCHAR *UnicodeString,
UINT64 MaxBytesInUnicodeString,
UINT64 *BytesInUnicodeString,
INT8 *OemString,
UINT64 BytesInOemString){
unsigned int v8;
NTSTATUS v9;
unsigned int v10;
unsigned int v11;
unsigned int v12;
INT64 v13;
__int64 v14;
__int64 v15;
UINT64 *v17;
NTSTATUS v18;
__int64 v19;
int v20;
int v21;
__int64 v22;
__int64 v23;
UINT64 UTF8StringByteCount;
char v25;
v8 = MaxBytesInUnicodeString;
v9 = 0;
if( RtlpIsUtf8Process(1) )
{
v17 = (UINT64 *)&v25;
if( BytesInUnicodeString )
v17 = BytesInUnicodeString;
if( (_DWORD)BytesInOemString )
{
LODWORD(UTF8StringByteCount) = BytesInOemString;
v18 = RtlUTF8ToUnicodeN(UnicodeString, v8, v17, OemString, UTF8StringByteCount);
}
else
{
*(_DWORD *)v17 = 0;
v18 = 0;
}
if( v18 == -1073741789 )
return -2147483643;
return v9;
}
else
{
v10 = BytesInOemString;
v11 = v8 >> 1;
if( (_BYTE)NlsMbOemCodePageTag )
{
v19 = NlsMbOemCodePageTables;
v20 = (int)UnicodeString;
if( v11 )
{
v21 = (int)UnicodeString;
while( v10 )
{
v22 = (unsigned __int8)*OemString;
--v11;
--v10;
v23 = (unsigned __int16)NlsOemLeadByteInfoTable[v22];
if( (_WORD)v23 )
{
if( !v10 )
{
*UnicodeString = 0;
LODWORD(UnicodeString) = v21 + 2;
break;
}
*UnicodeString++ = *(_WORD *)(v19 + 2 * (v23 + (unsigned __int8)*++OemString));
--v10;
}
else
{
*UnicodeString++ = *(_WORD *)(NlsOemToUnicodeData + 2 * v22);
}
++OemString;
v21 = (int)UnicodeString;
if( !v11 )
break;
}
}
if( BytesInUnicodeString )
*(_DWORD *)BytesInUnicodeString = (_DWORD)UnicodeString - v20;
}
else
{
v12 = BytesInOemString;
if( v11 < (unsigned int)BytesInOemString )
v12 = v11;
if( BytesInUnicodeString )
*(_DWORD *)BytesInUnicodeString = 2 * v12;
v13 = NlsOemToUnicodeData;
if( v12 )
{
v14 = v12;
do
{
v15 = (unsigned __int8)*OemString++;
*UnicodeString++ = *(_WORD *)(v13 + 2 * v15);
--v14;
}
while( v14 );
}
}
return v11 < v10 ? 0x80000005 : 0;
}
}Referenced by:
FsRtlNotifyUpdateBuffer
RtlOemStringToCountedUnicodeString
RtlOemStringToUnicodeString