KiExitDispatcher
VOID __stdcall KiExitDispatcher(_KPRCB *Prcb, INT64 Flags, _ADJUST_REASON AdjustReason, INT64 Increment, UINT8 OldIrql){
char v5;
char v6;
char v7;
unsigned __int64 v9;
__int64 v10;
ULONG_PTR v11;
__int64 **v12;
__int64 v13;
__int64 *v14;
__int64 *v15;
__int64 *v16;
int v17;
INT64 v18;
__int64 *v19;
__int64 **v20;
__int64 v21;
UINT8 v22;
struct _KPRCB *CurrentPrcb;
__int64 v24;
__int64 v25;
__int64 v26;
signed __int64 *v27;
signed __int64 v28;
signed __int64 v29;
__int64 v30;
void *v31;
INT64 a3;
UINT64 SpinCount;
v5 = Increment;
v6 = Flags & 1;
v7 = AdjustReason;
if( *((_QWORD *)Prcb + 1441) )
{
if( v6 && KiDirectSwitchThread(Prcb, (unsigned int)Increment, (Flags & 2) != 0) )
goto LABEL_29;
v12 = (__int64 **)*((_QWORD *)Prcb + 1441);
*((_QWORD *)Prcb + 1441) = 0i64;
do
{
v13 = *((unsigned __int8 *)v12 + 371);
v14 = (__int64 *)(v12 - 27);
v15 = *(v12 - 1);
v12 = (__int64 **)*v12;
v16 = &v15[6 * v13];
do
{
if( *((_BYTE *)v15 + 17) < 5u )
{
v31 = (void *)v15[4];
KiAcquireKobjectLockSafe(v31);
if( *((_BYTE *)v15 + 17) == 4 )
{
v19 = (__int64 *)*v15;
v20 = (__int64 **)v15[1];
if( *(__int64 **)(*v15 + 8) != v15 || *v20 != v15 )
__fastfail(3u);
*v20 = v19;
v19[1] = (__int64)v20;
}
_InterlockedAnd((volatile signed __int32 *)v31, 0xFFFFFF7F);
}
v15 += 6;
}
while( v15 != v16 );
*((_BYTE *)v14 + 566) = v7;
*((_BYTE *)v14 + 567) = v5;
v17 = *((_DWORD *)v14 + 30);
if( (v17 & 0x20000) != 0 )
{
if( (v17 & 0x100000) == 0 )
goto LABEL_15;
_interlockedbittestandreset((volatile signed __int32 *)v14 + 30, 0x14u);
if( (_InterlockedExchangeAdd((volatile signed __int32 *)(v14[23] + 840), 8u) & 7) == 0 )
goto LABEL_15;
v26 = v14[23];
KiAcquireKobjectLockSafe((PVOID)v26);
if( (*(_DWORD *)(v26 + 840) & 7) == 0 )
{
_InterlockedAnd((volatile signed __int32 *)v26, 0xFFFFFF7F);
LABEL_15:
v18 = (INT64)(v14 + 27);
a3 = 0i64;
v14[27] = 0i64;
while( 1 )
{
KiDeferredReadySingleThread((INT64)Prcb, v18 - 216, (INT64)&a3);
v18 = a3;
if( !a3 )
break;
a3 = *(_QWORD *)a3;
}
continue;
}
}
else
{
v26 = v14[23];
KiAcquireKobjectLockSafe((PVOID)v26);
if( (*(_DWORD *)(v26 + 840) & 7) == 0 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v26 + 840), 8u);
_InterlockedAnd((volatile signed __int32 *)v26, 0xFFFFFF7F);
_interlockedbittestandreset((volatile signed __int32 *)v14 + 30, 0x14u);
*((_BYTE *)v14 + 388) = 6;
v27 = v14 + 27;
_m_prefetchw(&KiStackInSwapListHead);
v28 = KiStackInSwapListHead;
do
{
*v27 = v28;
v29 = v28;
v28 = _InterlockedCompareExchange64(&KiStackInSwapListHead, (signed __int64)v27, v28);
}
while( v28 != v29 );
if( !v28 )
KeSetEvent(&KiSwapEvent, 10);
continue;
}
}
KiRequestProcessInSwap((_KTHREAD *)v14, (_KPROCESS *)v26);
}
while( v12 );
}
if( v6 )
{
LABEL_29:
v21 = *((_QWORD *)Prcb + 1);
v22 = OldIrql;
*(_DWORD *)(v21 + 116) |= 4u;
*(_BYTE *)(v21 + 390) = v22;
return;
}
v9 = OldIrql;
v10 = *((_QWORD *)Prcb + 2);
if( OldIrql < 2u )
{
v11 = *((_QWORD *)Prcb + 1);
if( v10 )
{
KiAbProcessContextSwitch(*((_KTHREAD **)Prcb + 1), 0i64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Prcb + 6) );
v30 = *((_QWORD *)CurrentPrcb + 4247);
if( v30 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v30 + 24);
}
v24 = *((_QWORD *)Prcb + 2);
*((_QWORD *)Prcb + 2) = 0i64;
_disable();
KiEndThreadCycleAccumulation(Prcb, (_KTHREAD *)v11, 0i64);
_enable();
*((_QWORD *)Prcb + 1) = v24;
if( *(_BYTE *)(v24 + 388) == 1 )
*(_DWORD *)(v24 + 132) = *(_DWORD *)(v24 + 132) - *(_DWORD *)(v24 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
*(_BYTE *)(v24 + 388) = 2;
*(_BYTE *)(v11 + 643) = 32;
*(_BYTE *)(v11 + 390) = v9;
KiQueueReadyThread((__int64)Prcb, v11, v25);
if( !KiSwapContext((PKTHREAD)v11, (PKTHREAD)v24) )
goto LABEL_6;
}
else if( (*(_DWORD *)(v11 + 116) & 0x40) == 0 )
{
LABEL_6:
__writecr8(v9);
return;
}
__writecr8(1ui64);
*(_DWORD *)(v11 + 116) &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
goto LABEL_6;
}
if( v10 && !*((_BYTE *)Prcb + 12586) )
KiRequestSoftwareInterrupt(Prcb, 2);
}Referenced by:
CcUnpinFileDataEx
ExpQueueWorkItem
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
ExpSetTimerObject
IoSetIoCompletionEx
IoSetIoCompletionEx2
IopfCompleteRequest
KeAdjustTimerDelayProcess
KeAlertThread
KeAlertThreadByThreadId
KeDeleteMutant
KeForceResumeProcess
KeForceResumeThread
KeFreezeProcess
KeInsertHeadQueue
KeInsertPriQueue
KeInsertQueue
KeInsertQueueApc
KeInsertQueueEx
KePulseEvent
KeRegisterObjectNotification
KeReleaseMutant
KeReleaseSemaphore
KeReleaseSemaphoreEx
KeRequestTerminationThread
KeResumeThread
KeRundownPriQueue
KeRundownQueueEx
KeSetEvent
KeSetEventBoostPriorityEx
KeSetProcess
KeSetTimerEx
KeSignalGate
KeSuspendThread
KeThawProcess
KeTimeOutQueueWaiters
KeWakeWaitChain
KiRundownMutants
KiSchedulerApc
KiSetSystemTimeDpc
KiSetTimerEx
NtAssociateWaitCompletionPacket
NtReleaseWorkerFactoryWorker
NtWaitForWorkViaWorkerFactory