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