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