PspChargeJobWakeCounter
VOID __fastcall PspChargeJobWakeCounter(_EJOB *a1, _EJOB *a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6, INT64 a7){
_ETHREAD *CurrentThread;
_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 Flags;
__int64 v21;
_JOBOBJECT_WAKE_FILTER WakeFilter;
_ETHREAD *v23;
_EJOB *v25;
v25 = a2;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = a1;
v9 = a1;
v10 = (int)a3;
v23 = CurrentThread;
v21 = 0i64;
v11 = 1 << a3;
if( (a5 & 1) != 0 )
PspLockRootJobShared((__int64)a1, (__int64)CurrentThread, &v21);
do
{
if( (a5 & 1) != 0 )
{
LOBYTE(a2) = 1;
ExAcquireResourceSharedLite(&v9->JobLock, (BOOL)a2);
}
v12 = 944i64;
if( (a5 & 4) == 0 )
v12 = 8 * v10 + 888;
v13 = a4 + _InterlockedExchangeAdd64((volatile signed __int64 *)((char *)&v9->Event.Header.Lock + v12), a4);
if( (a5 & 4) != 0 )
{
if( v9->EffectiveFreezeCount )
{
if( (a5 & 2) != 0 && (_BYTE)KdDebuggerEnabled )
__int2c();
if( (xmmword_140CFB490 & 0x200) != 0 )
EtwTraceWakeCounter(v8, (_PS_WAKE_REASON)v10, 0i64, (_EPROCESS *)a6, a7);
}
if( (a5 & 1) != 0 )
ExReleaseResourceLite(&v9->JobLock);
}
else
{
v14 = v9->WakeFilter;
v15 = (v9->JobFlags & 0x800) == 0;
v16 = v9->JobFlags & 0x800;
WakeFilter = v14;
v17 = !v15;
if( v16 && !v13 && (v14.LowEdgeFilter & v11) == 0 )
{
v17 = 0;
_InterlockedOr((volatile signed __int32 *)&v9->LowEdgeLatchFilter, v11);
}
if( (a5 & 1) != 0 )
ExReleaseResourceLite(&v9->JobLock);
if( v17 )
{
v18 = 6;
if( a4 <= 0 )
v18 = 0;
v19 = v18 | 1;
if( (a5 & 1) == 0 )
v19 = v18;
LODWORD(Flags) = v19;
PspSendWakeNotification(v9, (unsigned int)v10, &WakeFilter, v13, Flags);
}
v8 = a1;
}
v9 = v9->ParentJob;
}
while( v9 != v25 && (v9->JobFlags & 0x1000) != 0 );
if( (a5 & 1) != 0 )
PspUnlockJob(v21, (__int64)v23);
}Referenced by:
PspAssignProcessToJob
PspChargeProcessWakeCounter