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