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