KxDispatchInterrupt
BOOL __stdcall KxDispatchInterrupt(){
struct _KPRCB *CurrentPrcb;
ULONG_PTR v1;
UINT64 v2;
__int64 v3;
UINT64 v4;
int v5;
__int64 v6;
int v7;
__int64 v8;
_KTHREAD *v9;
UINT8 v10;
BOOL result;
CurrentPrcb = KeGetCurrentPrcb();
v1 = *((_QWORD *)CurrentPrcb + 1);
_disable();
++*((_BYTE *)CurrentPrcb + 32);
v2 = __rdtsc() - *((_QWORD *)CurrentPrcb + 4056);
*(_QWORD *)(v1 + 72) += v2;
v3 = *(unsigned int *)(v1 + 80);
*((_QWORD *)CurrentPrcb + 4056) += v2;
v4 = v2 + v3;
v5 = v4;
if( HIDWORD(v4) )
v5 = -1;
*(_DWORD *)(v1 + 80) = v5;
if( (*(_BYTE *)(v1 + 2) & 0x3E) != 0 )
KiEndThreadAccountingPeriod(CurrentPrcb, (_KTHREAD *)v1, v2);
_enable();
KiAbProcessContextSwitch((_KTHREAD *)v1, 0i64);
KiSetVpThreadSpinLockCount();
if( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
v7 = 0;
do
{
do
{
++v7;
_mm_pause();
}
while( (*((_QWORD *)CurrentPrcb + 6) & 1i64) != 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) );
}
v8 = *((_QWORD *)CurrentPrcb + 2);
*((_QWORD *)CurrentPrcb + 2) = 0i64;
*((_QWORD *)CurrentPrcb + 1) = v8;
*(_BYTE *)(v8 + 388) = 2;
*(_BYTE *)(v1 + 643) = 31;
KiQueueReadyThread((__int64)CurrentPrcb, v1, v6);
if( (_BYTE)KeSmapEnabled )
__stac();
LOBYTE(result) = SwapContext((_KTHREAD *)1, (_KTHREAD *)v9, v10);
return result;
}Referenced by:
KiDispatchInterrupt