PoSetPowerRequestInternal

INT64 __fastcall PoSetPowerRequestInternal(INT64 a1, UINT64 a2){
  __int64 v2; 
  char v3; 
  char v5; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v7; 
  int v8; 
  INT64 v9; 
  INT64 v10; 
  INT64 v11; 
  int v12; 
  int v13; 
  int v14; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  INT64 v17; 
  INT64 v18; 
  INT64 v19; 
  INT64 v20; 
  v2 = (int)a2;
  v3 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = 0;
  CurrentIrql = KeGetCurrentIrql();
  v7 = 0i64;
  v8 = 0;
  if( (unsigned int)a2 > 5 || ((1 << a2) & *(_DWORD *)(a1 + 20)) == 0 )
    return(unsigned int)-1073741637;
  if( *(_DWORD *)(a1 + 88) )
    v3 = (unsigned int)a2 <= 3;
  if( (_DWORD)a2 == 3 && *(_QWORD *)(a1 + 120) != *((_QWORD *)KeGetCurrentThread() + 23) )
    return(unsigned int)-1073741637;
  if( v3 || (_DWORD)a2 == 3 )
  {
    v5 = 1;
    PopAcquirePowerRequestPushLock(1);
    v3 = PopPowerRequestNotificationsEnabled != 0 ? v3 : 0;
  }
  PopAcquirePowerRequestSpinLock(&LockHandle);
  v9 = 4 * v2;
  v10 = *(unsigned int *)(4 * v2 + a1 + 32);
  if( (_DWORD)v10 == -1 )
  {
    v14 = -1073741675;
    goto LABEL_17;
  }
  v11 = (unsigned int)(v10 + 1);
  *(_DWORD *)(v9 + a1 + 32) = v11;
  if( ((1 << v2) & *(_DWORD *)(a1 + 24)) != 0 )
    goto LABEL_39;
  if( (_DWORD)v10 )
  {
    if( !v3 )
    {
LABEL_16:
      PopDiagTracePowerRequestChange(
        a1,
        v9,
        (EVENT_DESCRIPTOR *)v10,
        v11,
        (INT64)LockHandle.LockQueue.Next,
        (INT64)LockHandle.LockQueue.Lock,
        *(INT64 *)&LockHandle.OldIrql,
        v17,
        v18,
        v19,
        v20);
      v14 = 0;
      goto LABEL_17;
    }
LABEL_39:
    v3 = 0;
    goto LABEL_16;
  }
  v11 = (INT64)PopPowerRequestAttributes;
  v12 = PopPowerRequestAttributes[4 * v2];
  if( v12 != -1 )
  {
    v13 = v12 + 1;
    PopPowerRequestAttributes[4 * v2] = v13;
    if( (v2 & 0xFFFFFFFC) == 0 && (_DWORD)v2 != 2 || v13 == 1 )
    {
      LOBYTE(v10) = 1;
      PopQueuePowerRequestCallback(a1, (unsigned int)v2, v10, CurrentIrql >= 2u);
    }
    if( !(_DWORD)v2 && *(_QWORD *)(a1 + 120) && CurrentIrql < 2u )
    {
      v7 = *(_QWORD **)(a1 + 120);
      ObfReferenceObjectWithTag(v7, 0x72506F50u);
      v8 = 1;
    }
    goto LABEL_16;
  }
  v14 = -1073741675;
  *(_DWORD *)(v9 + a1 + 32) = v10;
LABEL_17:
  PopReleasePowerRequestSpinLock(&LockHandle);
  if( v14 >= 0 && v3 )
    PopNotifyUserPowerRequestAction(a1, (unsigned int)v2, 1);
  if( v5 )
    PopReleasePowerRequestPushLock();
  if( v14 >= 0 && CurrentIrql < 2u && *(_BYTE *)(a1 + 78) )
    PopPowerRequestCallbackWorker(0i64);
  if( v7 )
  {
    PopProcessDisplayRequiredChange(v7, v8);
    ObfDereferenceObjectWithTag(v7, 0x72506F50ui64);
  }
  return(unsigned int)v14;
}

Referenced by:

NtPowerInformation
PoSetPowerRequest
PopPowerRequestActionInfo
PpmBeginHighPerfRequest