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