PspChargeProcessWakeCounter
NTSTATUS __stdcall PspChargeProcessWakeCounter(INT64 a1, INT64 a2, CHAR a3, INT64 a4){
char v4;
int v6;
char v7;
bool v8;
__int64 v9;
bool v10;
int v11;
bool v12;
int v13;
volatile signed __int32 *v14;
int v15;
int v16;
int v17;
PS_WAKE_REASON v18;
INT64 v19;
INT64 v20;
int v22;
_EPROCESS *v23;
int v24;
UINT64 Flags;
_EPROCESS *Process;
UINT64 Tag;
char v28;
int v29;
int v30;
int v31;
UINT64 v32;
_KTHREAD *Thread;
_EJOB *BaseJob;
bool v35;
int v36;
_PS_WAKE_REASON WakeReason;
signed int v39;
char v40;
int *v41;
WakeReason = a3;
v36 = a2;
v4 = 0;
v31 = 1;
v30 = 0;
v6 = a2 & 2;
v28 = 0;
v29 = a3;
Thread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0;
v8 = 0;
--Thread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 1080), 0i64);
v9 = *(_QWORD *)(a1 + 1296);
v10 = v6 != 0;
v35 = v6 != 0;
BaseJob = (_EJOB *)v9;
if( !v9 || (v11 = *(_DWORD *)(v9 + 1320), v12 = v6 != 0, v35 = v6 != 0, (v11 & 0x1000) == 0) )
{
v13 = v29;
goto LABEL_4;
}
if( v6 )
{
if( (v11 & 0x800000) != 0 )
{
v35 = v6 != 0;
if( v39 > 0 )
{
LABEL_31:
v13 = v29;
goto LABEL_12;
}
}
}
v22 = v36;
v23 = KeGetCurrentThread()->ApcState.Process;
v32 = (UINT64)v23;
if( (v36 & 1) != 0 )
{
v35 = v6 != 0;
if( !PspCheckConditionalWakeCharge(v23, (_EJOB *)v9, WakeReason) )
goto LABEL_31;
v12 = v6 != 0;
v22 = v36;
v23 = (_EPROCESS *)v32;
}
if( (v23->Flags2 & 0x40) != 0 || !v6 )
{
v13 = v29;
v10 = 0;
v35 = 0;
}
else
{
v31 = 5;
v13 = 7;
if( v22 < 0 )
v31 = 7;
v10 = v12;
v35 = v12;
}
v4 = 1;
LABEL_4:
if( !v40 || v4 || *(_QWORD *)(a1 + 2464) )
{
if( v10 )
{
v14 = (volatile signed __int32 *)(a1 + 2508);
v13 = 7;
}
else
{
v14 = (volatile signed __int32 *)(a1 + 4 * ((int)WakeReason + 618i64));
}
v15 = _InterlockedExchangeAdd(v14, v39) + v39;
v7 = 1;
v16 = v15 & 0x7FFFFFFF;
v8 = v15 < 0;
if( v15 >= 0 )
v16 = v15;
v30 = v16;
if( !v10 )
{
v30 = v16;
if( *(_QWORD *)(a1 + 2464) )
{
v24 = 1 << WakeReason;
if( v39 <= 0 )
{
if( (v24 & *(_DWORD *)(a1 + 2504)) != 0 && !v16 )
{
v28 = 1;
v30 = 0;
goto LABEL_12;
}
}
else if( (v24 & *(_DWORD *)(a1 + 2500)) != 0 && v16 == 1 )
{
v28 = 1;
v30 = 1;
goto LABEL_12;
}
v28 = 0;
v30 = v16;
}
}
}
LABEL_12:
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 1080), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 1080));
KeAbPostRelease((VOID *)(a1 + 1080));
KeLeaveCriticalRegionThread(&Thread->Tcb);
if( v28 )
{
LODWORD(Tag) = 0;
LODWORD(Process) = 0;
ZwUpdateWnfStateData((const _WNF_STATE_NAME *)(a1 + 2464), 0i64, 0i64, 0i64, 0i64, (UINT64)Process, Tag);
v17 = v30;
if( (xmmword_140CFB490 & 0x400) != 0 && v30 == 1 )
EtwTraceWakeEvent((VOID *)a1, WakeReason);
}
else
{
v17 = v30;
}
if( v41 )
*v41 = v17;
if( v8 || v4 )
{
v20 = a4;
v18 = WakeReason;
v19 = v39;
LODWORD(Flags) = v31;
PspChargeJobWakeCounter(BaseJob, 0i64, WakeReason, v39, Flags, (_EPROCESS *)a1, a4);
}
else
{
v18 = WakeReason;
v19 = v39;
v20 = a4;
}
if( !v7 )
return 0;
if( (xmmword_140CFB490 & 0x2000) != 0 && !v35 )
EtwTraceWakeCounter((VOID *)a1, v18, v19, (_EPROCESS *)a1, v20, (UINT64)Process);
if( !v40 )
return 0;
if( v39 <= 0 )
{
ObDereferenceObjectDeferDeleteWithTag(a1, 1800893264i64);
return 0;
}
ObfReferenceObjectWithTag((VOID *)a1, 0x6B577350ui64);
return a1 | v13;
}Referenced by:
AlpcpSendMessage
PsChargeProcessWakeCounter
PsReleaseProcessWakeCounter
PspAdjustKeepAliveCountProcess