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