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