EmonPauseProfiling

UINT64 __stdcall EmonPauseProfiling(){
  unsigned int v0; 
  UINT64 result; 
  __int64 v2; 
  unsigned int v3; 
  int *v4; 
  __int64 v5; 
  unsigned int v6; 
  UINT64 v7; 
  int *v8; 
  v0 = 0;
  result = (unsigned int)EmonNumberArchCounters;
  v2 = EmonCounterStatus + 16i64 * (unsigned int)(EmonNumberCounters * *((_DWORD *)KeGetPcr() + 105));
  if( EmonNumberArchCounters )
  {
    v3 = 390;
    v4 = (int *)v2;
    v0 = EmonNumberArchCounters;
    v5 = (unsigned int)EmonNumberArchCounters;
    do
    {
      if( *v4 < 2 )
      {
        result = __readmsr(v3) & 0xFFBFFFFF;
        __writemsr(v3, result);
      }
      ++v3;
      v4 += 4;
      --v5;
    }
    while( v5 );
  }
  if( (unsigned int)EmonVersion >= 2 )
  {
    v6 = EmonNumberCounters;
    v7 = __readmsr(0x38Fu);
    if( v0 < EmonNumberCounters )
    {
      v8 = (int *)(v2 + 16i64 * v0);
      do
      {
        if( *v8 < 2 )
          _bittestandreset64((__int64 *)&v7, v0 - EmonNumberArchCounters + 32);
        ++v0;
        v8 += 4;
      }
      while( v0 < v6 );
    }
    result = v7;
    __writemsr(0x38Fu, v7);
  }
  return result;
}

Referenced by:

No references.