Этот код относится к конкретным функциям Microsoft __try
и __except
. Другого способа решения этого не существует, так как выполнение инструкции IN
в режиме пользовательского режима в Windows обычно прерывается. В VMWare любая такая операция перехватывается VMWare VMM (Virtual Machine Monitor, иногда также называемым Hypervisor). Затем он проверяет специальные значения в некоторых регистрах и «принимает» инструкцию с новым значением в ebx
, чтобы указать, что «Да, я - система VMWare».Если вы запустите это на простой старой системе Windows, он получит общую защиту, чтобы попытаться использовать IO-порт, недоступный для приложения [в общем случае, порты ввода-вывода недоступны для приложения пользовательского режима код].
Вам необходимо скомпилировать это с помощью компилятора Microsoft (и с подходящим флажком «Включить обработку исключений» - извините, не помню, что это за флаг, но он скажет вам, не ошибается ли это) , GCC не поддерживает эту функцию.
Однако вы можете протестировать VMWare, используя инструкцию CPUID, вместо использования IN
. Это будет работать намного лучше в компиляторе GCC, так как это не вызовет ошибки процессора, если нет присутствия VM [Для педантов: до тех пор, пока процессор будет позже, чем версия 486 с 1990-х годов). Вместо этого он просто не даст правильные значения в регистрах (без изменения значений регистра). Возможно, вам понадобится написать встроенную функцию ассемблера , но это не должно быть слишком сложно для google.
Смотрите эту KB-статья на сайте VMwares: http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458
В качестве альтернативы, если вы действительно настаиваете на использование Windows, структурированной обработки исключений, вы можете сделать это самостоятельно:
push handler // Save address of your handler.
push fs:[0] // Save address of any previous handler
mov fs:[0], esp // Save pointer to current exception record.
... // all the stuff setting registers, doing IN, etc.
jmp cleanup
handler:
mov [rc], 0 // Set "rc= false".
cleanup:
pop fs:[0]
add esp, 4 // Remove handler
(Примечание, я просто написал, что из-за немного googling - это долгое время, так как я использовал что-то подобное в Windows, поэтому он может не работать)
Какой у вас компилятор? Поскольку эти «ключевые слова» являются [расширением] (http://msdn.microsoft.com/en-us/library/zazxh1a9.aspx) строк компиляторов C на Visual C++, никакой другой компилятор, о котором я знаю, их не знаю. Также обратите внимание, что они являются расширениями языка программирования ** C ** и не предназначены для использования в программах на C++. –
Это неопределенное сообщение означает, что ваш компилятор считает, что __try является переменной, и вы ее не объявляли. Я не эксперт в области C++, но не стоит пытаться просто «попробовать» вместо «__try»? Не знаю, как это исправить, но может указать вам в правильном направлении. – caiocpricci2
это означает «первое использование в этой функции» – fuenfundachtzig