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.