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