PopPepDeviceDState

VOID __fastcall PopPepDeviceDState(
        PEPHANDLE__ *DpmContext,
        _DEVICE_POWER_STATE PowerState,
        INT64 TransitionComplete,
        INT64 SystemTransition){
  unsigned int v4; 
  __int64 v5; 
  int v6; 
  CHAR v7; 
  INT64 v9; 
  INT64 v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  int v14; 
  char v15; 
  __int64 v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned int v21; 
  __int64 v22; 
  __int64 v23; 
  int v24; 
  CHAR v25; 
  __int16 v26; 
  char v27; 
  unsigned int v28; 
  int v29; 
  v29 = SystemTransition;
  v4 = 0;
  v5 = PowerState;
  v6 = SystemTransition;
  v7 = TransitionComplete;
  if( (_BYTE)TransitionComplete )
  {
    if( PowerState == PowerDeviceD0
      && _InterlockedExchangeAdd((volatile signed __int32 *)DpmContext + 33, 0xFFFFFFFF) == 1 )
    {
      PopPepUpdateConstraints((INT64)DpmContext, 4i64, 1);
    }
  }
  else
  {
    if( PowerState > PowerDeviceD0 )
    {
      _InterlockedExchange((volatile __int32 *)DpmContext + 33, 2);
      PopPepUpdateConstraints((INT64)DpmContext, 4i64, 0);
      if( (unsigned int)(v6 - 1) <= 1 )
        _InterlockedDecrement((volatile signed __int32 *)DpmContext + 33);
    }
    v9 = *((unsigned int *)DpmContext + 42);
    if( (_DWORD)v9 != (_DWORD)v5 )
      PopPlNotifyDeviceDState(*((_QWORD *)DpmContext + 4), v9, (unsigned int)v5, 0);
  }
  if( !*((_BYTE *)DpmContext + 124) && !*((_BYTE *)DpmContext + 384) )
    goto LABEL_7;
  v11 = 0;
  if( (_DWORD)v5 != 4 )
    v11 = *((_DWORD *)DpmContext + v5 + 35);
  v12 = *((int *)DpmContext + 42);
  v28 = v11;
  v13 = 0;
  if( (_DWORD)v12 != 4 )
    v13 = *((_DWORD *)DpmContext + v12 + 35);
  if( !v7 && (_DWORD)v12 != (_DWORD)v5 )
  {
    if( (_DWORD)v5 == 1 )
    {
      v17 = 0;
      if( *((_DWORD *)DpmContext + 45) )
      {
        do
        {
          v18 = 200i64 * v17;
          v19 = *(unsigned int *)((char *)DpmContext + v18 + 360);
          PopPepUpdateIdleStateRefCount(
            0i64,
            *(unsigned int *)(*(_QWORD *)((char *)DpmContext + v18 + 376) + 24 * v19 + 16),
            1i64);
          PopFxUpdateComponentAccountingEnhanced(
            *((_QWORD *)DpmContext + 4),
            *(unsigned int *)((char *)DpmContext + v18 + 192),
            (unsigned int)v19,
            0i64);
          ++v17;
        }
        while( v17 < *((_DWORD *)DpmContext + 45) );
        v6 = v29;
        v4 = 0;
      }
      v11 = v28;
    }
    PopPepUpdateIdleStateRefCount(v13, v11, 1i64);
    PopFxUpdateDeviceAccountingEnhanced(*((_QWORD *)DpmContext + 4), (unsigned int)v5, 0i64);
  }
  if( *((_BYTE *)DpmContext + 124) )
  {
    v20 = *((_QWORD *)DpmContext + 4);
    v27 = 0;
    v24 = v5;
    v25 = v7;
    v26 = v6 == 1;
    v23 = *(_QWORD *)(v20 + 72);
    (*(void(__fastcall **)(__int64, __int64 *))(*(_QWORD *)(v20 + 64) + 96i64))(5i64, &v23);
  }
  if( v7 )
  {
    v14 = *((_DWORD *)DpmContext + 42);
    if( v14 != (_DWORD)v5 )
    {
      v15 = 0;
      if( PopFxPerfQueryOnDevicePowerChanges )
      {
        if( *((_BYTE *)DpmContext + 177) )
          goto LABEL_42;
        if( *((_BYTE *)DpmContext + 176) && (_DWORD)v5 == 1 )
          v15 = 1;
        if( v15 )
        {
LABEL_42:
          v21 = 0;
          if( *((_DWORD *)DpmContext + 45) )
          {
            do
            {
              v22 = 200i64 * v21;
              if( *((_BYTE *)DpmContext + v22 + 368) )
                PopFxUpdateComponentPerfStateNominalChange(
                  *((_QWORD *)DpmContext + 4),
                  *(_DWORD *)((char *)DpmContext + v22 + 192),
                  1u,
                  v5);
              ++v21;
            }
            while( v21 < *((_DWORD *)DpmContext + 45) );
            v14 = *((_DWORD *)DpmContext + 42);
          }
        }
      }
      if( v14 == 1 && *((_DWORD *)DpmContext + 45) )
      {
        do
        {
          v16 = 200i64 * v4;
          PopPepUpdateIdleStateRefCount(
            *(unsigned int *)(*(_QWORD *)((char *)DpmContext + v16 + 376)
                            + 24i64 * *(unsigned int *)((char *)DpmContext + v16 + 360)
                            + 16),
            0i64,
            0i64);
          PopFxUpdateComponentAccountingEnhanced(
            *((_QWORD *)DpmContext + 4),
            *(unsigned int *)((char *)DpmContext + v16 + 192),
            (unsigned int)(*(_DWORD *)((char *)DpmContext + v16 + 372) - 1),
            1i64);
          ++v4;
        }
        while( v4 < *((_DWORD *)DpmContext + 45) );
      }
      PopPepUpdateIdleStateRefCount(v13, v11, 0i64);
      PopFxUpdateDeviceAccountingEnhanced(*((_QWORD *)DpmContext + 4), (unsigned int)v5, 1i64);
    }
LABEL_7:
    if( v7 )
    {
      v10 = *((unsigned int *)DpmContext + 42);
      if( (_DWORD)v10 != (_DWORD)v5 )
      {
        PopPlNotifyDeviceDState(*((_QWORD *)DpmContext + 4), v10, (unsigned int)v5, v7);
        *((_DWORD *)DpmContext + 42) = v5;
      }
    }
  }
}

Referenced by:

PoFxReportDevicePoweredOn
PopIrpWorker
PopRequestCompletion