KxDispatchInterrupt
VOID __stdcall KxDispatchInterrupt(){
struct _KPRCB *CurrentPrcb;
_ETHREAD *CurrentThread;
UINT64 v2;
__int64 CurrentRunTime;
UINT64 v4;
int v5;
int v6;
_ETHREAD *NextThread;
CurrentPrcb = KeGetCurrentPrcb();
CurrentThread = CurrentPrcb->CurrentThread;
_disable();
++CurrentPrcb->NestingLevel;
v2 = __rdtsc() - CurrentPrcb->StartCycles;
CurrentThread->Tcb.CycleTime += v2;
CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
CurrentPrcb->StartCycles += v2;
v4 = v2 + CurrentRunTime;
v5 = v4;
if( HIDWORD(v4) )
v5 = -1;
CurrentThread->Tcb.CurrentRunTime = v5;
if( (CurrentThread->Tcb.gap0[2] & 0x3E) != 0 )
KiEndThreadAccountingPeriod(CurrentPrcb, &CurrentThread->Tcb, v2);
_enable();
KiAbProcessContextSwitch(&CurrentThread->Tcb, 0i64);
KiSetVpThreadSpinLockCount();
if( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
v6 = 0;
do
{
do
{
++v6;
_mm_pause();
}
while( (CurrentPrcb->PrcbLock & 1) != 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) );
}
NextThread = CurrentPrcb->NextThread;
CurrentPrcb->NextThread = 0i64;
CurrentPrcb->CurrentThread = NextThread;
NextThread->Tcb.WaitBlockFill6[68] = 2;
CurrentThread->Tcb.WaitReason = 31;
KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
if( (_BYTE)KeSmapEnabled )
__stac();
SwapContext();
}Referenced by:
KiDispatchInterrupt