PspChargeJobWakeCounter
VOID __stdcall PspChargeJobWakeCounter(
_EJOB *BaseJob,
_EJOB *TerminatingJob,
_PS_WAKE_REASON WakeReason,
INT64 Delta,
UINT64 Flags,
_EPROCESS *Process,
UINT64 Tag){
_ETHREAD *v7;
_EJOB *v8;
_EJOB *v9;
__int64 v10;
unsigned int v11;
__int64 v12;
UINT64 v13;
_JOBOBJECT_WAKE_FILTER v14;
bool v15;
int v16;
bool v17;
int v18;
int v19;
UINT64 v20;
UINT64 v21;
_EJOB *Job;
_JOBOBJECT_WAKE_FILTER WakeFilter;
_ETHREAD *CurrentThread;
v7 = (_ETHREAD *)KeGetCurrentThread();
v8 = BaseJob;
v9 = BaseJob;
v10 = WakeReason;
CurrentThread = v7;
Job = 0i64;
v11 = 1 << WakeReason;
if( (Flags & 1) != 0 )
PspLockRootJobShared(BaseJob, v7, &Job);
do
{
if( (Flags & 1) != 0 )
ExAcquireResourceSharedLite((UINT64)v9 + 56, 1);
v12 = 944i64;
if( (Flags & 4) == 0 )
v12 = 8 * v10 + 888;
v13 = Delta + _InterlockedExchangeAdd64((volatile signed __int64 *)((char *)v9 + v12), Delta);
if( (Flags & 4) != 0 )
{
if( *((_DWORD *)v9 + 214) )
{
if( (Flags & 2) != 0 && (_BYTE)KdDebuggerEnabled )
__int2c();
if( (xmmword_140CFB490 & 0x200) != 0 )
EtwTraceWakeCounter(v8, (PS_WAKE_REASON)v10, 0i64, Process, Tag, v21);
}
if( (Flags & 1) != 0 )
ExReleaseResourceLite((PERESOURCE)((char *)v9 + 56));
}
else
{
v14 = (_JOBOBJECT_WAKE_FILTER)*((_QWORD *)v9 + 119);
v15 = (*((_DWORD *)v9 + 330) & 0x800) == 0;
v16 = *((_DWORD *)v9 + 330) & 0x800;
WakeFilter = v14;
v17 = !v15;
if( v16 && !v13 && (v14.LowEdgeFilter & v11) == 0 )
{
v17 = 0;
_InterlockedOr((volatile signed __int32 *)v9 + 240, v11);
}
if( (Flags & 1) != 0 )
ExReleaseResourceLite((PERESOURCE)((char *)v9 + 56));
if( v17 )
{
v18 = 6;
if( Delta <= 0 )
v18 = 0;
v19 = v18 | 1;
if( (Flags & 1) == 0 )
v19 = v18;
LODWORD(v20) = v19;
PspSendWakeNotification(v9, (unsigned int)v10, &WakeFilter, v13, v20);
}
v8 = BaseJob;
}
v9 = (_EJOB *)*((_QWORD *)v9 + 134);
}
while( v9 != TerminatingJob && (*((_DWORD *)v9 + 330) & 0x1000) != 0 );
if( (Flags & 1) != 0 )
PspUnlockJob(Job, CurrentThread);
}Referenced by:
PspAssignProcessToJob
PspChargeProcessWakeCounter