KiVmbusInterruptSubDispatch

VOID __stdcall KiVmbusInterruptSubDispatch(){
  __int64 v0; 
  unsigned __int8 CurrentIrql; 
  struct _KPRCB *CurrentPrcb; 
  unsigned __int64 v3; 
  unsigned int EntropyCount; 
  unsigned int *v5; 
  _ETHREAD *CurrentThread; 
  UINT64 v7; 
  __int64 CurrentRunTime; 
  UINT64 v9; 
  int v10; 
  bool v11; 
  void(*v12)(void); 
  _LARGE_INTEGER TimeStamp; 

  CurrentIrql = KeGetCurrentIrql();
  __writecr8(3ui64);
  *(_BYTE *)(v0 - 87) = CurrentIrql;
  *(_DWORD *)(v0 - 96) = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  if( ++CurrentPrcb->NestingLevel == 1 )
  {
    v3 = __rdtsc();
    EntropyCount = CurrentPrcb->EntropyTimingState.EntropyCount;
    v5 = &CurrentPrcb->EntropyTimingState.Buffer[(unsigned __int16)(EntropyCount & 0x7FF) >> 5];
    *v5 = v3 ^ __ROR4__(*v5, 5);
    CurrentPrcb->EntropyTimingState.EntropyCount = ++EntropyCount;
    if( (EntropyCount & 0x3FF) == 0 )
      *(_DWORD *)(v0 - 96) = 1;
    CurrentThread = CurrentPrcb->CurrentThread;
    v7 = v3 - CurrentPrcb->StartCycles;
    CurrentThread->Tcb.CycleTime += v7;
    CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
    CurrentPrcb->StartCycles += v7;
    v9 = v7 + CurrentRunTime;
    v10 = v9;
    if( HIDWORD(v9) )
      v10 = -1;
    CurrentThread->Tcb.CurrentRunTime = v10;
    if( (CurrentThread->Tcb.gap0[2] & 0x3E) != 0 )
      KiEndThreadAccountingPeriod(KeGetCurrentPrcb(), &CurrentThread->Tcb, v7);
  }
  _enable();
  if( *(_DWORD *)(v0 - 96) )
    KiEntropyQueueDpc(KeGetCurrentPrcb());
  v11 = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) == 0;
  *(_BYTE *)(v0 + 243) = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) != 0;
  if( !v11 )
    EtwGetKernelTraceTimestamp(&TimeStamp, 0x20004000ui64);
  v12 = (void(*)(void))HvlpInterruptCallback[*(unsigned int *)(v0 + 224)];
  v12();
  if( *(_BYTE *)(v0 + 243) )
    PerfInfoLogInterruptHv((INT64)v12, (unsigned int)(((*(_DWORD *)(v0 + 224) + 48) << 8) + 1), (INT64)&TimeStamp);
  _disable();
}

Referenced by:

No references.