KiUpdateVpBackingThreadPriorityDpcRoutine
VOID __stdcall KiUpdateVpBackingThreadPriorityDpcRoutine(
_KDPC *Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2){
__int64 *v4;
__int64 *v5;
__int64 *v6;
__int64 v7;
__int64 **v8;
__int64 *v9;
INT64 v10;
struct _KPRCB *CurrentPrcb;
int v12[8];
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
v4 = 0i64;
KxAcquireSpinLock(&KiUpdateVpThreadPriorityLock);
v5 = (__int64 *)KiUpdateVpThreadPriorityListHead;
while( v5 != &KiUpdateVpThreadPriorityListHead )
{
v6 = v5;
v5 = (__int64 *)*v5;
v7 = *v6;
v8 = (__int64 **)v6[1];
if( *(__int64 **)(*v6 + 8) != v6 || *v8 != v6 )
__fastfail(3u);
*v8 = (__int64 *)v7;
*(_QWORD *)(v7 + 8) = v8;
v6[1] = 0i64;
*v6 = (__int64)v4;
v4 = v6;
_InterlockedAdd16((volatile signed __int16 *)v6 - 70, 1u);
}
KxReleaseSpinLock(&KiUpdateVpThreadPriorityLock);
ReadyList.Next = 0i64;
while( v4 )
{
v9 = v4;
v4 = (__int64 *)*v4;
v10 = (INT64)(v9 - 126);
*(_QWORD *)(v10 + 1008) = 1i64;
_InterlockedOr(v12, 0);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v10 + 64) );
}
if( (*(_DWORD *)(v10 + 120) & 0x400000) != 0 )
KiUpdateVpBackingThreadPriorityFromTopLevel((PVOID)v10);
KiReleaseThreadLockSafe(v10);
_InterlockedDecrement16((volatile signed __int16 *)(v10 + 868));
}
CurrentPrcb = KeGetCurrentPrcb();
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
if( CurrentPrcb->NextThread )
{
if( !CurrentPrcb->DpcRoutineActive )
KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}
}Referenced by:
No references.