PoFxReportDevicePoweredOn

INT8 __fastcall PoFxReportDevicePoweredOn(UINT64 a1){
  volatile int *v1; 
  unsigned int DeviceDStateReason; 
  INT64 v4; 
  volatile int *v5; 
  char v6; 
  __int64 v7; 
  _IRP *v8; 
  signed int v9; 
  char v10; 
  signed int v11; 
  signed __int32 v12; 
  signed __int32 v13; 
  ULONG_PTR v14; 
  __int64 v15; 
  ULONG_PTR i; 
  signed __int32 v17; 
  signed __int32 v18; 
  signed __int32 v19; 
  signed __int32 v20; 

  v1 = *(volatile int **)(a1 + 48);
  _m_prefetchw((const void *)(a1 + 32));
  if( (_InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFFFD) & 2) != 0 )
  {
    DeviceDStateReason = PopFxGetDeviceDStateReason(a1);
    LOBYTE(v4) = 1;
    PopPepDeviceDState(*(PEPHANDLE__ **)(a1 + 56), PowerDeviceD0, v4, DeviceDStateReason);
    PopDiagTraceFxDevicePowerState((VOID *)v1, PowerDeviceD0);
  }
  v5 = v1 + 22;
  v6 = ExAcquireSpinLockExclusive((INT64 *)v1 + 11);
  v8 = 0i64;
  v9 = _InterlockedExchange(v1 + 31, 0);
  v10 = v6;
  if( v9 > 0 )
  {
    v11 = *(_DWORD *)(*(_QWORD *)(a1 + 48) + 120i64);
    if( v9 > v11 )
      PopFxBugCheck(0x602u, (ULONG_PTR)v1, v9, 0);
    _InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFF7FE);
    *(_DWORD *)(*(_QWORD *)(a1 + 48) + 120i64) = v11 - v9;
    v7 = *(_QWORD *)(a1 + 48);
    _m_prefetchw((const void *)(v7 + 296));
    v12 = *(_DWORD *)(v7 + 296);
    do
    {
      v13 = v12;
      v12 = _InterlockedCompareExchange((volatile signed __int32 *)(v7 + 296), v12, v12);
    }
    while( v13 != v12 );
    if( (v12 & 4) != 0 )
    {
      v14 = *(_DWORD *)(a1 + 828);
      v15 = (unsigned int)v9;
      do
      {
        for( i = 0; i < v14; ++i )
        {
          PoFxIdleComponent(a1, i, 2ui64);
          v14 = *(_DWORD *)(a1 + 828);
        }
        --v15;
      }
      while( v15 );
    }
    v8 = *(_IRP **)(*(_QWORD *)(a1 + 48) + 280i64);
  }
  LOBYTE(v7) = v10;
  ExReleaseSpinLockExclusive(v5, v7);
  if( *(&stru_140CF2E80 + 1836) || (v17 = *(_DWORD *)(a1 + 824), (v17 & 0x80u) != 0) )
  {
    _m_prefetchw((const void *)(a1 + 32));
    v17 = *(_DWORD *)(a1 + 32);
    do
    {
      v20 = v17;
      v17 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v17, v17);
    }
    while( v20 != v17 );
    if( (v17 & 0x400) != 0 )
    {
      _InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFBFF);
      LOBYTE(v17) = PopSystemIrpCompletion(0i64, v8, *(&v8->Tail.IrpExtension + 9 * v8->StackCount));
    }
  }
  if( !v9 )
  {
    _m_prefetchw((const void *)(a1 + 32));
    v18 = *(_DWORD *)(a1 + 32);
    do
    {
      v19 = v18;
      v18 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v18, v18);
    }
    while( v19 != v18 );
    if( (v18 & 0x2000) != 0 )
      LOBYTE(v17) = PopFxDerefAndCompleteDirectedPowerTransition(a1);
    else
      LOBYTE(v17) = PopFxCompleteDevicePowerRequired((POP_FX_DEVICE *)a1, 0i64);
  }
  return v17;
}

Referenced by:

No references.