PspSetProcessFreezeStateCallback

NTSTATUS __stdcall PspSetProcessFreezeStateCallback(_EPROCESS *Process, PSP_FREEZE_CONTEXT *FreezeContext){
  _EJOB *volatile Job; 
  unsigned __int64 *p_VirtualTimerListLock; 
  unsigned __int8 v6; 
  _EPROCESS *Flink; 
  UINT64 v8; 
  UINT64 *p_bf_920; 
  unsigned __int8 v11; 
  UINT64 InterruptTime; 

  Job = Process->Job;
  if( (Process->Flags & 0x40000008) == 0
    && (Process->Flags & 0x4000000) != 0
    && (*((_DWORD *)Job + 330) & 0x40000) != 0
    && (**(_DWORD **)FreezeContext & 1) != 0
    && *((_DWORD *)Job + 214) <= 1u )
  {
    p_VirtualTimerListLock = &Process->VirtualTimerListLock;
    v6 = KeAcquireSpinLockRaiseToDpc(&Process->VirtualTimerListLock);
    v11 = v6;
    InterruptTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
    Flink = (_EPROCESS *)Process->VirtualTimerListHead.Flink;
    if( Flink != (_EPROCESS *)&Process->VirtualTimerListHead )
    {
      v8 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      do
      {
        p_bf_920 = (UINT64 *)&Flink[-1]._bf_920;
        if( *(_BYTE *)(*(_QWORD *)FreezeContext + 4i64) )
        {
          ExpTimerPause((_ETIMER *)&Flink[-1]._bf_920, v8, InterruptTime);
        }
        else
        {
          KxAcquireSpinLock(p_bf_920 + 8);
          ExpTimerResume((PKTIMER)&Flink[-1]._bf_920, InterruptTime);
          KxReleaseSpinLock(p_bf_920 + 8);
        }
        Flink = *(_EPROCESS **)Flink->Pcb.gap0;
      }
      while( Flink != (_EPROCESS *)&Process->VirtualTimerListHead );
      v6 = v11;
      p_VirtualTimerListLock = &Process->VirtualTimerListLock;
    }
    KxReleaseSpinLock(p_VirtualTimerListLock);
    __writecr8(v6);
  }
  PspRequestProcessExecutionState((INT64)Process, (unsigned int)FreezeContext[2], 0);
  return 0;
}

Referenced by:

No references.