HalpHvTimerInitialize

INT64 __fastcall HalpHvTimerInitialize(INT64 a1){
  __int64 v1; 
  __int64 v3; 
  INT64 result; 
  unsigned __int64 v5; 
  PVOID v6; 
  __int64 MaximumProcessorCount; 
  LARGE_INTEGER v8; 
  PVOID v9; 
  __int64 *v10; 
  _QWORD *v11; 
  __int64 v12; 
  __int64 v13; 
  LODWORD(v1) = *((_DWORD *)KeGetPcr() + 105);
  v3 = 3 * v1;
  if( *(_QWORD *)(a1 + 24 * v1 + 8) )
  {
    HalpHvTimerAcknowledgeInterrupt(a1);
    return 0i64;
  }
  if( *(_BYTE *)HalpHvCpuManager )
  {
    v5 = __readmsr(0x40000083u) & 0xFFFFFFFFFFFFF000ui64;
    *(_QWORD *)(a1 + 8 * v3 + 16) = v5;
    v6 = HalMapIoSpace((LARGE_INTEGER)v5, 0x1000ui64, MmCached);
    *(_QWORD *)(a1 + 8 * v3 + 8) = v6;
    if( v6 )
      return 0i64;
    return 3221225626i64;
  }
  result = HalSocRequestApi(a1, 0i64, 4i64, 8ui64, &HalpHvPhysicalMemoryApi);
  if( (int)result >= 0 )
  {
    MaximumProcessorCount = (unsigned int)HalQueryMaximumProcessorCount();
    v8.QuadPart = ((__int64(__fastcall *)(__int64, __int64))HalpHvPhysicalMemoryApi)(-1i64, MaximumProcessorCount);
    if( v8.QuadPart )
    {
      *(LARGE_INTEGER *)(a1 + 16) = v8;
      v9 = HalMapIoSpace(v8, (unsigned __int64)(unsigned int)MaximumProcessorCount << 12, MmCached);
      v10 = (__int64 *)(a1 + 8);
      *(_QWORD *)(a1 + 8) = v9;
      if( v9 )
      {
        if( (unsigned int)MaximumProcessorCount > 1 )
        {
          v11 = (_QWORD *)(a1 + 32);
          v12 = (unsigned int)(MaximumProcessorCount - 1);
          do
          {
            v11[1] = v10[1] + 4096;
            v13 = *v10;
            v10 += 3;
            *v11 = v13 + 4096;
            v11 += 3;
            --v12;
          }
          while( v12 );
        }
        return 0i64;
      }
    }
    return 3221225626i64;
  }
  return result;
}

Referenced by:

No references.