HalpTimerConfigureInterrupt

__int64 __fastcall HalpTimerConfigureInterrupt(
        __int64 a1,
        unsigned int a2,
        char a3,
        __int64 a4,
        __int64 a5,
        int a6,
        __int128 *a7,
        __int64 (__fastcall *a8)(__int64 a1, __int64 a2)){
  __int128 v11; 
  void *v12; 
  INT64 v13; 
  void *v14; 
  void *v15; 
  int v16; 
  int v17; 
  __int64 v18; 
  INT64 v19; 
  int v20; 
  VOID *v22; 
  VOID *v23; 
  __int64 v24; 
  int v25; 
  int v26; 
  int v27; 
  unsigned int v28; 
  bool v29; 
  void *v30; 
  void *v31; 
  void *v32; 
  __int64 v33; 
  int v34; 
  unsigned __int64 v35; 
  INT64 v36; 
  unsigned int v37; 
  __int64 v38; 
  int v39[2]; 
  int v40[4]; 
  __int128 *v41; 
  __int128 v42; 
  INT64 result; 
  char v44; 
  int v45; 
  int v46; 
  __int128 v47; 
  unsigned int v48; 
  int v49; 
  int v50; 
  unsigned __int16 v51; 
  int v52[10]; 
  v40[1] = 0;
  v40[3] = 0;
  v38 = 0i64;
  v42 = 0i64;
  memset((INT64)&result, 0i64);
  v11 = *a7;
  HIDWORD(result) = a2;
  v44 = a3;
  v40[0] = 6;
  v48 = a6 & 0x3FFFFFFF | v48 & 0xC0000000 | 0x40000000;
  v47 = v11;
  v40[2] = KeFindFirstSetRightGroupAffinity((_GROUP_AFFINITY *)a7);
  v41 = &v42;
  v16 = -1073741637;
  LODWORD(v42) = a6 & 0x3FFFFFFF;
  v17 = *(_DWORD *)(a1 + 224);
  if( (v17 & 0x800) != 0 )
  {
    HalpTimerGetInternalData((KDPC *)a1, v12, v14, v15);
    (*(void(__fastcall **)(__int64, _QWORD))(a1 + 168))(v18, a2);
    HalpInterruptSetIdtEntry(a2, a8, a3, v19, (UINT64 *)a5);
    return 0;
  }
  if( (v17 & 0x400) != 0 )
  {
    LOBYTE(v13) = 1;
    if( (unsigned __int8)HalpInterruptIsMsiSupported(v13) )
    {
      if( (*(_DWORD *)(a1 + 184) & 0x50) != 64 )
      {
        HalpInterruptSetIdtEntry(a2, a8, a3, (INT64)v15, (UINT64 *)a5);
        if( (*(_DWORD *)(a1 + 184) & 0x40) == 0 )
        {
          v24 = *(_QWORD *)(a1 + 288);
          v45 = 0;
          LODWORD(result) = 3;
          v46 = 1;
          LODWORD(v36) = 1;
          v16 = HalpInterruptRemap(
                  *(_DWORD *)v24,
                  *(unsigned int *)(v24 + 4),
                  (int *)(v24 + 8),
                  0,
                  (__int64)&result,
                  v36);
          if( v16 < 0 )
            goto LABEL_15;
          v25 = v49;
          *(_DWORD *)(a1 + 184) |= 0x40u;
          *(_DWORD *)(a1 + 236) = v25;
          *(_DWORD *)(a1 + 232) = v50;
          *(_QWORD *)(a1 + 240) = v51;
        }
        v16 = HalpTimerSetupMessageInterruptRouting(a1, v22, v23, v15);
        if( v16 >= 0 )
          *(_DWORD *)(a1 + 184) |= 0x10u;
        else
          HalpTimerUnmapInterrupt(a1, a2, a6, 1);
        if( v16 >= 0 )
          return 0;
      }
    }
  }
LABEL_15:
  v26 = *(_DWORD *)(a1 + 224);
  if( (v26 & 0x200) != 0 )
  {
    v20 = HalpInterruptGsiToLine(*(_DWORD *)(a1 + 88), &v38);
    if( v20 < 0 )
    {
      v27 = 16;
      *(_DWORD *)(a1 + 256) = v20;
      *(_DWORD *)(a1 + 272) = 356;
LABEL_37:
      HalpTimerLastProblem = v27;
      *(_DWORD *)(a1 + 252) = v27;
      *(_QWORD *)(a1 + 264) = "minkernel\\hals\\lib\\timers\\common\\timersup.c";
      return(unsigned int)v20;
    }
  }
  else
  {
    if( (v26 & 0x100) == 0 )
    {
      *(_DWORD *)(a1 + 256) = v16;
      v27 = 17;
      v20 = -1073741811;
      *(_DWORD *)(a1 + 272) = 371;
      goto LABEL_37;
    }
    v28 = *(_DWORD *)(a1 + 84);
    if( v28 >= 8 )
    {
      LODWORD(v38) = 45057;
      v28 -= 8;
    }
    else
    {
      LODWORD(v38) = 45056;
    }
    v29 = *(_DWORD *)(a1 + 92) == 0;
    HIDWORD(v38) = v28;
    if( v29 )
    {
      *(_DWORD *)(a1 + 92) = 1;
      *(_DWORD *)(a1 + 96) = 1;
    }
  }
  HalpInterruptSetIdtEntry(a2, a8, a3, (INT64)v15, (UINT64 *)a5);
  if( (*(_DWORD *)(a1 + 184) & 0x10) == 0 )
    goto LABEL_28;
  HalpTimerGetInternalData((KDPC *)a1, v30, v31, v32);
  v20 = (*(__int64(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD))(a1 + 152))(v33, 0i64, 0i64, 0i64);
  if( v20 < 0 )
  {
    v27 = 24;
    *(_DWORD *)(a1 + 256) = v20;
    *(_DWORD *)(a1 + 272) = 398;
    goto LABEL_37;
  }
  *(_DWORD *)(a1 + 184) &= ~0x10u;
  if( (*(_DWORD *)(a1 + 184) & 0x10) == 0 )
  {
LABEL_28:
    if( a2 == 209 )
    {
      HalpTimerCriticalClockSource = v38;
      HalpTimerCriticalClockSourceCount = 1;
    }
  }
  v34 = *(_DWORD *)(a1 + 96);
  LODWORD(result) = 0;
  v46 = v34;
  v45 = *(_DWORD *)(a1 + 92);
  HalpInterruptApplyOverrides(&v38, &v45, &v46);
  v20 = HalpInterruptLineToGsi((int *)&v38, v52);
  if( v20 < 0 )
    return(unsigned int)v20;
  if( (*(_DWORD *)(a1 + 184) & 0x40) == 0 )
  {
    LODWORD(v36) = 1;
    v20 = HalpInterruptRemap(
            **(_DWORD **)(a1 + 288),
            *(unsigned int *)(*(_QWORD *)(a1 + 288) + 4i64),
            (int *)(*(_QWORD *)(a1 + 288) + 8i64),
            0,
            (__int64)&result,
            v36);
    if( v20 < 0 )
      return(unsigned int)v20;
    *(_DWORD *)(a1 + 184) |= 0x40u;
  }
  v39[0] = -1;
  v39[1] = 1;
  v35 = (unsigned __int8)HalpAcquireHighLevelLock(&HalpInterruptLock);
  v20 = HalpInterruptSetLineState(&v38, a2, a3, v46, v45, (__int64)v40, (__int64)v39, v37);
  KxReleaseSpinLock(&HalpInterruptLock);
  __writecr8(v35);
  if( v20 < 0 )
    return(unsigned int)v20;
  return 0;
}

Referenced by:

HalpTimerInitializeClock
HalpTimerInitializeProfiling
HalpTimerPrepareClockInterrupt
HalpTimerTestHypervisorTimer