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