PspNotifyProcessBackgroundTransition
VOID __stdcall PspNotifyProcessBackgroundTransition(_EPROCESS *Process, UINT64 EnteredBackground){
int v2;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *p_ThreadListLock;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *p_ThreadListHead;
_LIST_ENTRY *i;
int v9;
int v10;
v2 = EnteredBackground;
if( (_DWORD)EnteredBackground )
_interlockedbittestandset((volatile signed __int32 *)&Process->1124, 0x14u);
else
_interlockedbittestandreset((volatile signed __int32 *)&Process->1124, 0x14u);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
p_ThreadListLock = &Process->ThreadListLock;
ExAcquirePushLockSharedEx(&Process->ThreadListLock, 0i64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
p_ThreadListHead = &Process->ThreadListHead;
for( i = Process->ThreadListHead.Flink; i != p_ThreadListHead; i = i->Flink )
{
if( (SLOBYTE(i[-29].Flink) | SBYTE6(i[-25].Blink)) != 63 )
{
v9 = (LODWORD(i[2].Blink) >> 9) & 7;
if( v2 )
{
v10 = (LODWORD(i[2].Blink) >> 9) & 7;
v9 = 0;
}
else
{
v10 = 0;
}
if( v10 != v9 )
KeAbProcessBaseIoPriorityChange((_KTHREAD *)&i[-79].Blink, (_IO_PRIORITY_HINT)v10, (_IO_PRIORITY_HINT)v9);
}
}
__writecr8(CurrentIrql);
if( _InterlockedCompareExchange64(&p_ThreadListLock->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(p_ThreadListLock);
KeAbPostRelease(p_ThreadListLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}Referenced by:
PspApplyJobChainLimitsToProcess
PspSetProcessBackgroundCountCallback