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