KeReleaseSemaphoreEx

INT64 __stdcall KeReleaseSemaphoreEx(KSEMAPHORE *Semaphore, INT64 BoostIncrement, INT64 Adjustment, UINT64 Flags){
  int v4; 
  unsigned int v5; 
  UINT8 OldIrql; 
  struct _KPRCB *CurrentPrcb; 
  int SignalState; 
  int v10; 
  unsigned int v11; 
  KSEMAPHORE *Flink; 
  __int64 v13; 
  _KWAIT_BLOCK *v14; 
  _LIST_ENTRY *Blink; 
  unsigned __int8 WaitType; 
  bool v17; 
  _LIST_ENTRY *v19; 
  _KQUEUE *v20; 
  UINT8 v21; 
  int v22; 
  _LIST_ENTRY *v23; 
  _KPRCB *Prcb; 
  __int64 v25; 
  _LIST_ENTRY *p_WaitListHead; 
  unsigned int v27; 
  _KQUEUE *Object; 
  char v29; 
  v27 = BoostIncrement;
  v4 = Adjustment;
  v5 = BoostIncrement;
  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  KiAcquireKobjectLockSafe(Semaphore);
  SignalState = Semaphore->Header.SignalState;
  v10 = SignalState + v4;
  if( SignalState + v4 > Semaphore->Limit || v10 < SignalState )
  {
    _InterlockedAnd(&Semaphore->Header.Lock, 0xFFFFFF7F);
    __writecr8(OldIrql);
    RtlRaiseStatus(-1073741753);
  }
  v11 = 0;
  Semaphore->Header.SignalState = v10;
  if( !SignalState )
  {
    Flink = (KSEMAPHORE *)Semaphore->Header.WaitListHead.Flink;
    while( Flink != (KSEMAPHORE *)&Semaphore->Header.WaitListHead )
    {
      v13 = *(_QWORD *)&Flink->Header.Lock;
      v14 = (_KWAIT_BLOCK *)Flink;
      Flink = (KSEMAPHORE *)v13;
      Blink = v14->WaitListEntry.Blink;
      if( *(_KWAIT_BLOCK **)(v13 + 8) != v14 || (_KWAIT_BLOCK *)Blink->Flink != v14 )
LABEL_6:
        __fastfail(3u);
      Blink->Flink = (_LIST_ENTRY *)v13;
      *(_QWORD *)(v13 + 8) = Blink;
      WaitType = v14->WaitType;
      if( WaitType == 1 )
      {
        if( KiTryUnwaitThread(CurrentPrcb, v14, v14->WaitKey, 0i64) )
        {
          v17 = Semaphore->Header.SignalState-- == 1;
          if( v17 )
            break;
        }
      }
      else
      {
        if( WaitType == 2 )
        {
          v14->BlockState = 5;
          Object = v14->NotificationQueue;
          p_WaitListHead = &Object->Header.WaitListHead;
          v14->WaitListEntry.Flink = 0i64;
          KeGetCurrentIrql();
          __writecr8(2ui64);
          Prcb = KeGetCurrentPrcb();
          v25 = *((_QWORD *)Prcb + 1);
          KiAcquireKobjectLockSafe(Object);
          v19 = p_WaitListHead;
          v20 = Object;
          if( v19->Flink == v19
            || Object->CurrentCount >= Object->MaximumCount
            || *(_KQUEUE **)(v25 + 232) == Object && *(_BYTE *)(v25 + 643) == 15 )
          {
LABEL_28:
            v22 = v20->Header.SignalState;
            v20->Header.SignalState = v22 + 1;
            v23 = v20->EntryListHead.Blink;
            if( v23->Flink != &v20->EntryListHead )
              goto LABEL_6;
            v14->WaitListEntry.Flink = &v20->EntryListHead;
            v14->WaitListEntry.Blink = v23;
            v23->Flink = &v14->WaitListEntry;
            v20->EntryListHead.Blink = &v14->WaitListEntry;
            if( !v22 && v19->Flink != v19 )
            {
              KiWakeOtherQueueWaiters(Prcb, v20);
              v20 = Object;
            }
          }
          else
          {
            v21 = KiWakeQueueWaiter(Prcb, Object, (INT64)v14);
            v20 = Object;
            if( !v21 )
            {
              v19 = &Object->Header.WaitListHead;
              goto LABEL_28;
            }
          }
          _InterlockedAnd(&v20->Header.Lock, 0xFFFFFF7F);
          v17 = Semaphore->Header.SignalState-- == 1;
          if( v17 )
            break;
          continue;
        }
        KiTryUnwaitThread(CurrentPrcb, v14, 256i64, 0i64);
      }
    }
    v5 = v27;
  }
  _InterlockedAnd(&Semaphore->Header.Lock, 0xFFFFFF7F);
  if( (v29 & 1) != 0 )
  {
    v11 = 1;
    if( (v29 & 4) == 0 )
      v11 = 3;
  }
  else if( (v29 & 2) != 0 )
  {
    KiCompleteDirectSwitchThread((__int64)CurrentPrcb, *((_QWORD *)CurrentPrcb + 1));
  }
  KiExitDispatcher(CurrentPrcb, v11, AdjustUnwait, v5, OldIrql);
  return(unsigned int)SignalState;
}

Referenced by:

AlpcpCancelMessage
AlpcpCancelMessagesByRequestor
AlpcpCompleteDispatchMessage
AlpcpDispatchReplyToWaitingThread
AlpcpDoPortCleanup
AlpcpReplyLegacySynchronousRequest
AlpcpSignal
AlpcpSignalAndWait
AlpcpSignalPortAndUnlock
IoRaiseInformationalHardError
MiQueuePageFileExtension
NtWaitForWorkViaWorkerFactory
PnpDeviceCompletionQueueDispatchedEntryCompleted
PnpProcessRebalance
PopCompleteDirectedPowerTransitionCallback
PopCompleteNotifyTransitionCommon
PopDispatchQuerySetIrp
PopFxQueueWorkOrder
PopFxRequestWorker
VslpEnterIumSecureMode