HalpSfiTimerInitialize
INT64 __fastcall HalpSfiTimerInitialize(LARGE_INTEGER *a1){
_DWORD *QuadPart;
_DWORD *v3;
unsigned int v4;
unsigned int i;
unsigned int v6;
unsigned int j;
void *v8;
signed __int32 v10[10];
QuadPart = (_DWORD *)a1[1].QuadPart;
if( QuadPart
|| (v3 = HalMapIoSpace(*a1, 0x14ui64, MmNonCached), a1[1].QuadPart = (LONGLONG)v3, (QuadPart = v3) != 0i64) )
{
for( i = 0; i < 0x64; ++i )
{
if( (QuadPart[4] & 1) == 0 )
break;
KeStallExecutionProcessor(0x32u);
}
if( i != 100 )
{
QuadPart[2] = QuadPart[2] & 0xFFFFFFFA | 4;
_InterlockedOr(v10, 0);
*QuadPart = -1;
_InterlockedOr(v10, 0);
QuadPart[2] &= ~2u;
_InterlockedOr(v10, 0);
QuadPart[2] |= 5u;
_InterlockedOr(v10, 0);
v6 = QuadPart[1];
for( j = 0; j < 0x64; ++j )
{
if( v6 > QuadPart[1] )
break;
KeStallExecutionProcessor(0x32u);
}
if( j != 100 )
return 0;
}
v4 = -1073741823;
}
else
{
v4 = -1073741801;
}
HalSetTimerProblem(a1);
v8 = (void *)a1[1].QuadPart;
if( v8 )
{
HalpUnmapVirtualAddress(v8, 1i64, 0);
a1[1].QuadPart = 0i64;
}
return v4;
}Referenced by:
HalpSfiTimerStop