PopRequestPowerIrp

NTSTATUS __stdcall PopRequestPowerIrp(
        _DEVICE_OBJECT *TargetDevice,
        CHAR a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        CHAR a6,
        INT64 Irp){
  volatile __int64 *v7; 
  POWER_STATE PowerState; 
  char v11; 
  NTSTATUS result; 
  _IRP *v13; 
  __int64 v14; 
  INT64 v15; 
  __int64 v16; 
  __int64 v17; 
  INT64 v18; 
  __int64 v19; 
  __int64 v20; 
  char v21; 
  __int64 v22; 
  unsigned __int8 v23; 
  unsigned __int64 v24; 
  INT64 MustSucceed; 
  INT64 AllocatePendingIrp; 
  VOID *v27; 
  POWER_STATE v28[2]; 
  VOID *v29; 
  _IRP **vars0; 
  POP_IRP_DATA **anonymous1; 
  PVOID retaddr; 

  v7 = (volatile __int64 *)Irp;
  *(_QWORD *)&v28[0].SystemState = 0i64;
  PowerState.SystemState = a3;
  if( Irp )
    _InterlockedExchange64((volatile __int64 *)Irp, 0i64);
  Irp = 0i64;
  if( !a2 )
    goto LABEL_21;
  if( (unsigned __int8)(a2 - 2) > 1u )
    return -1073741584;
  v11 = 1;
  if( !(_BYTE)PopCurrentBroadcast )
LABEL_21:
    v11 = 0;
  LOBYTE(a3) = a2;
  LOBYTE(AllocatePendingIrp) = a6;
  LOBYTE(MustSucceed) = v11;
  result = PopAllocateIrp(
             TargetDevice,
             (_IRP *)a2,
             a3,
             (POWER_STATE_TYPE)(a2 != 0),
             PowerState,
             MustSucceed,
             AllocatePendingIrp,
             (VOID *)a4,
             (_DEVICE_OBJECT *)a5,
             (UINT8)&Irp,
             (POWER_STATE)v28,
             v27,
             *(_IO_STATUS_BLOCK **)&v28[0].SystemState,
             v29,
             vars0,
             anonymous1);
  if( result >= 0 && result != 259 )
  {
    v13 = (_IRP *)Irp;
    if( Irp )
    {
      v14 = *(_QWORD *)&v28[0].SystemState;
      v15 = Irp + 184;
      v16 = *(_QWORD *)(Irp + 184);
      *(_QWORD *)(v16 - 16) = PopRequestCompletion;
      *(_QWORD *)(v16 - 8) = v14;
      *(_BYTE *)(v16 - 69) = -32;
      if( v7 )
      {
        _InterlockedExchange64(v7, (__int64)v13);
        v13 = (_IRP *)Irp;
        v14 = *(_QWORD *)&v28[0].SystemState;
      }
      v17 = *(_QWORD *)v15;
      if( a2 )
      {
        *(_DWORD *)(v17 - 56) = 1;
        *(POWER_STATE *)(v17 - 48) = PowerState;
        if( (_BYTE)PopCurrentBroadcast )
        {
          v18 = *(_QWORD *)(v14 + 200);
          if( !v18 || PopFxGetDeviceDStateReason(v18) == 1 )
          {
            *(_DWORD *)(v17 - 40) = PopMapInternalActionToIrpAction(
                                      SDWORD2(PopCurrentBroadcast),
                                      (_SYSTEM_POWER_STATE)(WORD2(PopCurrentBroadcast) >> 12),
                                      1u);
            *(_DWORD *)(v17 - 64) = DWORD1(PopCurrentBroadcast);
          }
        }
        v19 = *(_QWORD *)(v14 + 200);
        if( v19 && a2 == 2 )
        {
          if( (_InterlockedCompareExchange((volatile signed __int32 *)(v19 + 824), 0, 0) & 0x20) != 0 )
          {
            _m_prefetchw((const void *)(v19 + 32));
            if( (_InterlockedOr((volatile signed __int32 *)(v19 + 32), 0) & 0x2000) != 0 )
            {
              v23 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v19 + 1152));
              *(_DWORD *)(v19 + 1180) |= 1u;
              v24 = v23;
              _InterlockedIncrement((volatile signed __int32 *)(v19 + 1160));
              KxReleaseSpinLock((UINT64 *)(v19 + 1152));
              __writecr8(v24);
            }
          }
          v13 = (_IRP *)Irp;
        }
        if( (xmmword_140CFB490 & 0x8000) != 0 )
          PopLogNotifyDevice(TargetDevice, 0i64, v13);
        PopQueueQuerySetIrp(v13);
      }
      else
      {
        v20 = *(_QWORD *)(v14 + 200);
        if( v20 )
        {
          _m_prefetchw((const void *)(v20 + 32));
          v21 = _InterlockedOr((volatile signed __int32 *)(v20 + 32), 0);
          v22 = *(_QWORD *)&v28[0].SystemState;
          v21 &= 1u;
          *(_BYTE *)(*(_QWORD *)&v28[0].SystemState + 208i64) = v21;
          v21 ^= 1u;
          *(_BYTE *)(v22 + 209) = v21;
          v15 = *(_QWORD *)(v14 + 200);
          if( v21 )
          {
            PopPepDeviceWaitWake(*(PEPHANDLE **)(v15 + 56), 0);
          }
          else
          {
            if( _InterlockedExchangeAdd((volatile signed __int32 *)(v15 + 244), 0xFFFFFFFF) == 1 )
              KeSetEvent((PRKEVENT)(v15 + 248), 0, 0);
            *(_QWORD *)(v14 + 200) = 0i64;
          }
          v13 = (_IRP *)Irp;
        }
        *(POWER_STATE *)(v17 - 64) = PowerState;
        PopDiagTraceIrpStart((_IRP *)v15);
        IofCallDriverSpecifyReturn(*(_DEVICE_OBJECT **)(v17 - 32), v13, retaddr);
      }
      return 259;
    }
    else
    {
      return -1073741670;
    }
  }
  return result;
}

Referenced by:

PoRequestPowerIrp
PopFxReleasePowerIrp
PopScanIdleList