KiSpuriousDispatchNoEOI

VOID __fastcall KiSpuriousDispatchNoEOI(INT64 a1, INT64 a2, INT64 CurrentThread, INT64 a4, CHAR a5){
  __int64 v5; 
  __int64 v6; 
  unsigned __int8 CurrentIrql; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 v9; 
  __int64 v10; 
  UINT64 v11; 
  int v12; 
  struct _KPRCB *v13; 
  unsigned __int64 v14; 
  INT64 v15; 
  _ETHREAD *v16; 
  _KTHREAD *v17; 
  INT64 v18; 
  INT64 v19; 
  unsigned __int8 v20; 
  unsigned __int8 v21; 
  CHAR v24; 
  void *retaddr; 
  __int16 v26; 
  int v27; 
  void *v28; 
  __int16 v29; 
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  *(_BYTE *)(v5 - 87) = CurrentIrql;
  CurrentPrcb = KeGetCurrentPrcb();
  if( ++*((_BYTE *)CurrentPrcb + 32) == 1 )
  {
    CurrentThread = *((_QWORD *)CurrentPrcb + 1);
    v9 = __rdtsc() - *((_QWORD *)CurrentPrcb + 4056);
    *(_QWORD *)(CurrentThread + 72) += v9;
    v10 = *(unsigned int *)(CurrentThread + 80);
    *((_QWORD *)CurrentPrcb + 4056) += v9;
    v11 = v9 + v10;
    v12 = v11;
    a2 = HIDWORD(v11);
    if( a2 )
      v12 = -1;
    *(_DWORD *)(CurrentThread + 80) = v12;
    if( (*(_BYTE *)(CurrentThread + 2) & 0x3E) != 0 )
      KiEndThreadAccountingPeriod(KeGetCurrentPrcb(), (_KTHREAD *)CurrentThread, v9);
  }
  _enable();
  ++*(_DWORD *)(v6 + 116);
  _disable();
  v13 = KeGetCurrentPrcb();
  if( *((_BYTE *)v13 + 32) <= 1u )
  {
    v14 = __rdtsc();
    a2 = (unsigned __int64)HIDWORD(v14) << 32;
    v15 = (a2 | (unsigned int)v14) - *((_QWORD *)v13 + 4056);
    *((_QWORD *)v13 + 4071) += v15;
    *((_QWORD *)v13 + 4056) += v15;
    CurrentThread = v15;
    if( (*(_BYTE *)(*((_QWORD *)v13 + 1) + 2i64) & 0x72) != 0 )
    {
      KiBeginThreadAccountingPeriod(v13, 0i64, v15);
      v13 = KeGetCurrentPrcb();
      ++*((_BYTE *)v13 + 32);
    }
    LOBYTE(a2) = *((_BYTE *)v13 + 6);
    *((_BYTE *)v13 + 6) = 0;
    if( !*((_BYTE *)v13 + 7) )
    {
      if( (_BYTE)a2 )
      {
        if( *(_BYTE *)(v5 - 87) < 2u )
        {
          *((_BYTE *)v13 + 32) = 0;
          KiDpcInterruptBypass();
          goto LABEL_15;
        }
        HalRequestSoftwareInterrupt(2i64);
        v13 = KeGetCurrentPrcb();
      }
    }
  }
  --*((_BYTE *)v13 + 32);
LABEL_15:
  __writecr8(*(unsigned __int8 *)(v5 - 87));
  _disable();
  if( (*(_BYTE *)(v5 + 240) & 1) == 0 )
  {
    _mm_setcsr(*(_DWORD *)(v5 - 84));
    __iretq(retaddr, v26, v27, v28, v29);
  }
  if( (_BYTE)KeSmapEnabled )
    __stac();
  while( (*((_BYTE *)KeGetCurrentThread() + 194) & 3) != 0 )
  {
    __writecr8(1ui64);
    _enable();
    KiInitiateUserApc((_KTRAP_FRAME *)1);
    _disable();
    __writecr8(0i64);
  }
  if( (*((_BYTE *)KeGetPcr() + 638) & 2) != 0 )
    KiUpdateStibpPairing(0i64);
  v16 = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)v16 & 0x8000000) != 0 )
    KiRestoreSetContextState((INT64)v16, a2, CurrentThread, a4, v24);
  v17 = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)v17 & 0x40010000) != 0 && (*((_BYTE *)v17 + 2) & 1) != 0 )
    KiCopyCounters((_KTHREAD *)v17);
  _mm_setcsr(*(_DWORD *)(v5 - 84));
  if( *(_WORD *)(v5 + 128) )
    KiRestoreDebugRegisterState();
  v18 = *(_QWORD *)(v5 - 48);
  v19 = *(_QWORD *)(v5 - 56);
  __writegsbyte(0x853u, 0);
  v20 = *((_BYTE *)KeGetPcr() + 637);
  if( *((_BYTE *)KeGetPcr() + 634) != v20 )
  {
    __writegsbyte(0x27Au, v20);
    __writemsr(0x48u, v20);
  }
  v21 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
  if( v21 )
    __writemsr(0x49u, 1ui64);
  v21 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
  if( v21 )
    __flush_rsb();
  if( (KiKvaShadow & 1) == 0 )
  {
    __swapgs();
    __iretq(retaddr, v26, v27, v28, v29);
  }
  KiKernelExit(*(_QWORD *)(v5 - 72), *(_QWORD *)(v5 - 64), v19, v18, a5);
}

Referenced by:

No references.