RtlpMuiRegPopulateBaseLanguages

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

Referenced by:

RtlpMuiRegInitPartialLanguage