HalpHpetDiscover
NTSTATUS __stdcall HalpHpetDiscover(){
_LARGE_INTEGER *AcpiTable;
INT64 v1;
_LARGE_INTEGER *v2;
UINT8 v3;
unsigned int *v4;
unsigned int v5;
unsigned int v6;
unsigned __int64 v7;
int v8;
unsigned int v9;
unsigned int v10;
unsigned __int64 v11;
unsigned int *v12;
INT64 v13;
int v14;
unsigned int v15;
unsigned int Capabilities;
NTSTATUS v17;
CHAR v18;
int v20;
unsigned __int8 v21;
signed __int32 v22[8];
CHAR v23[4];
unsigned int v24;
_TIMER_INITIALIZATION_BLOCK NewTimer;
unsigned __int64 v26;
UINT64 v27;
unsigned __int64 v28;
__int128 v29[2];
__int64 v30;
v23[0] = 0;
v23[1] = 0;
memset(v29, 0, sizeof(v29));
v30 = 0i64;
AcpiTable = HalSocGetAcpiTable(0x54455048ui64);
v2 = AcpiTable;
if( AcpiTable )
{
if( !LOBYTE(AcpiTable[5].anonymous_0.LowPart) && HalSocRequestConfigurationData(1i64, v1, &v23[1]) >= 0 )
{
*(&CmpDummyThreadEvent + 537) = *(LONGLONG *)((char *)&v2[5].QuadPart + 4);
if( !*(&CmpDummyThreadEvent + 1075) || v23[1] )
{
v27 = HalMapIoSpace(*(&CmpDummyThreadEvent + 537), 0x400ui64, MmNonCached, v3);
v4 = (unsigned int *)v27;
if( v27 )
{
if( HalRegisterPermanentAddressUsage(*(&CmpDummyThreadEvent + 537), 0x400u) >= 0 )
{
v5 = *v4;
v6 = HIWORD(*v4);
if( v6 )
{
if( v6 != 0xFFFF )
{
if( (v5 & 0x8000) != 0 )
byte_140C507B8 = 1;
v7 = (((unsigned __int64)v4[1] >> 1) + 1000000000000000i64) / v4[1];
v28 = v7;
if( v6 != 4318 )
{
v8 = 1;
v9 = 0;
v10 = ((v5 >> 8) & 0x1F) + 1;
if( !v10 )
goto LABEL_27;
v11 = (unsigned int)v7;
v12 = v4 + 64;
v26 = (unsigned int)v7;
while( 1 )
{
memset(&NewTimer, 0i64, sizeof(NewTimer));
v30 = 0i64;
NewTimer.InternalData = v29;
NewTimer.Header.TableVersion = 1;
NewTimer.FunctionTable.Initialize = (PLONG)HalpHpetInitialize;
NewTimer.Header.TableSize = 144;
NewTimer.FunctionTable.AcknowledgeInterrupt = HalpHpetAcknowledgeInterrupt;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpHpetArmTimer;
NewTimer.FunctionTable.Stop = HalpHpetStop;
memset((char *)v29 + 4, 0, 20);
v14 = (v9 + 1) | (BYTE4(v2[6].QuadPart) << 16);
NewTimer.CounterBitWidth = 31;
NewTimer.Identifier = v14;
*((_QWORD *)&v29[1] + 1) = *(&CmpDummyThreadEvent + 537);
NewTimer.CounterFrequency = v11;
NewTimer.InternalDataSize = 40;
NewTimer.Interrupt.Mode = Latched;
NewTimer.Interrupt.Polarity = InterruptActiveHigh;
NewTimer.KnownType = TimerHpet;
NewTimer.MaxDivisor = 1;
v24 = v9 + 1;
LODWORD(v29[0]) = v9;
NewTimer.Capabilities = 48;
v15 = *v12 & 0xFFFFBFFB;
*v12 = v15;
_InterlockedOr(v22, 0);
if( (v15 & 0x10) != 0 )
{
Capabilities = 112;
BYTE12(v29[0]) = 1;
NewTimer.Capabilities = 112;
}
else
{
Capabilities = NewTimer.Capabilities;
}
if( (v15 & 0x20) != 0 )
{
*v12 = v15 | 0x100;
_InterlockedOr(v22, 0);
v15 = *v12;
if( (*v12 & 0x100) == 0 )
goto LABEL_25;
Capabilities = NewTimer.Capabilities;
}
LODWORD(v30) = v15;
if( byte_140C507B8 )
{
v17 = HalSocRequestConfigurationData(2i64, v13, v23);
v18 = v23[0];
if( v17 < 0 )
v18 = 0;
v23[0] = v18;
if( !v9 )
{
Capabilities |= 0x100u;
NewTimer.Interrupt.LegacyIrq = v18 == 0 ? 2 : 0;
v8 |= 4u;
LABEL_31:
NewTimer.Capabilities = Capabilities;
LABEL_23:
if( (Capabilities & 0xF00) != 0 )
HalpTimerRegister(&NewTimer, 0i64);
goto LABEL_25;
}
if( v9 == 1 )
{
NewTimer.Interrupt.LegacyIrq = 8;
Capabilities |= 0x100u;
v8 |= 0x100u;
goto LABEL_31;
}
if( (v15 & 0x8000) != 0 )
goto LABEL_23;
}
else
{
v20 = ~v8 & v12[1];
if( v20 )
{
v21 = 0;
while( ((1 << v21) & v20) == 0 )
{
if( ++v21 >= 0x20u )
{
LOWORD(Capabilities) = NewTimer.Capabilities;
goto LABEL_23;
}
}
Capabilities = NewTimer.Capabilities | 0x200;
NewTimer.Interrupt.Gsi = v21 + (unsigned __int16)HalpHpetGsiOffset;
v8 |= 1 << v21;
BYTE4(v29[0]) = v21;
goto LABEL_31;
}
}
LABEL_25:
v9 = v24;
v12 += 8;
v11 = v26;
if( v24 >= v10 )
{
v4 = (unsigned int *)v27;
goto LABEL_27;
}
}
}
byte_140C507B8 = 0;
LABEL_27:
memset(&NewTimer, 0i64, sizeof(NewTimer));
NewTimer.Header.TableVersion = 1;
v30 = 0i64;
NewTimer.CounterFrequency = (unsigned int)v28;
memset(v29, 0, sizeof(v29));
LODWORD(v29[0]) = -1;
NewTimer.InternalData = v29;
NewTimer.FunctionTable.Initialize = (PLONG)HalpHpetInitialize;
NewTimer.FunctionTable.QueryCounter = (PULONG64)HalpHpetQueryCounter;
NewTimer.FunctionTable.AcknowledgeInterrupt = HalpHpetAcknowledgeInterrupt;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpHpetArmTimer;
NewTimer.Identifier = BYTE4(v2[6].QuadPart) << 16;
NewTimer.Header.TableSize = 144;
NewTimer.CounterBitWidth = 32;
NewTimer.InternalDataSize = 40;
NewTimer.KnownType = TimerHpet;
NewTimer.MaxDivisor = 1;
NewTimer.Capabilities = 2;
HalpTimerRegister(&NewTimer, 0i64);
}
}
}
HalpUnmapVirtualAddress(v4, 1i64, 0);
}
}
}
}
return 0;
}Referenced by:
HalpTimerRegisterBuiltinPlugins