HalpTimerEnableHypervisorTimer
VOID __stdcall HalpTimerEnableHypervisorTimer(){
unsigned int *v0;
__int64 v1;
bool v2;
unsigned int v3;
unsigned int v4;
unsigned __int8 v5;
_KINTERRUPT_MODE v6;
unsigned __int64 v7;
NTSTATUS v8;
_INTERRUPT_LINE Line;
UINT64 Flags;
char Destination[12];
int v12;
__int128 *v13;
__int128 v14;
*(_QWORD *)&Destination[4] = 0i64;
v12 = 0;
Line = 0i64;
v0 = (unsigned int *)HalpHypervisorHpet;
v14 = 0i64;
if( HalpHypervisorHpet
&& (*((int(__fastcall **)(_QWORD))HalpHypervisorHpet + 13))(*((_QWORD *)HalpHypervisorHpet + 9)) >= 0 )
{
if( (v0[46] & 0x10) != 0 )
{
LOBYTE(v1) = 1;
v2 = (*((int(__fastcall **)(_QWORD, __int64, _QWORD, _QWORD))v0 + 19))(
*((_QWORD *)v0 + 9),
v1,
*((_QWORD *)v0 + 29),
v0[60]) < 0;
}
else
{
v3 = v0[56];
if( (v3 & 0x200) != 0 )
{
if( HalpInterruptGsiToLine(v0[22], &Line) < 0 )
return;
}
else if( (v3 & 0x100) != 0 )
{
v4 = v0[21];
if( v4 >= 8 )
{
Line.UnitId = 45057;
v4 -= 8;
}
else
{
Line.UnitId = 45056;
}
Line.Line = v4;
}
Flags = 0x1FFFFFFFFi64;
v13 = &v14;
*(_DWORD *)Destination = 3;
v5 = HalpAcquireHighLevelLock(&qword_140C49C40);
LOBYTE(v6) = 15;
v7 = v5;
v8 = HalpInterruptSetLineState(
&Line,
(PVOID)0xFB,
v6,
(_KINTERRUPT_POLARITY)v0[24],
(_KINTERRUPT_POLARITY)v0[23],
(_INTERRUPT_LINE *)Destination,
(UINT64)&Flags);
KxReleaseSpinLock(&qword_140C49C40);
__writecr8(v7);
v2 = v8 < 0;
}
if( !v2 )
((void(*)(void))qword_140C4A188)();
}
}Referenced by:
HalpAcpiPostSleep
HalpTimerInitializeHypervisorTimer