HalpSfiTimerInitialize
NTSTATUS __stdcall HalpSfiTimerInitialize(_LARGE_INTEGER *a1){
UINT8 v1;
_DWORD *QuadPart;
_LARGE_INTEGER v4;
NTSTATUS v5;
unsigned int i;
unsigned int v7;
unsigned int j;
void *v9;
signed __int32 v11[10];
QuadPart = (_DWORD *)a1[1].QuadPart;
if( QuadPart
|| (v4.QuadPart = HalMapIoSpace(*a1, 0x14ui64, MmNonCached, v1),
a1[1] = v4,
(QuadPart = (_DWORD *)v4.QuadPart) != 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(v11, 0);
*QuadPart = -1;
_InterlockedOr(v11, 0);
QuadPart[2] &= ~2u;
_InterlockedOr(v11, 0);
QuadPart[2] |= 5u;
_InterlockedOr(v11, 0);
v7 = QuadPart[1];
for( j = 0; j < 0x64; ++j )
{
if( v7 > QuadPart[1] )
break;
KeStallExecutionProcessor(0x32u);
}
if( j != 100 )
return 0;
}
v5 = -1073741823;
}
else
{
v5 = -1073741801;
}
HalSetTimerProblem(a1);
v9 = (void *)a1[1].QuadPart;
if( v9 )
{
HalpUnmapVirtualAddress(v9, 1i64, 0);
a1[1].QuadPart = 0i64;
}
return v5;
}Referenced by:
HalpSfiTimerStop