PopPowerRequestCleanUp

VOID __stdcall PopPowerRequestCleanUp(_PO_POWER_REQUEST *Request){
  char v1; 
  _EPROCESS *v2; 
  unsigned int v3; 
  __int64 v5; 
  _PO_POWER_REQUEST **v6; 
  char v7; 
  unsigned int v8; 
  int *v9; 
  __int64 v10; 
  _PO_POWER_REQUEST *v11; 
  _PO_POWER_REQUEST v12; 
  int v13; 
  __int64 v14; 
  _PO_POWER_REQUEST **v15; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v1 = *((_BYTE *)Request + 136);
  v2 = 0i64;
  v3 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( !*(_QWORD *)Request )
    return;
  PopAcquirePowerRequestPushLock(1u);
  v5 = *(_QWORD *)Request;
  if( !*(_QWORD *)Request )
  {
    PopReleasePowerRequestPushLock();
    return;
  }
  v6 = (_PO_POWER_REQUEST **)*((_QWORD *)Request + 1);
  if( *(_PO_POWER_REQUEST **)(v5 + 8) != Request || *v6 != Request )
    goto LABEL_43;
  *v6 = (_PO_POWER_REQUEST *)v5;
  *(_QWORD *)(v5 + 8) = v6;
  *(_QWORD *)Request = 0i64;
  if( Request[11] && (*(&stru_140C23628 + 2092) || v1) )
  {
    Request[11] = 0;
    if( !v1 && (Request[6] & 8) == 0 )
      --dword_140C00300;
  }
  if( PopPowerRequestIsExecutionRequiredCapable((INT64)Request) )
    PopUpdatePowerRequestProcessWakeCounter((UINT64)Request, 0);
  if( *((_QWORD *)Request + 15) )
  {
    v2 = (_EPROCESS *)*((_QWORD *)Request + 15);
    ObfReferenceObjectWithTag(v2, 0x72506F50ui64);
    *((_QWORD *)Request + 15) = 0i64;
  }
  if( v1 )
    --*(&stru_140C23628 + 702);
  else
    --*(&stru_140C23628 + 703);
  PopPowerRequestDeleteEntryById((unsigned int)Request[7]);
  PopReleasePowerRequestPushLock();
  PopStatsDeletePowerRequest((INT64)Request);
  PopDiagTracePowerRequestClose(Request);
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C23628 + 751, &LockHandle);
  v7 = *((_BYTE *)Request + 78);
  if( !v7 )
    goto LABEL_13;
  v14 = *((_QWORD *)Request + 7);
  v15 = (_PO_POWER_REQUEST **)*((_QWORD *)Request + 8);
  if( *(_PO_POWER_REQUEST **)(v14 + 8) != Request + 14 || *v15 != Request + 14 )
LABEL_43:
    __fastfail(3u);
  *v15 = (_PO_POWER_REQUEST *)v14;
  *(_QWORD *)(v14 + 8) = v15;
  *((_BYTE *)Request + 78) = 0;
LABEL_13:
  v8 = 0;
  v9 = PopPowerRequestAttributes;
  v10 = 0i64;
  v11 = Request + 8;
  do
  {
    v12 = Request[6];
    if( !_bittest(&v12, v8) && *v11 )
    {
      v13 = *v9 - 1;
      *v9 = v13;
      if( !v8 || v8 == 3 || !v13 )
        --*((_BYTE *)Request + v10 + 72);
      if( !v8 )
        v3 = 2;
    }
    ++v8;
    ++v10;
    ++v11;
    v9 += 4;
  }
  while( v8 < 6 );
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  PopPowerRequestExecuteCallbacks((INT8 *)Request + 72, (unsigned int)Request[7], (unsigned int)Request[4]);
  if( v7 )
    ObfDereferenceObjectWithTag(Request, 0x72506F50ui64);
  PoDestroyReasonContext(*((_DIAGNOSTIC_CONTEXT **)Request + 10));
  if( Request[22] )
    PopNotifySessionUserPowerRequestDeleted((unsigned int)Request[4], (unsigned int)Request[7]);
  if( !v1 )
    PopUmpoSendPowerRequestOverrideCleanup(Request);
  if( v2 )
  {
    PopProcessDisplayRequiredChange(v2, v3);
    ObfDereferenceObjectWithTag(v2, 0x72506F50ui64);
  }
}

Referenced by:

PoDeletePowerRequest
PopClosePowerRequestObject
PopDeletePowerRequestObject
PspExitThread