KiTryUnwaitThreadWithPriority
UINT8 __stdcall KiTryUnwaitThreadWithPriority(_KPRCB *Prcb, _KWAIT_BLOCK *WaitBlock, INT64 WaitStatus, INT64 NewBase){
struct _KPRCB *CurrentPrcb;
_ETHREAD *Thread;
UINT8 v7;
__int64 v8;
__int64 QueuePriority;
UINT8 v12;
_KPRCB *v13;
char PriorityDecrement;
_SINGLE_LIST_ENTRY *p_IoSelfBoostsEntry;
_SINGLE_LIST_ENTRY *p_AbSelfIoBoostsList;
unsigned __int64 v18;
int v19;
_DWORD *SchedulerAssist;
_DISPATCHER_HEADER *volatile Queue;
UINT64 SpinCount;
CurrentPrcb = KeGetCurrentPrcb();
Thread = WaitBlock->Thread;
v7 = 0;
v8 = (int)NewBase;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
if( Thread->Tcb.WaitBlockFill6[68] == 5 )
{
QueuePriority = (unsigned __int8)Thread->Tcb.QueuePriority;
if( (_DWORD)QueuePriority != (_DWORD)v8 )
{
v19 = Thread->Tcb.QueuePriority & 0x100;
if( !v19 )
{
Queue = Thread->Tcb.Queue;
_InterlockedDecrement((volatile signed __int32 *)Queue + QueuePriority + 134);
_InterlockedIncrement((volatile signed __int32 *)Queue + v8 + 134);
}
Thread->Tcb.QueuePriority = v19 | (unsigned __int8)v8;
}
KiSignalThread(Prcb, Thread, WaitStatus, WaitBlock);
v7 = v12;
if( v12 )
{
Thread->Tcb.Saturation = 0;
v13 = KeGetCurrentPrcb();
if( (char)v8 < Thread->Tcb.BasePriority )
{
if( Thread->Tcb.AbOwnedEntryCount )
{
p_IoSelfBoostsEntry = &Thread->Tcb.IoSelfBoostsEntry;
if( Thread->Tcb.IoSelfBoostsEntry.Next == (_SINGLE_LIST_ENTRY *)1 )
{
p_AbSelfIoBoostsList = &v13->AbSelfIoBoostsList;
if( v13 != (_KPRCB *)-34672i64 )
{
p_IoSelfBoostsEntry->Next = p_AbSelfIoBoostsList->Next;
p_AbSelfIoBoostsList->Next = p_IoSelfBoostsEntry;
_InterlockedIncrement16(&Thread->Tcb.KeReferenceCount);
KiAbQueueAutoBoostDpc(v13);
}
}
}
}
PriorityDecrement = Thread->Tcb.PriorityDecrement;
Thread->Tcb.BasePriority = v8;
if( PriorityDecrement )
{
if( (PriorityDecrement & 0xF) != 0 )
Thread->Tcb.ForegroundLossTime = KUSER_SHARED_DATA.TickCount.LowPart;
Thread->Tcb.PriorityDecrement = 0;
}
if( (_DWORD)v8 != Thread->Tcb.Priority )
{
v18 = Thread->Tcb.CycleTime + KiCyclesPerClockQuantum * (unsigned int)Thread->Tcb.SchedulerApc.SpareByte1;
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x20) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 5u);
Thread->Tcb.QuantumTarget = v18;
KiSetPriorityThread(&Thread->Tcb, 0i64, (unsigned int)v8);
}
}
}
Thread->Tcb.ThreadLock = 0i64;
++WaitBlock->BlockState;
return v7;
}Referenced by:
ExpQueueWorkItem
KiWakePriQueueWaiter