RtlpMuiRegValidateInstalled

NTSTATUS __stdcall RtlpMuiRegValidateInstalled(_MUIREGISTRYINFO *RegInfo){
  INT16 v2; 
  int v3; 
  int v4; 
  wchar_t *v5; 
  UINT16 v6; 
  unsigned int v7; 
  NTSTATUS result; 
  NTSTATUS InstalledLanguageIndexByLangId; 
  INT64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  int v14; 
  __int64 v15; 
  __int64 v16; 
  int v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int16 v21; 
  unsigned int v22; 
  int v23; 
  __int64 v24; 
  __int64 v25; 
  wchar_t *v26; 
  bool v27; 
  __int16 v28; 
  unsigned int v29; 
  __int64 v30; 
  __int16 v31; 
  UINT16 InstallUILanguageId[4]; 
  wchar_t *v33; 
  _UNICODE_STRING String; 
  _UNICODE_STRING uString; 
  _MUILANGINFO LangInfo; 
  char v37[176]; 

  InstallUILanguageId[0] = 0;
  v2 = -1;
  *(_DWORD *)(&String.MaximumLength + 1) = 0;
  InstallUILanguageId[2] = -1;
  v33 = 0i64;
  v3 = -1;
  v4 = 0;
  v5 = 0i64;
  *(_OWORD *)LangInfo.FallbackSpecs = 0i64;
  uString = 0i64;
  memset(v37, 0i64, 0xAAu);
  v6 = *((_WORD *)RegInfo + 2);
  v7 = PsUILanguageComitted == 0 ? 0xC0000034 : 0;
  if( !v6 )
  {
    result = NtQueryInstallUILanguage(InstallUILanguageId);
    if( result < 0 )
      return result;
    v6 = InstallUILanguageId[0];
  }
  InstalledLanguageIndexByLangId = RtlpMuiRegGetInstalledLanguageIndexByLangId(
                                     RegInfo,
                                     v6,
                                     0,
                                     (INT16 *)&InstallUILanguageId[2]);
  if( InstalledLanguageIndexByLangId == -1073741772 || InstalledLanguageIndexByLangId == -1073741637 )
  {
    InstallUILanguageId[0] = -1;
    v26 = (wchar_t *)MuiRegAllocArray(v10, 0x55ui64);
    v33 = v26;
    v5 = v26;
    if( !v26 )
      return -1073741801;
    String.Buffer = v26;
    *(_DWORD *)&String.Length = 11141120;
    if( !RtlLCIDToCultureName(v6, (INT64)&String) )
      goto LABEL_12;
    v27 = RtlpMuiRegGetOrAddString(RegInfo, String.Buffer, 1u, (INT16 *)InstallUILanguageId) < 0;
    v28 = -1;
    if( !v27 )
      v28 = InstallUILanguageId[0];
    LangInfo.LangNameIndex = v28;
    *(_DWORD *)&LangInfo.Flags = 49;
    LangInfo.LangId = v6;
    memset(&LangInfo.FallbackTypes, 0, 20);
    if( RtlpMuiRegGetOrAddLangInfo((_MUILANGUAGES **)RegInfo + 3, &LangInfo, 0i64) < 0 )
      goto LABEL_12;
    v11 = *((_QWORD *)RegInfo + 3);
    v3 = *(unsigned __int16 *)(v11 + 6) - 1;
    goto LABEL_8;
  }
  if( InstalledLanguageIndexByLangId >= 0 )
  {
    v3 = (__int16)InstallUILanguageId[2];
    v11 = *((_QWORD *)RegInfo + 3);
LABEL_8:
    if( v3 != -1 )
    {
      v12 = *(_QWORD *)(v11 + 16);
      uString.Buffer = (wchar_t *)v37;
      uString.MaximumLength = 170;
      if( RtlpGetNameFromLangInfoNode(RegInfo, (_MUILANGINFO *)(28i64 * v3 + v12), &uString) >= 0 )
      {
        if( RtlpIsALicensedRegularLanguage(RegInfo, uString.Buffer) < 0 )
        {
          *(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + 28i64 * v3) &= ~0x20u;
          *(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + 28i64 * v3) |= 0x8000u;
        }
        else
        {
          v4 = 1;
        }
      }
    }
  }
LABEL_12:
  if( !v7 )
    v2 = v3;
  RtlpRemovePendingDeleteLanguages(RegInfo, v2);
  v13 = *((_QWORD *)RegInfo + 3);
  v14 = 0;
  if( *(_WORD *)(v13 + 6) )
  {
    v15 = *((_QWORD *)RegInfo + 3);
    v16 = 0i64;
    do
    {
      v13 = v15;
      if( (*(_BYTE *)(v16 + *(_QWORD *)(v15 + 16)) & 0x22) == 34 )
      {
        RtlpMuiRegValidatePartialLanguage((__int64)RegInfo, v14);
        v29 = v4 + 1;
        v13 = *((_QWORD *)RegInfo + 3);
        v30 = *(_QWORD *)(v13 + 16);
        v31 = *(_WORD *)(v30 + v16);
        if( (v31 & 0x1000) != 0 )
          v29 = v4;
        v4 = v29;
        if( !v7 && v14 != v3 && v29 > RegInfo[30] )
        {
          *(_WORD *)(v30 + v16) = v31 & 0xFFDF;
          *(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + v16) |= 0x8000u;
          v13 = *((_QWORD *)RegInfo + 3);
        }
      }
      ++v14;
      v16 += 28i64;
      v15 = v13;
    }
    while( v14 < *(unsigned __int16 *)(v13 + 6) );
    v5 = v33;
  }
  v17 = 0;
  if( *(_WORD *)(v13 + 6) )
  {
    v18 = v13;
    v19 = 0i64;
    do
    {
      v20 = *(_QWORD *)(v18 + 16);
      v13 = v18;
      v21 = *(_WORD *)(v20 + v19);
      if( (v21 & 0x21) == 33 )
      {
        v22 = v4 + 1;
        if( (v21 & 0x1000) != 0 )
          v22 = v4;
        v4 = v22;
        if( !v7 && v17 != v3 && v22 > RegInfo[30] )
        {
          *(_WORD *)(v20 + v19) = v21 & 0xFFDF;
          *(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + v19) |= 0x8000u;
          v13 = *((_QWORD *)RegInfo + 3);
        }
      }
      ++v17;
      v19 += 28i64;
      v18 = v13;
    }
    while( v17 < *(unsigned __int16 *)(v13 + 6) );
    v5 = v33;
  }
  v23 = 0;
  if( *(_WORD *)(v13 + 6) )
  {
    v24 = 0i64;
    do
    {
      v25 = v13;
      if( (*(_BYTE *)(v24 + *(_QWORD *)(v13 + 16)) & 4) != 0 )
      {
        RtlpMuiRegValidateLIPLanguage((__int64)RegInfo, v23);
        v25 = *((_QWORD *)RegInfo + 3);
      }
      ++v23;
      v24 += 28i64;
      v13 = v25;
    }
    while( v23 < *(unsigned __int16 *)(v25 + 6) );
  }
  if( v5 )
    ExFreePoolWithTag(v5, 0);
  return 0;
}

Referenced by:

RtlpMuiRegLoadInstalled