HalpSfiTimerDiscover
NTSTATUS __stdcall HalpSfiTimerDiscover(){
_LARGE_INTEGER *AcpiTable;
_LARGE_INTEGER *v1;
__int64 HighPart;
unsigned int v4;
unsigned __int64 v5;
_LARGE_INTEGER *v6;
unsigned __int64 LowPart;
unsigned __int64 v8;
_LARGE_INTEGER v9;
__int128 v10;
__int64 v11;
_TIMER_INITIALIZATION_BLOCK NewTimer;
memset(&NewTimer, 0i64, sizeof(NewTimer));
v11 = 0i64;
v10 = 0i64;
AcpiTable = HalSocGetAcpiTable(0x524D544Dui64);
v1 = AcpiTable;
if( AcpiTable )
{
HighPart = (unsigned int)AcpiTable->anonymous_0.HighPart;
if( (unsigned int)HighPart >= 0x38 )
{
v4 = 0;
v5 = (HighPart - 36) / 0x14ui64;
if( (_DWORD)v5 )
{
v6 = v1 + 6;
do
{
if( !BYTE4(v6[-2].QuadPart)
&& BYTE5(v6[-2].QuadPart) == 32
&& !BYTE6(v6[-2].QuadPart)
&& v6->anonymous_0.LowPart
&& v6[-1].QuadPart )
{
memset(&NewTimer, 0i64, sizeof(NewTimer));
NewTimer.Header.TableVersion = 1;
v11 = 0i64;
v10 = 0i64;
LowPart = v6->anonymous_0.LowPart;
NewTimer.Header.TableSize = 144;
NewTimer.CounterBitWidth = 32;
NewTimer.InternalDataSize = 24;
v8 = ((LowPart >> 1) + 1000000000000000i64) / LowPart;
v9 = v6[-1];
NewTimer.CounterFrequency = v8;
NewTimer.InternalData = &v10;
NewTimer.Interrupt.Gsi = v6->anonymous_0.HighPart;
NewTimer.FunctionTable.Initialize = (PLONG)HalpSfiTimerInitialize;
NewTimer.FunctionTable.QueryCounter = (PULONG64)HalpSfiTimerQueryCounter;
NewTimer.FunctionTable.AcknowledgeInterrupt = HalpSfiTimerAcknowledgeInterrupt;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpSfiTimerArm;
NewTimer.FunctionTable.Stop = HalpSfiTimerStop;
NewTimer.Interrupt.Mode = Latched;
NewTimer.Interrupt.Polarity = InterruptActiveHigh;
NewTimer.KnownType = TimerSfi;
NewTimer.MaxDivisor = 1;
NewTimer.Capabilities = 610;
if( HalRegisterPermanentAddressUsage(v9, 0x14u) < 0 )
return 0;
HIDWORD(v11) = v4;
*(_LARGE_INTEGER *)&v10 = v6[-1];
HalpTimerRegister(&NewTimer, 0i64);
}
++v4;
v6 = (_LARGE_INTEGER *)((char *)v6 + 20);
}
while( v4 < (unsigned int)v5 );
}
}
}
return 0;
}Referenced by:
HalpTimerRegisterBuiltinPlugins