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.