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