RtlpMuiRegValidateInstalled

NTSTATUS __fastcall RtlpMuiRegValidateInstalled(__int64 a1){
  __int16 v2; 
  int v3; 
  int v4; 
  wchar_t *v5; 
  unsigned __int16 v6; 
  unsigned int v7; 
  NTSTATUS InstallUILanguage; 
  int InstalledLanguageIndexByLangId; 
  __int64 v10; 
  WCHAR v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  int v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int16 v22; 
  unsigned int v23; 
  int v24; 
  __int64 v25; 
  __int64 v26; 
  wchar_t *v27; 
  bool v28; 
  LANGID v29; 
  unsigned int v30; 
  __int64 v31; 
  __int16 v32; 
  LANGID LanguageId[4]; 
  wchar_t *v34; 
  _UNICODE_STRING String; 
  UNICODE_STRING v36; 
  int v37; 
  unsigned __int16 v38; 
  int v39; 
  __int16 v40; 
  __int128 v41; 
  INT64 result[22]; 
  LanguageId[0] = 0;
  v2 = -1;
  *(_DWORD *)(&String.MaximumLength + 1) = 0;
  LanguageId[2] = -1;
  v34 = 0i64;
  v3 = -1;
  v4 = 0;
  v5 = 0i64;
  v41 = 0i64;
  v36 = 0i64;
  memset((INT64)result, 0i64);
  v6 = *(_WORD *)(a1 + 4);
  v7 = PsUILanguageComitted == 0 ? 0xC0000034 : 0;
  if( !v6 )
  {
    InstallUILanguage = NtQueryInstallUILanguage(LanguageId);
    if( InstallUILanguage < 0 )
      return InstallUILanguage;
    v6 = LanguageId[0];
  }
  InstalledLanguageIndexByLangId = RtlpMuiRegGetInstalledLanguageIndexByLangId(a1, v6, 0, &LanguageId[2]);
  if( InstalledLanguageIndexByLangId == -1073741772 || InstalledLanguageIndexByLangId == -1073741637 )
  {
    LanguageId[0] = -1;
    v27 = (wchar_t *)MuiRegAllocArray(v10, 0x55u);
    v34 = v27;
    v5 = v27;
    if( !v27 )
      return -1073741801;
    String.Buffer = v27;
    *(_DWORD *)&String.Length = 11141120;
    if( !RtlLCIDToCultureName(v6, &String) )
      goto LABEL_12;
    v28 = (int)RtlpMuiRegGetOrAddString(a1, String.Buffer, 1, (__int16 *)LanguageId) < 0;
    v29 = -1;
    if( !v28 )
      v29 = LanguageId[0];
    v39 = v29;
    v37 = 49;
    v38 = v6;
    v41 = 0ui64;
    v40 = 0;
    if( (int)RtlpMuiRegGetOrAddLangInfo((__int64 *)(a1 + 24), (__int64)&v37, 0i64) < 0 )
      goto LABEL_12;
    v12 = *(_QWORD *)(a1 + 24);
    v3 = *(unsigned __int16 *)(v12 + 6) - 1;
    goto LABEL_8;
  }
  if( InstalledLanguageIndexByLangId >= 0 )
  {
    v3 = (__int16)LanguageId[2];
    v12 = *(_QWORD *)(a1 + 24);
LABEL_8:
    if( v3 != -1 )
    {
      v13 = *(_QWORD *)(v12 + 16);
      v36.Buffer = (wchar_t *)result;
      v36.MaximumLength = 170;
      if( (int)RtlpGetNameFromLangInfoNode(a1, 28i64 * v3 + v13, &v36) >= 0 )
      {
        if( (int)RtlpIsALicensedRegularLanguage((_QWORD *)a1, v36.Buffer) < 0 )
        {
          *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + 28i64 * v3) &= ~0x20u;
          *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + 28i64 * v3) |= 0x8000u;
        }
        else
        {
          v4 = 1;
        }
      }
    }
  }
LABEL_12:
  if( !v7 )
    v2 = v3;
  RtlpRemovePendingDeleteLanguages(a1, v2, v11);
  v14 = *(_QWORD *)(a1 + 24);
  v15 = 0;
  if( *(_WORD *)(v14 + 6) )
  {
    v16 = *(_QWORD *)(a1 + 24);
    v17 = 0i64;
    do
    {
      v14 = v16;
      if( (*(_BYTE *)(v17 + *(_QWORD *)(v16 + 16)) & 0x22) == 34 )
      {
        RtlpMuiRegValidatePartialLanguage(a1, v15);
        v30 = v4 + 1;
        v14 = *(_QWORD *)(a1 + 24);
        v31 = *(_QWORD *)(v14 + 16);
        v32 = *(_WORD *)(v31 + v17);
        if( (v32 & 0x1000) != 0 )
          v30 = v4;
        v4 = v30;
        if( !v7 && v15 != v3 && v30 > *(_DWORD *)(a1 + 120) )
        {
          *(_WORD *)(v31 + v17) = v32 & 0xFFDF;
          *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + v17) |= 0x8000u;
          v14 = *(_QWORD *)(a1 + 24);
        }
      }
      ++v15;
      v17 += 28i64;
      v16 = v14;
    }
    while( v15 < *(unsigned __int16 *)(v14 + 6) );
    v5 = v34;
  }
  v18 = 0;
  if( *(_WORD *)(v14 + 6) )
  {
    v19 = v14;
    v20 = 0i64;
    do
    {
      v21 = *(_QWORD *)(v19 + 16);
      v14 = v19;
      v22 = *(_WORD *)(v21 + v20);
      if( (v22 & 0x21) == 33 )
      {
        v23 = v4 + 1;
        if( (v22 & 0x1000) != 0 )
          v23 = v4;
        v4 = v23;
        if( !v7 && v18 != v3 && v23 > *(_DWORD *)(a1 + 120) )
        {
          *(_WORD *)(v21 + v20) = v22 & 0xFFDF;
          *(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + v20) |= 0x8000u;
          v14 = *(_QWORD *)(a1 + 24);
        }
      }
      ++v18;
      v20 += 28i64;
      v19 = v14;
    }
    while( v18 < *(unsigned __int16 *)(v14 + 6) );
    v5 = v34;
  }
  v24 = 0;
  if( *(_WORD *)(v14 + 6) )
  {
    v25 = 0i64;
    do
    {
      v26 = v14;
      if( (*(_BYTE *)(v25 + *(_QWORD *)(v14 + 16)) & 4) != 0 )
      {
        RtlpMuiRegValidateLIPLanguage(a1, v24);
        v26 = *(_QWORD *)(a1 + 24);
      }
      ++v24;
      v25 += 28i64;
      v14 = v26;
    }
    while( v24 < *(unsigned __int16 *)(v26 + 6) );
  }
  if( v5 )
    ExFreePoolWithTag(v5, 0);
  return 0;
}

Referenced by:

RtlpMuiRegLoadInstalled