RtlpMuiRegPopulateBaseLanguages

NTSTATUS __fastcall RtlpMuiRegPopulateBaseLanguages(_MUIREGISTRYINFO *RegInfo, __int64 a2, _WORD *a3, __int64 a4){
  unsigned __int64 v4; 
  __int64 v8; 
  __int16 v9; 
  NTSTATUS v10; 
  unsigned int v11; 
  NTSTATUS result; 
  unsigned __int16 v13; 
  unsigned __int16 v14; 
  __int64 v15; 
  VOID *v16; 
  __int64 v17; 
  unsigned int i; 
  unsigned __int64 v19; 
  __int16 v20; 
  __int64 v21; 
  unsigned int *v22; 
  UINT64 Length; 
  UINT64 Lengtha; 
  UINT16 InstallUILanguageId[2]; 

  v4 = (unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64;
  *(_QWORD *)(v4 + 48) = a2;
  *(_QWORD *)(v4 + 56) = a4;
  *(_DWORD *)(v4 + 44) = 0;
  *(_OWORD *)(v4 + 24) = 0i64;
  memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 64), 0i64, 0xAAu);
  memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 768), 0i64, 0xAAu);
  memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 944), 0i64, 0xAAu);
  *(_WORD *)v4 = 0;
  *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = 0i64;
  LODWORD(v8) = 0;
  *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 8) = 0;
  *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = 0;
  if( !RegInfo || !a3 || !a2 )
    return -1073741811;
  v9 = *((_WORD *)RegInfo + 2);
  v10 = 0;
  *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x28) = 0;
  v11 = 0;
  if( v9 )
  {
    v13 = *((_WORD *)RegInfo + 3);
    v14 = *((_WORD *)RegInfo + 4);
  }
  else
  {
    result = NtQueryInstallUILanguage((UINT16 *)((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64));
    v10 = result;
    if( result < 0 )
      return result;
    if( RtlpLoadInstallLanguageFallback(RegInfo, (UINT16 *)(v4 + 8), (UINT16 *)(v4 + 12)) >= 0 )
    {
      v13 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 8);
      v14 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC);
    }
    else
    {
      v13 = 0;
      v14 = 0;
    }
    v9 = *(_WORD *)v4;
    if( PsUILanguageComitted )
    {
      *((_WORD *)RegInfo + 4) = v14;
      *((_WORD *)RegInfo + 3) = v13;
      *((_WORD *)RegInfo + 2) = v9;
    }
  }
  v15 = -1i64;
  if( a3[2] == v9 )
  {
    if( v13 )
    {
      *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x20) = ((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
                                                                                           + 768;
      *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 512;
      *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x1A) = 170;
      if( RtlLCIDToCultureName(v13, v4 + 24) )
      {
        LODWORD(Length) = 512;
        if( ZwQueryValueKey(
               *(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30),
               (_UNICODE_STRING *)(v4 + 24),
               KeyValueFullInformation,
               (VOID *)(v4 + 256),
               Length,
               (UINT64 *)(v4 + 4)) >= 0
          && (int)RtlpMuiRegValidateAndGetInstallFallbackBase(
                    (__int64)RegInfo,
                    (_DWORD *)(v4 + 256),
                    v14,
                    (wchar_t *)(v4 + 944)) >= 0
          && (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, 0, v4 + 256, v4 + 944) >= 0 )
        {
          v11 = 1;
          v8 = -1i64;
          do
            ++v8;
          while( *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x300 + 2 * v8) );
        }
      }
    }
  }
  RtlInitUnicodeString((PUNICODE_STRING)(v4 + 24), L"DefaultFallback");
  v16 = *(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30);
  *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = 1;
  *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 170;
  if( LdrpQueryValueKey(v16, (_UNICODE_STRING *)(v4 + 24), (UINT64 *)(v4 + 12), (VOID *)(v4 + 64), (UINT64 *)(v4 + 4)) >= 0
    && *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) == 1
    && (!(_DWORD)v8
     || RtlCompareUnicodeStrings(
          (WCHAR *)(v4 + 64),
          (unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) >> 1,
          (WCHAR *)(v4 + 768),
          (unsigned int)v8,
          1u))
    && (RtlInitUnicodeString((PUNICODE_STRING)(v4 + 24), (PCWSTR)(v4 + 64)),
        LODWORD(Lengtha) = 512,
        *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 512,
        ZwQueryValueKey(
          v16,
          (_UNICODE_STRING *)(v4 + 24),
          KeyValueFullInformation,
          (VOID *)(v4 + 256),
          Lengtha,
          (UINT64 *)(v4 + 4)) >= 0)
    && *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x104) == 7
    && (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, v11, v4 + 256, 0i64) >= 0 )
  {
    ++v11;
    do
      ++v15;
    while( *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x40 + 2 * v15) );
    LODWORD(v17) = v15;
    *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = v15;
  }
  else
  {
    v17 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
  }
  if( v10 != -2147483622 )
  {
    for( i = *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x28); ; ++i )
    {
      if( v11 >= 4 )
        goto LABEL_47;
      LODWORD(Lengtha) = 512;
      if( ZwEnumerateValueKey(
             *(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30),
             i,
             KeyValueFullInformation,
             (VOID *)(v4 + 256),
             Lengtha,
             (UINT64 *)(v4 + 44)) < 0 )
        goto LABEL_47;
      if( *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x104) == 7
        && *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x110) <= 0x200u )
      {
        if( !(_DWORD)v17 && !(_DWORD)v8 )
          goto LABEL_44;
        v19 = (unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
                                                + 0x110) >> 1;
        v20 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114);
        *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114) = 0;
        if( !(_DWORD)v8
          || RtlCompareUnicodeStrings(
               (WCHAR *)(v4 + 276),
               (unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
                                                 + 0x110) >> 1,
               (WCHAR *)(v4 + 768),
               (unsigned int)v8,
               1u) )
        {
          v21 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
          if( !(_DWORD)v21
            || RtlCompareUnicodeStrings(
                 (WCHAR *)(v4 + 276),
                 (unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
                                                   + 0x110) >> 1,
                 (WCHAR *)(v4 + 64),
                 (unsigned int)v21,
                 1u) )
          {
            break;
          }
        }
      }
LABEL_46:
      v17 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
    }
    *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114) = v20;
LABEL_44:
    if( (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, v11, v4 + 256, 0i64) >= 0 )
      ++v11;
    goto LABEL_46;
  }
LABEL_47:
  v22 = *(unsigned int **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x38);
  if( v22 )
    *v22 = v11;
  return 0;
}

Referenced by:

RtlpMuiRegInitPartialLanguage