PiDevCfgQueryResolveValue
__int64 __fastcall PiDevCfgQueryResolveValue(__int64 a1, void *a2, const WCHAR *a3, _QWORD *a4){
NTSTATUS RegistryValue;
UINT8 *v7;
int v8;
WCHAR *v9;
CHAR *v10;
UINT8 *PoolWithTag;
UINT8 *v12;
UINT64 VariableModifiers;
PVOID P;
CHAR *v16;
_UNICODE_STRING VariableName;
P = 0i64;
LODWORD(VariableModifiers) = 0;
v16 = 0i64;
VariableName = 0i64;
RegistryValue = IopGetRegistryValue(a2, (PWCHAR)a3, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
v7 = (UINT8 *)P;
v8 = RegistryValue;
if( RegistryValue >= 0 )
{
*((_WORD *)P + 3) = 0;
if( *(_QWORD *)(a1 + 16)
&& (unsigned int)(*((_DWORD *)v7 + 1) - 1) <= 1
&& PnpValidateStringData((PWCHAR)&v7[*((unsigned int *)v7 + 2)], *((unsigned int *)v7 + 3))
&& PiDevCfgParseVariableName(v9, &VariableName, &VariableModifiers) )
{
v8 = PiDevCfgResolveVariable(a1, VariableName.Buffer, &v16);
if( v8 >= 0 )
{
v10 = v16;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(
PagedPool,
(unsigned int)(*((_DWORD *)v7 + 4) + 26 + *((_DWORD *)v16 + 9)),
0x63647050ui64);
v12 = PoolWithTag;
if( PoolWithTag )
{
*(_DWORD *)PoolWithTag = *(_DWORD *)v7;
*((_DWORD *)PoolWithTag + 4) = *((_DWORD *)v7 + 4);
*((_DWORD *)PoolWithTag + 1) = *((_DWORD *)v10 + 8);
*((_DWORD *)PoolWithTag + 3) = *((_DWORD *)v10 + 9);
*((_DWORD *)PoolWithTag + 2) = *((_DWORD *)v7 + 4) + 22;
memmove(PoolWithTag + 20, v7 + 20, *((unsigned int *)v7 + 4));
*(_WORD *)&v7[2 * ((unsigned __int64)*((unsigned int *)v7 + 4) >> 1) + 20] = 0;
memmove(&v12[*((unsigned int *)v12 + 2)], *((UINT8 **)v10 + 5), *((unsigned int *)v10 + 9));
*a4 = v12;
}
else
{
v8 = -1073741670;
}
}
}
else
{
*a4 = v7;
v7 = 0i64;
}
}
if( v7 )
ExFreePoolWithTag(v7, 0);
return(unsigned int)v8;
}Referenced by:
PiDevCfgConfigureDeviceKeys
PiDevCfgVerifyDeviceAllowed