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.