RtlpPopulateLanguageConfigList

INT64 __fastcall RtlpPopulateLanguageConfigList(VOID *a1, CHAR **a2, UINT64 a3){
  unsigned __int8 *v3; 
  int v4; 
  unsigned int v5; 
  UINT64 v6; 
  CHAR *v8; 
  NTSTATUS v9; 
  __int64 v10; 
  int v11; 
  CHAR *v12; 
  unsigned int v14; 
  unsigned __int64 v15; 
  __int16 v16; 
  int LanguageSpec; 
  __int64 v18; 
  __int16 v19; 
  __int16 v20; 
  __int16 v21; 
  __int64 v22; 
  const WCHAR *v23; 
  int v24; 
  int v25; 
  unsigned __int16 v26; 
  __int16 v27; 
  __int64 v28; 
  int v29; 
  CHAR *LanguageConfigList; 
  int v31; 
  UINT64 Length; 
  char v33; 
  v3 = (unsigned __int8 *)((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64);
  LOWORD(v4) = 0;
  *((_QWORD *)v3 + 4) = a3;
  v5 = 0;
  *((_QWORD *)v3 + 6) = a1;
  *((_WORD *)v3 + 2) = 0;
  v6 = a3;
  *v3 = 0;
  *((_DWORD *)v3 + 6) = 0;
  *((_QWORD *)v3 + 7) = 0i64;
  v8 = 0i64;
  *((_DWORD *)v3 + 16) = 0;
  if( a1 && a2 && a3 )
  {
    v8 = *a2;
    *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = *a2;
    *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = 0;
    while( 1 )
    {
      LODWORD(Length) = 512;
      v9 = ZwEnumerateValueKey(a1, v5, KeyValueFullInformation, v3 + 96, Length, (UINT64 *)v3 + 3);
      v4 = 0;
      v11 = v9;
      if( v9 < 0 )
        break;
      if( *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x64) == 7 )
      {
        v14 = *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x70);
        if( v14 + 24 <= 0x200 )
        {
          v15 = (unsigned __int64)v14 >> 1;
          v16 = *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v15 + 0x74);
          *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v15 + 0x74) = 0;
          LanguageSpec = RtlpMuiRegGetLanguageSpec(
                           v6,
                           (const WCHAR *)v3 + 58,
                           (char *)((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64),
                           v10,
                           (__int16 *)v3 + 2);
          v4 = 0;
          v11 = LanguageSpec;
          if( LanguageSpec >= 0 )
          {
            v19 = *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 4);
            v20 = *v3;
            *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v15 + 0x74) = v16;
            v21 = v20 << 14;
            *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x38) = v19;
            v22 = *(unsigned int *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x68);
            *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x3C) = 0i64;
            *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x3A) = v21;
            *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x28) = 0i64;
            *(_BYTE *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 1) = 0;
            *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 8) = 0;
            v23 = (const WCHAR *)&v3[v22 + 96];
            if( !v23 )
              goto LABEL_39;
            v24 = *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x6C);
            if( v24 )
            {
              v25 = 2 * v24;
              v26 = 0;
              do
              {
                if( *v23 == (_WORD)v4 || v25 <= 0 || v26 >= 3u )
                  break;
                if( (int)RtlpMuiRegGetLanguageSpec(
                            *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x20),
                            v23,
                            (char *)v3 + 1,
                            v18,
                            (__int16 *)v3 + 4) >= 0 )
                {
                  v27 = *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 8);
                  *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x3A) = ((*(_BYTE *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 1) & 3) << (2 * v26)) | v21 & ~(3 << (2 * v26));
                  *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 2i64 * v26 + 0x3E) = v27;
                  v21 = *(_WORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x3A);
                }
                v11 = RtlStringCbLengthW(v23, v25, (UINT64 *)v3 + 5);
                if( v11 < 0 )
                  goto LABEL_31;
                v28 = *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x28);
                v25 += -2 - v28;
                ++v26;
                v23 = (const WCHAR *)((char *)v23 + v28 + 2);
              }
              while( v23 );
              v11 = v4;
LABEL_31:
              v6 = *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x20);
            }
            else
            {
LABEL_39:
              v11 = -1073741811;
            }
            if( v11 >= 0 )
            {
              v29 = RtlpMuiRegValidateConfigNode(v6, (INT64)(v3 + 56));
              v4 = 0;
              v11 = v29;
              if( v29 >= 0 )
              {
                if( !v8 )
                {
                  LanguageConfigList = RtlpMuiRegCreateLanguageConfigList(0xFFFFFFFFui64);
                  *(_QWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = LanguageConfigList;
                  if( !LanguageConfigList )
                  {
                    v11 = -1073741801;
                    goto LABEL_12;
                  }
                  *a2 = LanguageConfigList;
                }
                v31 = RtlpMuiRegConfigListAddLanguage((ULONG_PTR *)v3 + 2, (__int16 *)v3 + 28);
                v8 = *(CHAR **)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
                v4 = 0;
                v11 = v31;
                if( v31 >= 0 )
                  *a2 = v8;
              }
            }
          }
          goto LABEL_7;
        }
      }
      v5 = *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0xC);
LABEL_8:
      if( v11 == -2147483622 )
      {
        v11 = v4;
        goto LABEL_10;
      }
      a1 = *(VOID **)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0x30);
    }
    if( v9 != -2147483622 )
      goto LABEL_10;
LABEL_7:
    v5 = *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) + 1;
    *(_DWORD *)(((unsigned __int64)&v33 & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = v5;
    goto LABEL_8;
  }
  v11 = -1073741811;
LABEL_10:
  if( !v8 && v11 != -1073741811 )
  {
LABEL_12:
    v12 = RtlpMuiRegCreateLanguageConfigList(1ui64);
    LOWORD(v4) = 0;
    *a2 = v12;
    v8 = v12;
    if( !v12 )
      v11 = -1073741801;
  }
  if( v11 < 0 && v8 )
    *((_WORD *)v8 + 2) = v4;
  return(unsigned int)v11;
}

Referenced by:

RtlpLoadLanguageConfigList