KiAbForceProcessLockEntry

VOID __stdcall KiAbForceProcessLockEntry(_KLOCK_ENTRY *Entry){
  unsigned __int8 CurrentIrql; 
  char v3; 
  struct _KPRCB *CurrentPrcb; 
  _KLOCK_ENTRY *LockedHeadEntry; 
  _KLOCK_ENTRY *v6; 
  _RTL_BALANCED_NODE *Min; 
  char v8; 
  INT8 v9; 
  CHAR CpuPriorityKey; 
  unsigned int v11; 
  _ETHREAD *CurrentThread; 
  INT64 v13; 
  _ETHREAD *NextThread; 
  char v15; 
  _SINGLE_LIST_ENTRY *SelfBoostsList; 
  INT64 v17; 
  _SINGLE_LIST_ENTRY ReadyList; 
  _KLOCK_QUEUE_HANDLE HeadEntryLockQueue; 
  UINT64 SpinCount; 
  int v21; 

  ReadyList.Next = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v3 = 15;
  CurrentPrcb = KeGetCurrentPrcb();
  v21 = 0;
  memset(&HeadEntryLockQueue, 0, sizeof(HeadEntryLockQueue));
  LockedHeadEntry = KiAbEntryGetLockedHeadEntry(Entry, 1ui64, &HeadEntryLockQueue);
  v6 = LockedHeadEntry;
  if( LockedHeadEntry )
  {
    if( (Entry->ThreadLocalFlags & 1) == 0 )
    {
LABEL_3:
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&HeadEntryLockQueue);
      goto LABEL_4;
    }
    if( Entry != LockedHeadEntry )
      KiAbEntryUpdateWaiterTreePosition(Entry, LockedHeadEntry);
    Min = v6->OwnerTree.Min;
    if( Min )
      v3 = (char)Min[2].Children[0];
    v8 = v3;
    if( (v6->ThreadLocalFlags & 1) == 0 )
    {
      v9 = KiAbOwnerComputeCpuPriorityKey(v6);
      if( v9 < v3 )
        v8 = v9;
    }
    KiAbTryIncrementIoWaiterCounts(Entry, v6);
    CpuPriorityKey = KiAbEntryGetCpuPriorityKey(Entry);
    if( v8 < CpuPriorityKey )
    {
      if( !v11 )
      {
LABEL_21:
        KiAbCpuBoostOwners(v6, CpuPriorityKey, &ReadyList, 0i64, &CurrentPrcb->AbSelfIoBoostsList);
        goto LABEL_3;
      }
    }
    else if( !v11 )
    {
      goto LABEL_3;
    }
    KiAbIoBoostOwners(v6, (_BYTE *)v11, &ReadyList, 0i64, &CurrentPrcb->AbSelfIoBoostsList);
    goto LABEL_21;
  }
LABEL_4:
  KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
  if( CurrentIrql < 2u )
  {
    CurrentThread = CurrentPrcb->CurrentThread;
    if( CurrentPrcb->NextThread )
    {
      KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( CurrentPrcb->PrcbLock );
      }
      NextThread = CurrentPrcb->NextThread;
      CurrentPrcb->NextThread = 0i64;
      _disable();
      KiEndThreadCycleAccumulation(
        (INT64)CurrentPrcb,
        (INT64)CurrentThread,
        0i64,
        v13,
        (INT64)SelfBoostsList,
        v17,
        (INT64)ReadyList.Next);
      _enable();
      CurrentPrcb->CurrentThread = NextThread;
      if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
        NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
                                  - NextThread->Tcb.WaitBlock[2].SpareLong
                                  + KUSER_SHARED_DATA.TickCount.LowPart;
      NextThread->Tcb.WaitBlockFill6[68] = 2;
      CurrentThread->Tcb.WaitReason = 32;
      CurrentThread->Tcb.WaitIrql = CurrentIrql;
      KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
      KiSwapContext();
      if( !v15 )
        goto LABEL_34;
    }
    else if( (CurrentThread->Tcb._bf_0 & 0x40) == 0 )
    {
LABEL_34:
      __writecr8(CurrentIrql);
      return;
    }
    __writecr8(1ui64);
    CurrentThread->Tcb._bf_0 &= ~0x40u;
    KiDeliverApc(0, 0i64, 0i64);
    goto LABEL_34;
  }
  if( CurrentPrcb->NextThread )
  {
    if( !CurrentPrcb->DpcRoutineActive )
      KiRequestSoftwareInterrupt(CurrentPrcb, 2);
  }
}

Referenced by:

KeAbMarkCrossThreadReleasable