взято с саппорта майкрософта и допилено парой строчек.
Код:
#include <setupapi.h>
iint IsVirtualBox()
{
int lResult=0;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
hDevInfo = SetupDiGetClassDevs(NULL,0,0,DIGCF_PRESENT | DIGCF_ALLCLASSES);
if (hDevInfo==INVALID_HANDLE_VALUE) return 0;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_FRIENDLYNAME,&DataT,(PBYTE)buffer,buffersize,&buffersize))
{
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
if (buffer) LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize * 2);
}
else
{
break;
}
}
if(!lstrcmp(buffer,L"VBOX HARDDISK")) lResult=1;
if (buffer) LocalFree(buffer);
if(lResult) break;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return lResult;
}
void _WinMainCRTStartup()
{
if(IsVirtualBox()) MessageBox(0,L"VirtualBox detected",0,0);
}
ещё один, менее надёжный пример. так мне кажется, ибо убив процесс VBoxService.exe - виртуалка продолжила работу как ни в чём не бывало.
Код:
int AntiVirtualBox()
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
DWORD PID = 0, PPID = 0, expPID = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(Process32First(hSnapshot, &pe32))
{
while(Process32Next(hSnapshot, &pe32))
{
if(!lstrcmp(pe32.szExeFile, L"VBoxService.exe")) return 1;
}
CloseHandle(hSnapshot);
}
return 0;
}