HalpVpptTimerRegister
INT64 __stdcall HalpVpptTimerRegister(){
char v0;
INT64 v1;
INT64 v2;
INT64 result;
int v4;
int v5;
int v6;
bool v7;
_TIMER_INITIALIZATION_BLOCK NewTimer;
__int128 v9;
__int128 v10;
__int128 v11;
v2 = v1;
if( !v1 )
return 3221225485i64;
if( v0 && (*(_DWORD *)(v1 + 224) & 0x8000) == 0 )
return 3221225659i64;
if( (*(_DWORD *)(v1 + 224) & 1) != 0 )
return 3221225659i64;
v4 = *(_DWORD *)(v1 + 224) & 0xB00;
if( !v4 )
return 3221225659i64;
LODWORD(result) = HalSocRequestApi(v1, 0i64, 7i64, 0x10ui64, &qword_140C4A430);
if( (int)result >= 0 )
{
if( _InterlockedExchange(dword_140C4A450, 1) )
{
return 3221227288i64;
}
else
{
LODWORD(dword_140C4A428) = -1;
qword_140C4A480 = (PVOID)v2;
ExtEnvInitializeSpinLock();
qword_140C4A448 = (__int64)&Arg2;
Arg2 = (INT64)&Arg2;
memset(&NewTimer, 0i64, sizeof(NewTimer));
NewTimer.Identifier = 0;
NewTimer.FunctionTable.Initialize = (PLONG)HalpVpptInitialize;
NewTimer.Header.TableVersion = 1;
NewTimer.FunctionTable.ArmTimer = (PLONG)HalpVpptArmTimer;
NewTimer.FunctionTable.Stop = HalpVpptStop;
NewTimer.FunctionTable.AcknowledgeInterrupt = HalpVpptAcknowledgeInterrupt;
v5 = *(_DWORD *)(v2 + 224) & 0x8000;
NewTimer.Header.TableSize = 144;
NewTimer.CounterBitWidth = 64;
NewTimer.InternalDataSize = 48;
NewTimer.Capabilities = v4 | v5 | 0x210031;
NewTimer.Interrupt.Mode = *(_DWORD *)(v2 + 96);
NewTimer.Interrupt.Polarity = *(_DWORD *)(v2 + 92);
NewTimer.Interrupt.Gsi = *(_DWORD *)(v2 + 88);
v6 = *(_DWORD *)(v2 + 84);
v10 = 0i64;
LODWORD(v10) = -1;
v7 = *(_DWORD *)(v2 + 228) == 2;
NewTimer.Interrupt.LegacyIrq = v6;
NewTimer.InternalData = &v9;
v9 = 0i64;
NewTimer.KnownType = TimerVPPT;
v11 = 0i64;
if( v7 )
NewTimer.CounterFrequency = *(_QWORD *)(v2 + 192);
else
NewTimer.CounterFrequency = 10000000i64;
LODWORD(result) = HalpTimerRegister(&NewTimer, 0i64);
}
}
return result;
}Referenced by:
HalpTimerSelectRoles