AslpProcessMatchRegNode
INT64 __fastcall AslpProcessMatchRegNode(INT64 a1, INT64 a2, INT64 a3){
_QWORD *v4;
void *v5;
int Key;
UINT8 *Buffer;
__int64 v8;
__int64 v9;
wchar_t *v10;
INT64 v11;
__int64 v12;
VOID *v13;
__int16 *v14;
__int16 v15;
NTSTATUS v16;
__int64 v17;
WCHAR *v18;
void *v19;
struct _UNICODE_STRING Destination;
Destination = 0i64;
if( *(_QWORD *)(a1 + 8) == a2 )
{
v4 = (_QWORD *)(a1 + 32);
v5 = *(void **)(a1 + 32);
if( v5 )
{
ZwClose(v5);
*v4 = 0i64;
Key = -2147483622;
}
else
{
Key = AslRegistryGetKey();
}
Buffer = (UINT8 *)Destination.Buffer;
}
else
{
v8 = *(_QWORD *)(a1 + 24);
v9 = -1i64;
do
++v9;
while( *(_WORD *)(v8 + 2 * v9) );
Destination.MaximumLength = 2 * (v9 + 261);
v10 = (wchar_t *)AslAlloc((VOID *)0x105, Destination.MaximumLength, a3);
v12 = *(_QWORD *)(a1 + 8);
Buffer = (UINT8 *)v10;
Destination.Buffer = v10;
v13 = *(VOID **)(v12 + 32);
while( 1 )
{
*(_WORD *)Buffer = 0;
Key = AslRegistryEnumKey(Buffer, v11, v13, *(unsigned int *)(a1 + 40));
if( Key < 0 )
break;
v14 = *(__int16 **)(a1 + 24);
++*(_DWORD *)(a1 + 40);
v15 = *v14;
*v14 = 0;
v16 = AslStringPatternMatchW(*(PWCHAR *)(a1 + 16), (PWCHAR)Buffer);
**(_WORD **)(a1 + 24) = v15;
if( v16 )
{
v17 = -1i64;
do
++v17;
while( *(_WORD *)&Buffer[2 * v17] );
v18 = *(WCHAR **)(a1 + 24);
Destination.Length = 2 * v17;
RtlAppendUnicodeToString(&Destination, v18);
v19 = *(void **)(a1 + 32);
if( v19 )
{
ZwClose(v19);
*(_QWORD *)(a1 + 32) = 0i64;
}
Buffer = (UINT8 *)Destination.Buffer;
Key = AslRegistryOpenSubKey((PHANDLE)(a1 + 32));
if( Key >= 0 )
goto LABEL_18;
}
}
*(_DWORD *)(a1 + 40) = 0;
}
LABEL_18:
if( Buffer )
ExFreePoolWithTag(Buffer, 0x74705041u);
return(unsigned int)Key;
}Referenced by:
AslRegWildcardFindNext