HalpTimerTestHypervisorTimer

NTSTATUS __stdcall HalpTimerTestHypervisorTimer(INT64 a1, BOOL *a2, INT64 a3, INT64 a4){
  int v6; 
  INT64 v7; 
  int v8; 
  INT64 v9; 
  char v10; 
  unsigned int v11; 
  INT64 v12; 
  int v13; 
  INT64 v15; 
  _GROUP_AFFINITY GroupAffinity; 
  INT64 a5; 

  while( 1 )
  {
    a5 = 0i64;
    *(_QWORD *)&GroupAffinity.Group = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
    LOBYTE(a3) = 15;
    GroupAffinity.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
    LODWORD(v15) = 0;
    v6 = HalpTimerConfigureInterrupt(
           (_KDPC *)a1,
           (PVOID)0xFB,
           (_KINTERRUPT_MODE)a3,
           a4,
           (UINT64 *)0xFFFFFFFFFFFFFFFFi64,
           v15,
           &GroupAffinity,
           xHalQueryIoPortAccessSupported);
    if( v6 < 0 )
      break;
    *(_DWORD *)(a1 + 64) = 0;
    HalpInterruptSetIdtEntry(0xFBui64, HalpTimerHypervisorInterruptStub, 15, v7, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
    v8 = 0;
    while( 1 )
    {
      v6 = HalpSetTimer((_KDPC *)a1, 3ui64, 0x2710ui64, 1, (INT64)&a5);
      if( v6 >= 0 )
        break;
      if( (unsigned int)++v8 >= 0xA )
      {
        (*(void(__fastcall **)(_QWORD))(a1 + 136))(*(_QWORD *)(a1 + 72));
        HalpInterruptSetIdtEntry(0xFBui64, xHalQueryIoPortAccessSupported, 15, v9, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
        goto LABEL_17;
      }
    }
    v10 = 0;
    v11 = 0;
    while( 1 )
    {
      KeStallExecutionProcessor(0x3E8u);
      ++v11;
      if( *(_DWORD *)(a1 + 64) )
        break;
      if( v11 >= 0x64 )
        goto LABEL_11;
    }
    v10 = 1;
LABEL_11:
    (*(void(__fastcall **)(_QWORD))(a1 + 136))(*(_QWORD *)(a1 + 72));
    HalpInterruptSetIdtEntry(0xFBui64, xHalQueryIoPortAccessSupported, 15, v12, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
    v13 = *(_DWORD *)(a1 + 184) & 0x10;
    if( v10 )
    {
      v6 = 0;
      *a2 = v13 != 0;
      break;
    }
    if( !v13 || (*(_DWORD *)(a1 + 224) & 0xB00) == 0 )
    {
      v6 = -1073741823;
      break;
    }
    HalpTimerUnmapInterrupt(a1, 0xFBu, 0, 0);
    *(_DWORD *)(a1 + 224) &= ~0x400u;
  }
LABEL_17:
  if( (*(_DWORD *)(a1 + 184) & 0x40) != 0 )
    HalpTimerUnmapInterrupt(a1, 0xFBu, 0, 0);
  return v6;
}

Referenced by:

HalpTimerInitializeHypervisorTimer