PoFxRegisterPrimaryDevice
INT64 __fastcall PoFxRegisterPrimaryDevice(DEVICE_OBJECT *a1, INT64 a2, INT64 *a3){
PO_FX_COMPONENT_V2 *v3;
int v7;
void(__fastcall *v8)(void *, unsigned int);
UINT64 v9;
_POP_FX_DRIVER_CALLBACKS Callbacks;
v3 = 0i64;
if( a1 && a2 && *(_DWORD *)a2 == 1 )
{
v3 = PopFxConvertV1Components((PO_FX_COMPONENT_V1 *)(a2 + 80), *(unsigned int *)(a2 + 4));
if( !v3 )
return(unsigned int)-1073741670;
v8 = *(void(__fastcall **)(void *, unsigned int))(a2 + 16);
v9 = *(unsigned int *)(a2 + 4);
memset(&Callbacks.DripsWatchdogCallback, 0, 24);
Callbacks.ComponentActive = v8;
Callbacks.ComponentIdle = *(void(__fastcall **)(void *, unsigned int))(a2 + 24);
Callbacks.ComponentIdleState = *(void(__fastcall **)(void *, unsigned int, unsigned int))(a2 + 32);
Callbacks.DevicePowerRequired = *(void(__fastcall **)(void *))(a2 + 40);
Callbacks.DevicePowerNotRequired = *(void(__fastcall **)(void *))(a2 + 48);
Callbacks.PowerControl = *(int(__fastcall **)(void *, const _GUID *, void *, unsigned __int64, void *, unsigned __int64, unsigned __int64 *))(a2 + 56);
Callbacks.ComponentCriticalTransition = *(void(__fastcall **)(void *, unsigned int, unsigned __int8))(a2 + 64);
v7 = PopFxRegisterDevice(a1, &Callbacks, v3, v9, *(VOID **)(a2 + 72), 0i64, (POHANDLE__ **)a3);
if( v7 >= 0 && PopErrataDisablePrimaryDeviceFastResume && (*(_DWORD *)(a2 + 8) & 1) != 0 )
_InterlockedOr((volatile signed __int32 *)(*a3 + 824), 0x80u);
}
else
{
v7 = -1073741811;
}
if( v3 )
ExFreePoolWithTag(v3, 0x4D584650u);
return(unsigned int)v7;
}Referenced by:
No references.