PoFxReportDevicePoweredOn

VOID __stdcall PoFxReportDevicePoweredOn(POHANDLE *Handle){
  POHANDLE v1; 
  unsigned int DeviceDStateReason; 
  INT64 v4; 
  volatile LONG *v5; 
  KIRQL v6; 
  __int64 v7; 
  int v8; 
  KIRQL v9; 
  int v10; 
  POHANDLE v11; 
  signed __int32 v12; 
  signed __int32 v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned int i; 
  signed __int32 v17; 
  signed __int32 v18; 
  signed __int32 v19; 
  signed __int32 v20; 
  v1 = Handle[6];
  _m_prefetchw(Handle + 4);
  if( (_InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFFFFD) & 2) != 0 )
  {
    DeviceDStateReason = PopFxGetDeviceDStateReason((INT64)Handle);
    LOBYTE(v4) = 1;
    PopPepDeviceDState((PEPHANDLE__ *)Handle[7], PowerDeviceD0, v4, DeviceDStateReason);
    PopDiagTraceFxDevicePowerState(v1, PowerDeviceD0);
  }
  v5 = (volatile LONG *)(v1 + 22);
  v6 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v1 + 22);
  v7 = 0i64;
  v8 = _InterlockedExchange((volatile __int32 *)v1 + 31, 0);
  v9 = v6;
  if( v8 > 0 )
  {
    v10 = *((_DWORD *)Handle[6] + 30);
    if( v8 > v10 )
      PopFxBugCheck(0x602ui64, (UINT64)v1, v8, 0i64);
    _InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFF7FE);
    *((_DWORD *)Handle[6] + 30) = v10 - v8;
    v11 = Handle[6];
    _m_prefetchw(v11 + 74);
    v12 = *((_DWORD *)v11 + 74);
    do
    {
      v13 = v12;
      v12 = _InterlockedCompareExchange((volatile signed __int32 *)v11 + 74, v12, v12);
    }
    while( v13 != v12 );
    if( (v12 & 4) != 0 )
    {
      v14 = *((_DWORD *)Handle + 207);
      v15 = (unsigned int)v8;
      do
      {
        for( i = 0; i < v14; ++i )
        {
          PoFxIdleComponent(Handle, i, 2ui64);
          v14 = *((_DWORD *)Handle + 207);
        }
        --v15;
      }
      while( v15 );
    }
    v7 = *((_QWORD *)Handle[6] + 35);
  }
  ExReleaseSpinLockExclusive(v5, v9);
  if( PopPoFxSystemIrpWaitForReportDevicePoweredReg || (*((_DWORD *)Handle + 206) & 0x80u) != 0 )
  {
    _m_prefetchw(Handle + 4);
    v19 = *((_DWORD *)Handle + 8);
    do
    {
      v20 = v19;
      v19 = _InterlockedCompareExchange((volatile signed __int32 *)Handle + 8, v19, v19);
    }
    while( v20 != v19 );
    if( (v19 & 0x400) != 0 )
    {
      _InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFFBFF);
      PopSystemIrpCompletion(0i64, (_IRP *)v7, *(PVOID *)(v7 + 72i64 * *(char *)(v7 + 66) + 200));
    }
  }
  if( !v8 )
  {
    _m_prefetchw(Handle + 4);
    v17 = *((_DWORD *)Handle + 8);
    do
    {
      v18 = v17;
      v17 = _InterlockedCompareExchange((volatile signed __int32 *)Handle + 8, v17, v17);
    }
    while( v18 != v17 );
    if( (v17 & 0x2000) != 0 )
      PopFxDerefAndCompleteDirectedPowerTransition(Handle);
    else
      PopFxCompleteDevicePowerRequired((ULONG_PTR)Handle, 0i64);
  }
}

Referenced by:

No references.