KeSignalGate

VOID __stdcall KeSignalGate(_KGATE *Gate, INT64 Increment){
  _KPRCB *CurrentPrcb; 
  _KGATE *v4; 
  __int64 v5; 
  _KWAIT_BLOCK *v6; 
  _LIST_ENTRY *Blink; 
  unsigned __int8 WaitType; 
  bool v9; 
  _ETHREAD *Thread; 
  _QWORD *v11; 
  struct _KPRCB *v12; 
  _ETHREAD *CurrentThread; 
  char v14; 
  int v15; 
  _KWAIT_BLOCK **QuantumTarget; 
  _KPRCB *Prcb; 
  unsigned int Incrementa; 
  UINT8 OldIrql; 

  Incrementa = Increment;
  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  Prcb = CurrentPrcb;
  KiAcquireKobjectLockSafe(Gate);
  if( !*((_DWORD *)Gate + 1) )
  {
    *((_DWORD *)Gate + 1) = 1;
    v4 = (_KGATE *)*((_QWORD *)Gate + 1);
    while( v4 != (_KGATE *)((char *)Gate + 8) )
    {
      v5 = *(_QWORD *)v4;
      v6 = (_KWAIT_BLOCK *)v4;
      v4 = (_KGATE *)v5;
      Blink = v6->WaitListEntry.Blink;
      if( *(_KWAIT_BLOCK **)(v5 + 8) != v6 || (_KWAIT_BLOCK *)Blink->Flink != v6 )
LABEL_5:
        __fastfail(3u);
      Blink->Flink = (_LIST_ENTRY *)v5;
      *(_QWORD *)(v5 + 8) = Blink;
      WaitType = v6->WaitType;
      if( WaitType == 1 )
      {
        if( KiTryUnwaitThread(CurrentPrcb, v6, v6->WaitKey, 0i64) )
        {
          v9 = (*((_DWORD *)Gate + 1))-- == 1;
          if( v9 )
            break;
        }
      }
      else if( WaitType == 2 )
      {
        v6->BlockState = 5;
        Thread = v6->Thread;
        v6->WaitListEntry.Flink = 0i64;
        v11 = &Thread->Tcb.gap0[8];
        KeGetCurrentIrql();
        __writecr8(2ui64);
        v12 = KeGetCurrentPrcb();
        CurrentThread = v12->CurrentThread;
        KiAcquireKobjectLockSafe(Thread);
        if( (_QWORD *)*v11 == v11
          || LODWORD(Thread->Tcb.InitialStack) >= HIDWORD(Thread->Tcb.InitialStack)
          || (_ETHREAD *)CurrentThread->Tcb.Queue == Thread && CurrentThread->Tcb.WaitReason == 15
          || (KiWakeQueueWaiter(v12, (_KQUEUE *)Thread, (INT64)v6), !v14) )
        {
          v15 = *(_DWORD *)&Thread->Tcb.gap0[4];
          *(_DWORD *)&Thread->Tcb.gap0[4] = v15 + 1;
          QuantumTarget = (_KWAIT_BLOCK **)Thread->Tcb.QuantumTarget;
          if( *QuantumTarget != (_KWAIT_BLOCK *)&Thread->Tcb.SListFaultAddress )
            goto LABEL_5;
          v6->WaitListEntry.Flink = (_LIST_ENTRY *)&Thread->Tcb.SListFaultAddress;
          v6->WaitListEntry.Blink = (_LIST_ENTRY *)QuantumTarget;
          *QuantumTarget = v6;
          Thread->Tcb.QuantumTarget = (unsigned __int64)v6;
          if( !v15 && (_QWORD *)*v11 != v11 )
            KiWakeOtherQueueWaiters(v12, (_KQUEUE *)Thread);
        }
        _InterlockedAnd((volatile signed __int32 *)Thread, 0xFFFFFF7F);
        v9 = (*((_DWORD *)Gate + 1))-- == 1;
        if( v9 )
          break;
        CurrentPrcb = Prcb;
      }
      else
      {
        KiTryUnwaitThread(CurrentPrcb, v6, 256i64, 0i64);
      }
    }
  }
  _InterlockedAnd((volatile signed __int32 *)Gate, 0xFFFFFF7F);
  KiExitDispatcher(Prcb, 0i64, AdjustUnwait, Incrementa, OldIrql);
}

Referenced by:

KiEpfComplete
KiRetireDpcList
MiAttachThreadDone
MiCheckControlArea
MiDereferencePageRunsEx
MiFinishVadDeletion
MiIncrementAweMapCount
MiNodeCompletedBootZeroing
MiProcessWorkingSets
MiReleaseControlAreaWaiters
MiReturnWsToExpansionList
MiScrubMemoryWorker
MiSignalZeroingPassComplete
MiSubsectionProtosCreated
MiUnlockControlAreaSectionExtend
MiWakeExtentDeletionWaiters
MiWakeLargePageWaiters
MiWriteComplete
MiZeroInParallel
MiZeroInParallelWorker
MiZeroLargePageThread
MiZeroNodePages
MmDetachSession
PsWatchWorkingSet
PspGetSetContextSpecialApc
PspRelinquishUmsThreadSpecialApc