Как определить, запущено ли приложение из-под виртуальной машины?

Именно такой вопрос сегодня встал передо мной. Google говорит, что информации много. Стал смотреть.

Первое, что попалось, было это(EN). Статья на сайте хорошая, приложение из комплекта даже работает, если его просто запустить, да и мне кажется, что это наиболее правильный метод определения, но к сожалению… После добавления библиотеки мое приложение перестало работать нормально и вылетало с ошибкой «не является приложением Win32» (Could not load file or assembly ‘VmDetectLibrary.dll’ or one of its dependencies.  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1))

Ошибка времени выполнения

Оказывается, что эта ошибка связана с тем, что проект запускается на Windows 8 x64. Ну не работает этот код под x64 совсем, даже если пересобрать Dll.

Далее, так как мне в первую очередь нужна vmware, нахожу статью в их базе знаний

Как я ни пытался, пример их кода:

Мне так и не удалось запустить. Не находило функцию cpuid и сбоило в условии, не видя слово bit. На MSDN нашел описание подобной функции, но она принимала другие параметры. В Википедии есть похожая реализация, но она мне не понравилась. Код, который написан на чистом си так и не запустился (тоже ошибка компиляции). Так я и оставил эту статью.

Нашел ответ на StackOverflow.com. Там дается несколько кодов, для определения vmware и Virtual PC. Взял один из них и сделал библиотечку, которую можно скачать тут Метод взят такой:

Для работы требуется сборка System.Management.

Так же я написал тестовое приложение для проверки работы DLL. Скачать можно тут. Так же есть проект для Visual Studio 2012

Код самого приложения простой (консольное приложение):

Получается, что мы подгружаем DLL (в References) и прописываем using, а дальше обращаемся к методу внутри нее, который возвращает true, если приложение запущено в виртуальной машине, и false в любом другом случае. (если это неизвестная виртуальная машина или хост например)

Запуск на моем хосте:

Приложение запушено на реальной машине, Windows 8

Запуск на виртуальной машине vmware workstation 9 (Windows XP Professional как гостевая ОС)

Примечания:

Добавить комментарий