PiDevCfgResolveVariableKeyValue
__int64 __fastcall PiDevCfgResolveVariableKeyValue(_QWORD *a1, void *a2, __int64 a3){
__int64 v3;
int v6;
NTSTATUS RegistryValue;
unsigned int *v8;
char *v9;
int v10;
unsigned int v11;
NTSTATUS v12;
NTSTATUS v13;
_KEY_VALUE_FULL_INFORMATION *v14;
UINT64 DataLength;
ULONG Type;
UINT8 *PoolWithTag;
UINT8 *v18;
HANDLE Handle;
PVOID v21;
PVOID P;
v21 = 0i64;
v3 = a3;
P = 0i64;
Handle = 0i64;
v6 = PiDevCfgResolveVariableKeyHandle(a1, a2, &Handle);
if( v6 < 0 )
goto LABEL_31;
RegistryValue = IopGetRegistryValue(a2, (PWCHAR)L"ValueName", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v21);
v8 = (unsigned int *)v21;
v6 = RegistryValue;
if( RegistryValue >= 0 )
{
if( !PnpValidateRegistryString((KEY_VALUE_FULL_INFORMATION *)v21) )
{
v6 = -1073741823;
goto LABEL_29;
}
v9 = (char *)v8 + v8[2];
if( *(_WORD *)v9 != 36 )
{
LABEL_12:
v12 = IopGetRegistryValue(Handle, (PWCHAR)v9, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
v6 = v12;
if( v12 < 0 )
{
if( v12 != -1073741772 )
goto LABEL_17;
v13 = IopGetRegistryValue(a2, (PWCHAR)L"DefaultValue", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
v6 = v13;
if( v13 < 0 )
{
if( v13 == -1073741772 )
{
v6 = 0;
v14 = 0i64;
goto LABEL_19;
}
LABEL_17:
v14 = (_KEY_VALUE_FULL_INFORMATION *)P;
goto LABEL_27;
}
}
v14 = (_KEY_VALUE_FULL_INFORMATION *)P;
LABEL_19:
if( v14 )
{
if( !PnpValidateRegistryValue(v14) )
{
v6 = -1073741823;
goto LABEL_27;
}
DataLength = v14->DataLength;
Type = v14->Type;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, DataLength, 0x63647050ui64);
v18 = PoolWithTag;
if( !PoolWithTag )
{
v6 = -1073741670;
goto LABEL_27;
}
memmove(PoolWithTag, (UINT8 *)v14 + v14->DataOffset, DataLength);
v3 = a3;
}
else
{
Type = 0;
LODWORD(DataLength) = 0;
v18 = 0i64;
}
*(_DWORD *)(v3 + 32) = Type;
*(_DWORD *)(v3 + 36) = DataLength;
*(_QWORD *)(v3 + 40) = v18;
LABEL_27:
if( v14 )
ExFreePoolWithTag(v14, 0);
goto LABEL_29;
}
v21 = 0i64;
v10 = PiDevCfgResolveVariable((INT64)a1, (const WCHAR *)v9 + 1, (CHAR **)&v21);
v6 = v10;
if( v10 >= 0 )
{
v11 = *((_DWORD *)v21 + 8);
if( v11 && (v11 <= 2 || v11 == 7) )
v9 = (char *)*((_QWORD *)v21 + 5);
goto LABEL_12;
}
if( v10 == -1073741772 )
goto LABEL_12;
}
LABEL_29:
if( v8 )
ExFreePoolWithTag(v8, 0);
LABEL_31:
if( Handle )
ZwClose(Handle);
return(unsigned int)v6;
}Referenced by:
No references.