не удалось получить ожидаемые результаты в версии GCC для VC ++ - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно преобразовать код обнаружения vm, написанный на g cc, в vc ++

вот код

static inline unsigned long long rdtsc_diff_vmexit() {
unsigned long long ret, ret2;
unsigned eax, edx;
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret  = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
/* vm exit forced here. it uses: eax = 0; cpuid; */
__asm__ volatile("cpuid" : /* no output */ : "a"(0x00));
/**/
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret2  = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
return ret2 - ret;}

Я нашел пример того, как сделать то же самое в vc ++, как показано ниже

BOOL rdtsc_diff_vmexit(){
ULONGLONG tsc1 = 0;


ULONGLONG tsc2 = 0;
ULONGLONG avg = 0;
INT cpuInfo[4] = {};

// Try this 10 times in case of small fluctuations
for (INT i = 0; i < 10; i++)
{
    tsc1 = __rdtsc();
    __cpuid(cpuInfo, 0);
    tsc2 = __rdtsc();

    // Get the delta of the two RDTSC
    avg += (tsc2 - tsc1);
}

// We repeated the process 10 times so we make sure our check is as much reliable as we can
avg = avg / 10;
return (avg < 1000 && avg > 0) ? FALSE : TRUE;}

, но проблема в том, что версия G CC возвращает true, если запускается в виртуальном окне, а vc ++ возвращает false, не могли бы вы сообщить мне, что не так. Хотите знать, можно ли переписать asm-код g cc для VC ++?

...