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