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