RtlAnsiCharToUnicodeChar

WCHAR __stdcall RtlAnsiCharToUnicodeChar(UINT8 **SourceCharacter){
  char IsUtf8Process; 
  INT8 *v3; 
  __int64 v4; 
  int v5; 
  unsigned int v6; 
  WCHAR *p_UnicodeStringDestination; 
  unsigned int v8; 
  INT64 v9; 
  WCHAR *v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  UINT64 UTF8StringByteCount; 
  WCHAR UnicodeStringDestination; 
  UINT64 UnicodeStringActualByteCount; 

  UnicodeStringDestination = 32;
  IsUtf8Process = RtlpIsUtf8Process(0);
  v3 = (INT8 *)*SourceCharacter;
  v4 = **SourceCharacter;
  v5 = 1;
  if( IsUtf8Process )
  {
    if( (unsigned __int8)v4 >= 0xC0u )
    {
      if( (unsigned __int8)v4 >= 0xE0u )
      {
        if( (unsigned __int8)v4 >= 0xF0u )
        {
          v6 = 1;
          if( (unsigned __int8)v4 < 0xF8u )
            v6 = 4;
        }
        else
        {
          v6 = 3;
        }
      }
      else
      {
        v6 = 2;
      }
    }
    else
    {
      v6 = 1;
    }
  }
  else
  {
    v6 = 1;
    if( NlsLeadByteInfoTable[v4] )
      v6 = 2;
  }
  p_UnicodeStringDestination = &UnicodeStringDestination;
  v8 = v6;
  if( RtlpIsUtf8Process(0) )
  {
    LODWORD(UTF8StringByteCount) = v6;
    RtlUTF8ToUnicodeN(&UnicodeStringDestination, 2ui64, &UnicodeStringActualByteCount, v3, UTF8StringByteCount);
  }
  else if( (_BYTE)NlsMbCodePageTag )
  {
    v14 = NlsMbAnsiCodePageTables;
    while( v8 )
    {
      --v5;
      --v8;
      v15 = (unsigned __int8)*v3;
      v16 = (unsigned __int16)NlsLeadByteInfoTable[v15];
      if( (_WORD)v16 )
      {
        if( !v8 )
        {
          *p_UnicodeStringDestination = 0;
          break;
        }
        v17 = (unsigned __int8)*++v3;
        *p_UnicodeStringDestination++ = *(_WORD *)(v14 + 2 * (v16 + v17));
        --v8;
      }
      else
      {
        *p_UnicodeStringDestination++ = *(_WORD *)(v15 * 2 + NlsAnsiToUnicodeData);
      }
      ++v3;
      if( !v5 )
        break;
    }
  }
  else
  {
    v9 = NlsAnsiToUnicodeData;
    v10 = &UnicodeStringDestination;
    v11 = v6;
    if( v6 > 1 )
      v11 = 1i64;
    do
    {
      v12 = (unsigned __int8)*v3;
      ++v10;
      ++v3;
      *(v10 - 1) = *(_WORD *)(v9 + 2 * v12);
      --v11;
    }
    while( v11 );
  }
  *SourceCharacter += v6;
  return UnicodeStringDestination;
}

Referenced by:

safecrt_mbtowc
toupper