KeSetEventBoostPriorityEx
VOID __stdcall KeSetEventBoostPriorityEx(
_KEVENT *Event,
_KTHREAD **Thread,
INT64 *BoostPriority,
PVOID AbContext,
UINT64 Flags){
_KTHREAD **v6;
UINT8 OldIrql;
struct _KPRCB *CurrentPrcb;
_LIST_ENTRY *Flink;
int v11;
_LIST_ENTRY *v12;
_KWAIT_BLOCK *v13;
_LIST_ENTRY *Blink;
unsigned __int8 WaitType;
bool v16;
bool v17;
__int64 v18;
char v19;
int v20;
CHAR v21;
_KQUEUE *NotificationQueue;
_LIST_ENTRY *p_WaitListHead;
__int64 v24;
_KPRCB *v25;
int SignalState;
_LIST_ENTRY *v27;
UINT8 v28;
_LIST_ENTRY *v29;
_KPRCB *Prcb;
char v33;
v6 = Thread;
OldIrql = KeGetCurrentIrql();
v28 = OldIrql;
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
KiAcquireKobjectLockSafe(Event);
Event->Header.SignalState = 1;
Flink = Event->Header.WaitListHead.Flink;
v11 = 0;
if( Flink == &Event->Header.WaitListHead )
goto LABEL_9;
while( 1 )
{
v12 = Flink->Flink;
v13 = (_KWAIT_BLOCK *)Flink;
Flink = v12;
v29 = v12;
Blink = v13->WaitListEntry.Blink;
if( (_KWAIT_BLOCK *)v12->Blink != v13 || (_KWAIT_BLOCK *)Blink->Flink != v13 )
LABEL_3:
__fastfail(3u);
Blink->Flink = v12;
v12->Blink = Blink;
WaitType = v13->WaitType;
if( WaitType != 1 )
{
if( WaitType != 2 )
{
if( KiTryUnwaitThread(CurrentPrcb, v13, 256i64, 0i64) )
--v11;
goto LABEL_44;
}
v13->BlockState = 5;
NotificationQueue = v13->NotificationQueue;
v13->WaitListEntry.Flink = 0i64;
p_WaitListHead = &NotificationQueue->Header.WaitListHead;
KeGetCurrentIrql();
__writecr8(2ui64);
Prcb = KeGetCurrentPrcb();
v24 = *((_QWORD *)Prcb + 1);
KiAcquireKobjectLockSafe(NotificationQueue);
if( p_WaitListHead->Flink == p_WaitListHead
|| NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
|| *(_KQUEUE **)(v24 + 232) == NotificationQueue && *(_BYTE *)(v24 + 643) == 15 )
{
v25 = Prcb;
}
else
{
v25 = Prcb;
if( KiWakeQueueWaiter(Prcb, NotificationQueue, (INT64)v13) )
{
LABEL_40:
_InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
v16 = Event->Header.SignalState-- == 1;
if( v16 )
goto LABEL_8;
Flink = v29;
v6 = Thread;
goto LABEL_44;
}
}
SignalState = NotificationQueue->Header.SignalState;
NotificationQueue->Header.SignalState = SignalState + 1;
v27 = NotificationQueue->EntryListHead.Blink;
if( v27->Flink != &NotificationQueue->EntryListHead )
goto LABEL_3;
v13->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
v13->WaitListEntry.Blink = v27;
v27->Flink = &v13->WaitListEntry;
NotificationQueue->EntryListHead.Blink = &v13->WaitListEntry;
if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
KiWakeOtherQueueWaiters(v25, NotificationQueue);
goto LABEL_40;
}
if( KiTryUnwaitThread(CurrentPrcb, v13, v13->WaitKey, v6) )
{
v16 = Event->Header.SignalState-- == 1;
if( v16 )
break;
}
LABEL_44:
if( Flink == &Event->Header.WaitListHead )
goto LABEL_8;
}
++v11;
LABEL_8:
OldIrql = v28;
LABEL_9:
if( Thread )
v17 = v11 > 0;
else
v17 = 0;
_InterlockedAnd(&Event->Header.Lock, 0xFFFFFF7F);
if( (v33 & 1) != 0 )
{
if( *(_DWORD *)BoostPriority )
{
v18 = *((_QWORD *)CurrentPrcb + 1441);
if( v18 )
KeAbPreWakeupThread(v18 - 216, (unsigned __int64)AbContext, *(_DWORD *)BoostPriority);
}
v19 = Flags;
v20 = 1;
}
else
{
v21 = KiRemoveBoostThread(CurrentPrcb, *((_KTHREAD **)CurrentPrcb + 1));
if( BoostPriority )
{
if( *(_DWORD *)BoostPriority )
{
if( *(char *)BoostPriority > v21 )
v21 = *(_BYTE *)BoostPriority;
}
else
{
v17 = 0;
}
}
v19 = v21;
if( !v17 )
v19 = Flags;
v20 = v17 + 1;
}
KiExitDispatcher(CurrentPrcb, 0i64, (_ADJUST_REASON)v20, (unsigned int)v19, OldIrql);
}Referenced by:
ExpReleaseFastMutexContended
FsRtlReleaseEofLock
IopReleaseFileObjectLock
IopWaitAndAcquireFileObjectLock
KeSetEventBoostPriority