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