HalpHpetSetMatchValue
NTSTATUS __stdcall HalpHpetSetMatchValue(INT64 *a1, INT64 a2, CHAR a3){
NTSTATUS v3;
__int64 v4;
int v5;
__int64 v6;
unsigned int v7;
unsigned int v9;
unsigned int *v10;
unsigned int v11;
int v12;
unsigned int v13;
unsigned int v14;
NTSTATUS result;
signed __int32 v16[22];
unsigned int v17;
CHAR v18;
v18 = a3;
v3 = 0;
v4 = *(&CmpDummyThreadEvent + 536);
v5 = a2;
v6 = 32i64 * *(int *)a1;
v7 = *((_DWORD *)a1 + 4);
v17 = v7;
v9 = 10;
v10 = (unsigned int *)(*(&CmpDummyThreadEvent + 536) + 32 * (*(int *)a1 + 8i64));
v11 = 0;
do
{
v12 = v7 + v5;
if( !a3 )
{
v13 = *v10 & 0xFFFFFEB1 | 0x14C;
if( *((_DWORD *)a1 + 2) != 2 )
v13 = *v10 & 0xFFFFFEB1 | 0x104;
v14 = ((*((_BYTE *)a1 + 4) & 0x1F) << 9) | v13 & 0xFFFF81FF;
*v10 = v14;
_InterlockedOr(v16, 0);
v11 = v14 & 0xFFFFFFBF;
}
*(_DWORD *)(v6 + v4 + 264) = v12;
_InterlockedOr(v16, 0);
if( !a3 )
{
if( *((_DWORD *)a1 + 2) == 2 )
{
if( !*((_BYTE *)a1 + 12) )
{
HalSetTimerProblem(a1);
v7 = v17;
a3 = v18;
}
v11 |= 8u;
*v10 = v11;
_InterlockedOr(v16, 0);
*(_DWORD *)(v6 + v4 + 264) = *((_DWORD *)a1 + 4);
_InterlockedOr(v16, 0);
*v10 = v11;
_InterlockedOr(v16, 0);
*(_DWORD *)(v6 + v4 + 264) = *((_DWORD *)a1 + 4);
_InterlockedOr(v16, 0);
*(_DWORD *)(v6 + v4 + 264) = *((_DWORD *)a1 + 4);
}
else
{
*v10 = v11;
}
_InterlockedOr(v16, 0);
*((_DWORD *)a1 + 8) = v11;
}
v5 = *(_DWORD *)(*(&CmpDummyThreadEvent + 536) + 240i64);
if( v12 - v5 <= v7 && (unsigned int)(v12 - v5) >= 2 && *(_DWORD *)(v6 + v4 + 264) != 2 * v12 )
break;
v7 = 1 << v9++;
v17 = v7;
}
while( v9 < 0x1F );
if( v9 != 10 )
{
if( v9 == 31 )
{
HalSetTimerProblem(a1);
v3 = -1073741823;
}
++*((_DWORD *)&CmpDummyThreadEvent + v9 + 1070);
}
result = v3;
*((_DWORD *)a1 + 5) = v12;
return result;
}Referenced by:
HalpHpetAcknowledgeInterrupt
HalpHpetArmTimer