RtlpMuiRegAddBaseLanguage

__int64 __fastcall RtlpMuiRegAddBaseLanguage(
        _MUIREGISTRYINFO *RegInfo,
        _WORD *a2,
        unsigned int a3,
        __int64 a4,
        __int64 a5){
  INT16 LangId; 
  UINT8 v8; 
  WCHAR *v9; 
  unsigned __int64 v10; 
  UINT8 v11; 
  wchar_t *Buffer; 
  UINT8 v13; 
  NTSTATUS v14; 
  __int16 v15; 
  __int16 v16; 
  int v17; 
  _MUIREGISTRYINFO *v18; 
  int v19; 
  NTSTATUS LanguageSpec; 
  char v21; 
  __int16 v22; 
  __int16 v23; 
  WCHAR *v24; 
  __int64 v25; 
  __int64 v26; 
  _WORD *v27; 
  UINT8 v29; 
  UINT8 LanguageSpecTypeRtrn; 
  char v31; 
  INT16 ResultIndexRtrn[2]; 
  __int16 v33; 
  INT16 LanguageSpecRtrn; 
  WCHAR *LanguageName; 
  NTSTATUS inited; 
  unsigned int v37; 
  _MUIREGISTRYINFO *RegInfoa; 
  _WORD *v39; 
  _UNICODE_STRING DestinationString; 
  _MUILANGINFO LangInfo; 

  LangId = 0;
  LanguageName = (WCHAR *)a5;
  v37 = a3;
  v39 = a2;
  RegInfoa = RegInfo;
  v8 = 0;
  v29 = 0;
  LanguageSpecTypeRtrn = 0;
  LanguageSpecRtrn = 0;
  DestinationString = 0i64;
  memset(&LangInfo, 0, sizeof(LangInfo));
  if( RegInfo && a2 && a4 && a3 <= 3 )
  {
    v9 = (WCHAR *)(a4 + *(unsigned int *)(a4 + 8));
    if( !*(_DWORD *)(a4 + 12) || !v9 || (v31 = 1, !*v9) )
      v31 = 0;
    v10 = (unsigned __int64)*(unsigned int *)(a4 + 16) >> 1;
    v33 = *(_WORD *)(a4 + 2 * v10 + 20);
    *(_WORD *)(a4 + 2 * v10 + 20) = 0;
    RtlInitUnicodeString(&DestinationString, (PCWSTR)(a4 + 20));
    ResultIndexRtrn[0] = 0;
    if( v31 )
    {
      Buffer = DestinationString.Buffer;
      v9[(unsigned __int64)*(unsigned int *)(a4 + 12) >> 1] = 0;
      inited = RtlpMuiRegInitAnyLanguage(RegInfo, (__int64)&LangInfo, Buffer, 1026);
      v14 = inited;
      if( inited < 0 )
        return(unsigned int)v14;
      v15 = v33;
      v16 = (LOBYTE(LangInfo.Flags) ^ (unsigned __int8)*v39) & 0x18;
      LOBYTE(v33) = 0;
      LangInfo.Flags ^= v16;
      *(_WORD *)(a4 + 2 * v10 + 20) = v15;
      v17 = 0;
      if( LanguageName
        && *LanguageName
        && RtlpLangNameInMultiSzString(v9, LanguageName)
        && RtlpMuiRegGetLanguageSpec(RegInfoa, LanguageName, &LanguageSpecTypeRtrn, v13, &LanguageSpecRtrn) >= 0 )
      {
        v17 = 1;
        LOBYTE(v33) = 1;
        LangInfo.FallbackSpecs[0] = LanguageSpecRtrn;
        LangInfo.FallbackTypes = LangInfo.FallbackTypes & 0xFFFC | LanguageSpecTypeRtrn & 3;
      }
      if( v9 )
      {
        v18 = RegInfoa;
        v19 = 2 * v17;
        LanguageName = (WCHAR *)&LangInfo.FallbackSpecs[v17];
        do
        {
          if( !*v9 || v19 >= 8 )
            break;
          LanguageSpec = RtlpMuiRegGetLanguageSpec(v18, v9, &v29, v13, ResultIndexRtrn);
          v8 = v29;
          LangId = ResultIndexRtrn[0];
          if( LanguageSpec >= 0
            && (!(_BYTE)v33 || LanguageSpecTypeRtrn != v29 || LanguageSpecRtrn != ResultIndexRtrn[0]) )
          {
            v21 = v19;
            v22 = LangInfo.FallbackTypes & ~(3 << v19);
            ++v17;
            v19 += 2;
            v23 = (v29 & 3) << v21;
            v24 = LanguageName;
            LangInfo.FallbackTypes = v23 | v22;
            *LanguageName = ResultIndexRtrn[0];
            LanguageName = v24 + 1;
          }
          v25 = -1i64;
          do
            ++v25;
          while( v9[v25] );
          v9 += v25 + 1;
        }
        while( v9 );
        v14 = inited;
      }
      if( v17 < 0 )
      {
        LangId = LangInfo.LangId;
        if( LangInfo.LangId )
        {
          v8 = 1;
LABEL_40:
          v26 = (int)v37;
          v27 = v39;
          v39[4] = v39[4] & ~(3 << (2 * v37)) | ((v8 & 3) << (2 * v37));
          v27[v26 + 6] = LangId;
          return(unsigned int)v14;
        }
        LangId = LangInfo.LangNameIndex;
        if( LangInfo.LangNameIndex > 0 )
        {
          v8 = 3;
          goto LABEL_40;
        }
        return(unsigned int)-1073741823;
      }
    }
    else
    {
      v14 = RtlpMuiRegGetLanguageSpec(RegInfo, DestinationString.Buffer, &v29, v11, ResultIndexRtrn);
      if( v14 < 0 )
        return(unsigned int)v14;
      v8 = v29;
      LangId = ResultIndexRtrn[0];
    }
    if( !v31 )
      goto LABEL_40;
    LangInfo.Flags &= ~0x20u;
    v14 = RtlpMuiRegGetOrAddLangInfo((_MUILANGUAGES **)RegInfoa + 3, &LangInfo, ResultIndexRtrn);
    if( v14 >= 0 )
    {
      LangId = ResultIndexRtrn[0];
      v8 = 2;
      goto LABEL_40;
    }
    return(unsigned int)v14;
  }
  return 3221225485i64;
}

Referenced by:

RtlpMuiRegPopulateBaseLanguages