HalpApicTimerDiscover
NTSTATUS __stdcall HalpApicTimerDiscover(){
INT64 v0;
unsigned __int64 v1;
unsigned __int64 v2;
INT64 v3;
int v4;
int v5;
int v6;
int v7;
int v8;
int v9;
__int128 v11;
_TIMER_INITIALIZATION_BLOCK NewTimer;
__int64 v13;
v11 = 0i64;
if( HalSocGetAcpiTable(0x43495041ui64) )
{
v1 = 0i64;
if( HalSocRequestApi(v0, 0i64, 6i64, 0x10ui64, &v11) >= 0 )
v1 = (*((__int64(**)(void))&v11 + 1))();
memset(&NewTimer, 0i64, sizeof(NewTimer));
v13 = 0i64;
NewTimer.Header.TableSize = 144;
v2 = 32i64;
NewTimer.CounterBitWidth = 32;
NewTimer.InternalData = &v13;
NewTimer.Header.TableVersion = 1;
NewTimer.KnownType = TimerApic;
NewTimer.InternalDataSize = 8;
NewTimer.Capabilities = 2147;
if( HalpApicTimerIsInvariant(v3) )
{
v4 = 10;
}
else
{
NewTimer.Capabilities = 26723;
v4 = 11;
}
HIDWORD(v13) = v4;
v5 = v4 - 1;
if( v5 )
{
v6 = v5 - 1;
if( v6 )
{
v7 = v6 - 1;
if( v7 )
{
v8 = v7 - 5;
if( v8 )
{
v9 = v8 - 1;
if( v9 )
{
if( v9 == 1 )
v2 = 128i64;
else
v2 = 1i64;
}
else
{
v2 = 64i64;
}
}
}
else
{
v2 = 16i64;
}
}
else
{
v2 = 8i64;
}
}
else
{
v2 = 4i64;
}
NewTimer.Interrupt.Mode = Latched;
NewTimer.Interrupt.Polarity = InterruptActiveHigh;
LOBYTE(v13) = -1;
NewTimer.CounterFrequency = v1 / v2;
NewTimer.FunctionTable.Initialize = (PLONG)HalpApicTimerInitialize;
NewTimer.FunctionTable.QueryCounter = (PULONG64)HalpApicTimerQueryCounter;
NewTimer.FunctionTable.AcknowledgeInterrupt = xHalTimerWatchdogStop;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpApicTimerArm;
NewTimer.FunctionTable.SetInterruptVector = HalpApicTimerSetInterruptVector;
NewTimer.FunctionTable.Stop = HalpApicTimerStop;
HalpTimerRegister(&NewTimer, 0i64);
}
return 0;
}Referenced by:
HalpTimerRegisterBuiltinPlugins