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