HalpTimerSavePerformanceCounter

UINT64 __stdcall HalpTimerSavePerformanceCounter(){
  void *v0; 
  void *v1; 
  unsigned __int64 v2; 
  ULONG_PTR v3; 
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  void *v8; 
  __int64 v9; 
  char *v10; 
  UINT64 result; 
  ULONG_PTR v12; 
  __int64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  signed __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  signed __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  signed __int64 v27; 
  int v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  signed __int32 v32[10]; 
  v3 = HalpPerformanceCounter;
  v4 = -1i64;
  v5 = 1i64;
  if( *(_DWORD *)(HalpPerformanceCounter + 220) == 64 )
  {
    HalpTimerGetInternalData((KDPC *)HalpPerformanceCounter, v0, v1, (PVOID)v2);
    v7 = (*(__int64(__fastcall **)(__int64))(v3 + 112))(v6);
    v9 = *(_QWORD *)(v3 + 208);
    v10 = (char *)v7;
  }
  else
  {
    do
    {
      v9 = *(_QWORD *)(v3 + 208);
      do
      {
        v13 = *(_QWORD *)(v3 + 200);
        HalpTimerGetInternalData((KDPC *)v3, v0, v1, (PVOID)v2);
        v15 = (*(__int64(__fastcall **)(__int64))(v3 + 112))(v14);
        _InterlockedOr(v32, 0);
        v16 = *(_QWORD *)(v3 + 200);
      }
      while( v13 != v16 );
    }
    while( v9 != *(_QWORD *)(v3 + 208) );
    v8 = (void *)*(unsigned int *)(v3 + 220);
    v17 = v13 ^ v15;
    if( _bittest64((const __int64 *)&v17, (unsigned __int8)((_BYTE)v8 - 1)) )
    {
      if( (_DWORD)v8 == 64 )
        v18 = -1i64;
      else
        v18 = (1i64 << (char)v8) - 1;
      v19 = 1i64;
      if( (_DWORD)v8 != 64 )
        v19 = 1i64 << (char)v8;
      v2 = v13 & v18;
      v10 = (char *)(v15 | v13 ^ v2);
      if( v15 < v2 )
        v10 += v19;
      _InterlockedCompareExchange64((volatile signed __int64 *)(v3 + 200), (signed __int64)v10, v16);
    }
    else
    {
      if( (_DWORD)v8 == 64 )
        v20 = -1i64;
      else
        v20 = (1i64 << (char)v8) - 1;
      v10 = (char *)(v15 | v13 & ~v20);
    }
  }
  result = (UINT64)&v10[v9];
  *(_QWORD *)(v3 + 16) = &v10[v9];
  v12 = HalpAlwaysOnCounter;
  if( HalpAlwaysOnCounter )
  {
    if( *(_DWORD *)(HalpAlwaysOnCounter + 220) == 64 )
    {
      HalpTimerGetInternalData((KDPC *)HalpAlwaysOnCounter, v10, v8, (PVOID)v2);
      v22 = (*(__int64(__fastcall **)(__int64))(v12 + 112))(v21);
      v23 = *(_QWORD *)(v12 + 208);
      v24 = v22;
    }
    else
    {
      do
      {
        v23 = *(_QWORD *)(v12 + 208);
        do
        {
          v25 = *(_QWORD *)(v12 + 200);
          HalpTimerGetInternalData((KDPC *)v12, v10, v8, (PVOID)v2);
          v2 = (*(__int64(__fastcall **)(__int64))(v12 + 112))(v26);
          _InterlockedOr(v32, 0);
          v27 = *(_QWORD *)(v12 + 200);
        }
        while( v25 != v27 );
      }
      while( v23 != *(_QWORD *)(v12 + 208) );
      v28 = *(_DWORD *)(v12 + 220);
      v29 = v25 ^ v2;
      if( _bittest64((const __int64 *)&v29, (unsigned __int8)(v28 - 1)) )
      {
        if( v28 != 64 )
          v4 = (1i64 << v28) - 1;
        if( v28 != 64 )
          v5 = 1i64 << v28;
        v30 = v25 & v4;
        v24 = v2 | v25 ^ v30;
        if( v2 < v30 )
          v24 += v5;
        _InterlockedCompareExchange64((volatile signed __int64 *)(v12 + 200), v24, v27);
      }
      else
      {
        if( v28 == 64 )
          v31 = -1i64;
        else
          v31 = (1i64 << v28) - 1;
        v24 = v2 | v25 & ~v31;
      }
    }
    result = v23 + v24;
    *(_QWORD *)(v12 + 16) = v23 + v24;
  }
  return result;
}

Referenced by:

HalpAcpiPreSleep