RtlpMuiRegLoadInstalledFromKey
__int64 __fastcall RtlpMuiRegLoadInstalledFromKey(__int64 a1, const WCHAR *a2, WCHAR a3){
unsigned int *v3;
unsigned int v5;
UINT64 v6;
NTSTATUS v7;
WCHAR v8;
unsigned __int64 v9;
UINT64 v10;
WCHAR v11;
VOID *v12;
__int16 v13;
unsigned int v14;
char v15;
void *v16;
void *v17;
UINT64 Length;
_LARGE_INTEGER *ResultLength;
int v21;
v3 = (unsigned int *)((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64);
v3[6] = 0;
*((_QWORD *)v3 + 1) = 0i64;
*v3 = 0;
v5 = 0;
*((_WORD *)v3 + 2) = -1;
*(_OWORD *)(v3 + 10) = 0i64;
*((_QWORD *)v3 + 2) = 0i64;
RtlInitUnicodeString((PUNICODE_STRING)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 40), a2, a3);
if( (int)LdrpOpenKey((_UNICODE_STRING *)(v3 + 10), 0i64, v6, (VOID **)v3 + 2) < 0 )
return 0i64;
do
{
LODWORD(Length) = 512;
v7 = ZwEnumerateKey(
*(VOID **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10),
v5,
KeyBasicInformation,
v3 + 16,
Length,
(UINT64 *)v3 + 3);
if( v7 < 0 )
{
if( v7 != -2147483622 )
goto LABEL_19;
}
else
{
v9 = *(unsigned int *)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x4C);
if( v9 + 24 <= 0x200 )
{
*(_WORD *)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 2 * (v9 >> 1) + 0x50) = 0;
RtlInitUnicodeString((PUNICODE_STRING)(v3 + 10), (PCWSTR)v3 + 40, v8);
if( (int)LdrpOpenKey(
(_UNICODE_STRING *)(v3 + 10),
*(VOID **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10),
v10,
(VOID **)v3 + 1) >= 0 )
{
RtlInitUnicodeString((PUNICODE_STRING)(v3 + 10), L"Type", v11);
v12 = *(VOID **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 8);
*(_DWORD *)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x20) = 4;
*(_DWORD *)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x1C) = 4;
if( (int)LdrpQueryValueKey(
v12,
(_UNICODE_STRING *)(v3 + 10),
(UINT64 *)v3 + 4,
(VOID *)((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64),
(UINT64 *)(v3 + 7),
ResultLength) >= 0
&& (int)ValidateRegistrLangType(*v3) >= 0 )
{
v14 = v13 & 0x419F;
*v3 = v14;
if( (v14 & 7) != 0 && (v14 & 7 & -(v14 & 7)) == (v14 & 7) )
{
if( (v14 & 0x180) == 0 || (v15 = v14, (v14 & 0x180 & -(v14 & 0x180)) != (v14 & 0x180)) )
{
v14 = v14 & 0xFFFFFE7F | 0x80;
*v3 = v14;
v15 = v14;
}
if( (v15 & 0x18) != 0
&& (v15 & 0x18 & -(v15 & 0x18)) == (v15 & 0x18)
&& ((v15 & 8) == 0 || (v15 & 4) != 0) )
{
RtlpMuiRegAddLanguageByName(
a1,
*(void **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 8),
(WCHAR *)v3 + 40,
v14,
Length,
(__int16 *)v3 + 2);
}
}
}
}
}
}
v16 = *(void **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 8);
if( v16 )
{
NtClose(v16);
*(_QWORD *)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 8) = 0i64;
}
++v5;
}
while( v7 != -2147483622 );
v7 = 0;
LABEL_19:
v17 = *(void **)(((unsigned __int64)&v21 & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
if( v17 )
NtClose(v17);
return(unsigned int)v7;
}Referenced by:
RtlpMuiRegLoadInstalled