PoFxRegisterCoreDevice
__int64 __fastcall PoFxRegisterCoreDevice(UNICODE_STRING *a1, __int64 a2, _QWORD *a3){
PO_FX_COMPONENT_V2 *v6;
PO_FX_COMPONENT_V2 *v7;
__int64 v8;
__int64 v9;
int v10;
UINT64 ComponentCount;
INT64 IrpStackSize;
_POP_FX_DRIVER_CALLBACKS Callbacks;
_POP_FX_DEVICE *Handle;
memset((INT64)&Callbacks, 0i64);
v6 = 0i64;
Handle = 0i64;
if( a1 && *(_DWORD *)a2 == 1 && *(_QWORD *)(a2 + 24) )
{
v7 = PopFxConvertV1Components((PO_FX_COMPONENT_V1 *)(a2 + 48), *(unsigned int *)(a2 + 4));
v6 = v7;
if( !v7 )
{
v10 = -1073741670;
goto LABEL_9;
}
Callbacks.ComponentActive = *(void(__fastcall **)(void *, unsigned int))(a2 + 8);
Callbacks.ComponentIdle = *(void(__fastcall **)(void *, unsigned int))(a2 + 16);
Callbacks.ComponentIdleState = *(void(__fastcall **)(void *, unsigned int, unsigned int))(a2 + 32);
Callbacks.ComponentCriticalTransition = *(void(__fastcall **)(void *, unsigned int, unsigned __int8))(a2 + 24);
LOBYTE(IrpStackSize) = 0;
LODWORD(ComponentCount) = *(_DWORD *)(a2 + 4);
v10 = PopFxRegisterDeviceWorker(
0i64,
a1,
&Callbacks,
v7,
ComponentCount,
*(VOID **)(a2 + 40),
IrpStackSize,
0i64,
&Handle);
if( v10 < 0 )
{
Handle = 0i64;
}
else
{
PopFxInsertDevice(v9, v8, Handle);
v10 = 0;
}
}
else
{
v10 = -1073741811;
}
if( v6 )
ExFreePoolWithTag(v6, 0x4D584650u);
LABEL_9:
*a3 = Handle;
return(unsigned int)v10;
}Referenced by:
HalpDmaInitPowerManagement
HalpInterruptInitPowerManagement
HalpTimerInitPowerManagement
PoFxRegisterDebugger