384384#include < psapi.h>
385385#include < shlwapi.h>
386386#include < shlobj_core.h>
387- #include < dshow.h>
388- #include < io.h>
389387#include < winspool.h>
390388#include < powerbase.h>
391389#include < setupapi.h>
392- #include < mmdeviceapi.h>
393- #include < Functiondiscoverykeys_devpkey.h>
394390#include < mmsystem.h>
395- #include < queue>
396391#include < dxgi.h>
397392#include < d3d9.h>
398393
@@ -3100,7 +3095,7 @@ struct VM {
31003095 key (brands::WINE, " HKLM\\ SOFTWARE\\ Wine" );
31013096
31023097 // Xen
3103- key (brands::KVM , " HKLM\\ SYSTEM\\ CurrentControlSet\\ Enum\\ PCI\\ VEN_5853*" );
3098+ key (brands::XEN , " HKLM\\ SYSTEM\\ CurrentControlSet\\ Enum\\ PCI\\ VEN_5853*" );
31043099 key (brands::XEN, " HKLM\\ HARDWARE\\ ACPI\\ DSDT\\ xen" );
31053100 key (brands::XEN, " HKLM\\ HARDWARE\\ ACPI\\ FADT\\ xen" );
31063101 key (brands::XEN, " HKLM\\ HARDWARE\\ ACPI\\ RSDT\\ xen" );
@@ -7336,6 +7331,7 @@ struct VM {
73367331 * @brief Check for specific GPU string signatures related to VMs
73377332 * @category Windows
73387333 * @author Requiem (https://github.com/NotRequiem)
7334+ * @author dmfrpro (https://github.com/dmfrpro) (VDD detection)
73397335 * @note utoshu did this with WMI in a removed technique (VM::GPU_CHIPTYPE)
73407336 * @implements VM::GPU_VM_STRING
73417337 */
@@ -7349,14 +7345,17 @@ struct VM {
73497345 size_t length;
73507346 };
73517347
7352- constexpr std::array<VMGpuInfo, 7 > vm_gpu_names = { {
7348+ constexpr std::array<VMGpuInfo, 10 > vm_gpu_names = { {
73537349 { L" VMware SVGA 3D" , brands::VMWARE, 14 },
73547350 { L" VirtualBox Graphics Adapter" , brands::VBOX, 27 },
73557351 { L" QXL GPU" , brands::KVM, 7 },
73567352 { L" VirGL 3D" , brands::QEMU, 8 },
73577353 { L" Microsoft Hyper-V Video" , brands::HYPERV, 23 },
73587354 { L" Parallels Display Adapter (WDDM)" , brands::PARALLELS, 32 },
7359- { L" Bochs Graphics Adapter" , brands::BOCHS, 22 }
7355+ { L" Bochs Graphics Adapter" , brands::BOCHS, 22 },
7356+ { L" Bochs Graphics Adapter" , brands::BOCHS, 22 },
7357+ { L" Virtual Display Driver" , brands::NULL_BRAND, 22 },
7358+ { L" IddSampleDriver Device" , brands::NULL_BRAND, 22 }
73607359 } };
73617360
73627361 DISPLAY_DEVICEW dd{};
@@ -7375,8 +7374,11 @@ struct VM {
73757374 const char * brand = entry.brand ;
73767375 const size_t len = entry.length ;
73777376#endif
7378- if (deviceStrLen == len && wcscmp (deviceStr, name) == 0 ) {
7379- return core::add (brand);;
7377+ if (deviceStrLen == len && wcscmp (deviceStr, name) == 0 ) {
7378+ char * castedName = (char *)calloc (len, sizeof (char ));
7379+ size_t ret = wcstombs (castedName, name, len);
7380+ castedName[ret] = ' \0 ' ;
7381+ return core::add (brand);
73807382 }
73817383 }
73827384
@@ -7675,7 +7677,7 @@ struct VM {
76757677 newParam.sched_priority = sched_get_priority_max (SCHED_FIFO);
76767678
76777679 if (sched_setscheduler (0 , SCHED_FIFO, &newParam) == -1 ) {
7678- hasSchedPriority = false ;
7680+ hasSchedPriority = false ;
76797681 }
76807682 }
76817683#endif
@@ -7946,7 +7948,7 @@ struct VM {
79467948 ? (tscCore2 - tscCore1)
79477949 : (tscCore1 - tscCore2);
79487950
7949- if (diff < tscSyncDiffThreshold) {
7951+ if (diff < tscSyncDiffThreshold) {
79507952 tscIssueCount++;
79517953 }
79527954 }
@@ -10773,8 +10775,6 @@ struct VM {
1077310775 // brand is "Azure Hyper-V" instead of just "Hyper-V". So what
1077410776 // this section does is "merge" the brands together to form
1077510777 // a more accurate idea of the brand(s) involved.
10776-
10777-
1077810778 merge (TMP_AZURE, TMP_HYPERV, TMP_AZURE);
1077910779 merge (TMP_AZURE, TMP_VPC, TMP_AZURE);
1078010780 merge (TMP_AZURE, TMP_HYPERV_VPC, TMP_AZURE);
@@ -11035,112 +11035,112 @@ struct VM {
1103511035 */
1103611036 [[nodiscard]] static std::string flag_to_string (const enum_flags flag) {
1103711037 switch (flag) {
11038- case VMID: return " VMID" ;
11039- case CPU_BRAND: return " CPU_BRAND" ;
11040- case HYPERVISOR_BIT: return " HYPERVISOR_BIT" ;
11041- case HYPERVISOR_STR: return " HYPERVISOR_STR" ;
11042- case TIMER: return " TIMER" ;
11043- case THREADCOUNT: return " THREADCOUNT" ;
11044- case MAC: return " MAC" ;
11045- case TEMPERATURE: return " TEMPERATURE" ;
11046- case SYSTEMD: return " SYSTEMD" ;
11047- case CVENDOR: return " CVENDOR" ;
11048- case CTYPE: return " CTYPE" ;
11049- case DOCKERENV: return " DOCKERENV" ;
11050- case DMIDECODE: return " DMIDECODE" ;
11051- case DMESG: return " DMESG" ;
11052- case HWMON: return " HWMON" ;
11053- case SIDT5: return " SIDT5" ;
11054- case DLL: return " DLL" ;
11055- case REGISTRY: return " REGISTRY" ;
11056- case VM_FILES: return " VM_FILES" ;
11057- case HWMODEL: return " HWMODEL" ;
11058- case DISK_SIZE: return " DISK_SIZE" ;
11059- case VBOX_DEFAULT: return " VBOX_DEFAULT" ;
11060- case VBOX_NETWORK: return " VBOX_NETWORK" ;
11061- case VM_PROCESSES: return " VM_PROCESSES" ;
11062- case LINUX_USER_HOST: return " LINUX_USER_HOST" ;
11063- case GAMARUE: return " GAMARUE" ;
11064- case BOCHS_CPU: return " BOCHS_CPU" ;
11065- case MSSMBIOS: return " MSSMBIOS" ;
11066- case MAC_MEMSIZE: return " MAC_MEMSIZE" ;
11067- case MAC_IOKIT: return " MAC_IOKIT" ;
11068- case IOREG_GREP: return " IOREG_GREP" ;
11069- case MAC_SIP: return " MAC_SIP" ;
11070- case HKLM_REGISTRIES: return " HKLM_REGISTRIES" ;
11071- case QEMU_GA: return " QEMU_GA" ;
11072- case VPC_INVALID: return " VPC_INVALID" ;
11073- case SIDT: return " SIDT" ;
11074- case SGDT: return " SGDT" ;
11075- case SLDT: return " SLDT" ;
11076- case OFFSEC_SIDT: return " OFFSEC_SIDT" ;
11077- case OFFSEC_SGDT: return " OFFSEC_SGDT" ;
11078- case OFFSEC_SLDT: return " OFFSEC_SLDT" ;
11079- case VPC_SIDT: return " VPC_SIDT" ;
11080- case VMWARE_IOMEM: return " VMWARE_IOMEM" ;
11081- case VMWARE_IOPORTS: return " VMWARE_IOPORTS" ;
11082- case VMWARE_SCSI: return " VMWARE_SCSI" ;
11083- case VMWARE_DMESG: return " VMWARE_DMESG" ;
11084- case VMWARE_STR: return " VMWARE_STR" ;
11085- case VMWARE_BACKDOOR: return " VMWARE_BACKDOOR" ;
11086- case VMWARE_PORT_MEM: return " VMWARE_PORT_MEM" ;
11087- case SMSW: return " SMSW" ;
11088- case MUTEX: return " MUTEX" ;
11089- case ODD_CPU_THREADS: return " ODD_CPU_THREADS" ;
11090- case INTEL_THREAD_MISMATCH: return " INTEL_THREAD_MISMATCH" ;
11091- case XEON_THREAD_MISMATCH: return " XEON_THREAD_MISMATCH" ;
11092- case NETTITUDE_VM_MEMORY: return " NETTITUDE_VM_MEMORY" ;
11093- case CUCKOO_DIR: return " CUCKOO_DIR" ;
11094- case CUCKOO_PIPE: return " CUCKOO_PIPE" ;
11095- case HYPERV_HOSTNAME: return " HYPERV_HOSTNAME" ;
11096- case GENERAL_HOSTNAME: return " GENERAL_HOSTNAME" ;
11097- case SCREEN_RESOLUTION: return " SCREEN_RESOLUTION" ;
11098- case DEVICE_STRING: return " DEVICE_STRING" ;
11099- case BLUESTACKS_FOLDERS: return " BLUESTACKS_FOLDERS" ;
11100- case CPUID_SIGNATURE: return " CPUID_SIGNATURE" ;
11101- case KVM_BITMASK: return " KVM_BITMASK" ;
11102- case KGT_SIGNATURE: return " KGT_SIGNATURE" ;
11103- case QEMU_VIRTUAL_DMI: return " QEMU_VIRTUAL_DMI" ;
11104- case QEMU_USB: return " QEMU_USB" ;
11105- case HYPERVISOR_DIR: return " HYPERVISOR_DIR" ;
11106- case UML_CPU: return " UML_CPU" ;
11107- case KMSG: return " KMSG" ;
11108- case VM_PROCS: return " VM_PROCS" ;
11109- case VBOX_MODULE: return " VBOX_MODULE" ;
11110- case SYSINFO_PROC: return " SYSINFO_PROC" ;
11111- case DEVICE_TREE: return " DEVICE_TREE" ;
11112- case DMI_SCAN: return " DMI_SCAN" ;
11113- case SMBIOS_VM_BIT: return " SMBIOS_VM_BIT" ;
11114- case PODMAN_FILE: return " PODMAN_FILE" ;
11115- case WSL_PROC: return " WSL_PROC" ;
11116- case DRIVER_NAMES: return " DRIVER_NAMES" ;
11117- case VM_SIDT: return " VM_SIDT" ;
11118- case HDD_SERIAL: return " HDD_SERIAL" ;
11119- case PORT_CONNECTORS: return " PORT_CONNECTORS" ;
11120- case GPU_VM_STRINGS: return " GPU_STRINGS" ;
11121- case GPU_CAPABILITIES: return " GPU_CAPABILITIES" ;
11122- case VM_DEVICES: return " VM_DEVICES" ;
11123- case PROCESSOR_NUMBER: return " PROCESSOR_NUMBER" ;
11124- case NUMBER_OF_CORES: return " NUMBER_OF_CORES" ;
11125- case ACPI_TEMPERATURE: return " ACPI_TEMPERATURE" ;
11126- case SYS_QEMU: return " SYS_QEMU" ;
11127- case LSHW_QEMU: return " LSHW_QEMU" ;
11128- case VIRTUAL_PROCESSORS: return " VIRTUAL_PROCESSORS" ;
11129- case HYPERV_QUERY: return " HYPERV_QUERY" ;
11130- case BAD_POOLS: return " BAD_POOLS" ;
11131- case AMD_SEV: return " AMD_SEV" ;
11132- case AMD_THREAD_MISMATCH: return " AMD_THREAD_MISMATCH" ;
11133- case NATIVE_VHD: return " NATIVE_VHD" ;
11134- case VIRTUAL_REGISTRY: return " VIRTUAL_REGISTRY" ;
11135- case FIRMWARE: return " FIRMWARE" ;
11136- case FILE_ACCESS_HISTORY: return " FILE_ACCESS_HISTORY" ;
11137- case AUDIO: return " AUDIO" ;
11138- case UNKNOWN_MANUFACTURER: return " UNKNOWN_MANUFACTURER" ;
11139- case OSXSAVE: return " OSXSAVE" ;
11140- case NSJAIL_PID: return " NSJAIL_PID" ;
11141- case PCI_VM: return " PCI_VM" ;
11142- // ADD NEW CASE HERE FOR NEW TECHNIQUE
11143- default : return " Unknown flag" ;
11038+ case VMID: return " VMID" ;
11039+ case CPU_BRAND: return " CPU_BRAND" ;
11040+ case HYPERVISOR_BIT: return " HYPERVISOR_BIT" ;
11041+ case HYPERVISOR_STR: return " HYPERVISOR_STR" ;
11042+ case TIMER: return " TIMER" ;
11043+ case THREADCOUNT: return " THREADCOUNT" ;
11044+ case MAC: return " MAC" ;
11045+ case TEMPERATURE: return " TEMPERATURE" ;
11046+ case SYSTEMD: return " SYSTEMD" ;
11047+ case CVENDOR: return " CVENDOR" ;
11048+ case CTYPE: return " CTYPE" ;
11049+ case DOCKERENV: return " DOCKERENV" ;
11050+ case DMIDECODE: return " DMIDECODE" ;
11051+ case DMESG: return " DMESG" ;
11052+ case HWMON: return " HWMON" ;
11053+ case SIDT5: return " SIDT5" ;
11054+ case DLL: return " DLL" ;
11055+ case REGISTRY: return " REGISTRY" ;
11056+ case VM_FILES: return " VM_FILES" ;
11057+ case HWMODEL: return " HWMODEL" ;
11058+ case DISK_SIZE: return " DISK_SIZE" ;
11059+ case VBOX_DEFAULT: return " VBOX_DEFAULT" ;
11060+ case VBOX_NETWORK: return " VBOX_NETWORK" ;
11061+ case VM_PROCESSES: return " VM_PROCESSES" ;
11062+ case LINUX_USER_HOST: return " LINUX_USER_HOST" ;
11063+ case GAMARUE: return " GAMARUE" ;
11064+ case BOCHS_CPU: return " BOCHS_CPU" ;
11065+ case MSSMBIOS: return " MSSMBIOS" ;
11066+ case MAC_MEMSIZE: return " MAC_MEMSIZE" ;
11067+ case MAC_IOKIT: return " MAC_IOKIT" ;
11068+ case IOREG_GREP: return " IOREG_GREP" ;
11069+ case MAC_SIP: return " MAC_SIP" ;
11070+ case HKLM_REGISTRIES: return " HKLM_REGISTRIES" ;
11071+ case QEMU_GA: return " QEMU_GA" ;
11072+ case VPC_INVALID: return " VPC_INVALID" ;
11073+ case SIDT: return " SIDT" ;
11074+ case SGDT: return " SGDT" ;
11075+ case SLDT: return " SLDT" ;
11076+ case OFFSEC_SIDT: return " OFFSEC_SIDT" ;
11077+ case OFFSEC_SGDT: return " OFFSEC_SGDT" ;
11078+ case OFFSEC_SLDT: return " OFFSEC_SLDT" ;
11079+ case VPC_SIDT: return " VPC_SIDT" ;
11080+ case VMWARE_IOMEM: return " VMWARE_IOMEM" ;
11081+ case VMWARE_IOPORTS: return " VMWARE_IOPORTS" ;
11082+ case VMWARE_SCSI: return " VMWARE_SCSI" ;
11083+ case VMWARE_DMESG: return " VMWARE_DMESG" ;
11084+ case VMWARE_STR: return " VMWARE_STR" ;
11085+ case VMWARE_BACKDOOR: return " VMWARE_BACKDOOR" ;
11086+ case VMWARE_PORT_MEM: return " VMWARE_PORT_MEM" ;
11087+ case SMSW: return " SMSW" ;
11088+ case MUTEX: return " MUTEX" ;
11089+ case ODD_CPU_THREADS: return " ODD_CPU_THREADS" ;
11090+ case INTEL_THREAD_MISMATCH: return " INTEL_THREAD_MISMATCH" ;
11091+ case XEON_THREAD_MISMATCH: return " XEON_THREAD_MISMATCH" ;
11092+ case NETTITUDE_VM_MEMORY: return " NETTITUDE_VM_MEMORY" ;
11093+ case CUCKOO_DIR: return " CUCKOO_DIR" ;
11094+ case CUCKOO_PIPE: return " CUCKOO_PIPE" ;
11095+ case HYPERV_HOSTNAME: return " HYPERV_HOSTNAME" ;
11096+ case GENERAL_HOSTNAME: return " GENERAL_HOSTNAME" ;
11097+ case SCREEN_RESOLUTION: return " SCREEN_RESOLUTION" ;
11098+ case DEVICE_STRING: return " DEVICE_STRING" ;
11099+ case BLUESTACKS_FOLDERS: return " BLUESTACKS_FOLDERS" ;
11100+ case CPUID_SIGNATURE: return " CPUID_SIGNATURE" ;
11101+ case KVM_BITMASK: return " KVM_BITMASK" ;
11102+ case KGT_SIGNATURE: return " KGT_SIGNATURE" ;
11103+ case QEMU_VIRTUAL_DMI: return " QEMU_VIRTUAL_DMI" ;
11104+ case QEMU_USB: return " QEMU_USB" ;
11105+ case HYPERVISOR_DIR: return " HYPERVISOR_DIR" ;
11106+ case UML_CPU: return " UML_CPU" ;
11107+ case KMSG: return " KMSG" ;
11108+ case VM_PROCS: return " VM_PROCS" ;
11109+ case VBOX_MODULE: return " VBOX_MODULE" ;
11110+ case SYSINFO_PROC: return " SYSINFO_PROC" ;
11111+ case DEVICE_TREE: return " DEVICE_TREE" ;
11112+ case DMI_SCAN: return " DMI_SCAN" ;
11113+ case SMBIOS_VM_BIT: return " SMBIOS_VM_BIT" ;
11114+ case PODMAN_FILE: return " PODMAN_FILE" ;
11115+ case WSL_PROC: return " WSL_PROC" ;
11116+ case DRIVER_NAMES: return " DRIVER_NAMES" ;
11117+ case VM_SIDT: return " VM_SIDT" ;
11118+ case HDD_SERIAL: return " HDD_SERIAL" ;
11119+ case PORT_CONNECTORS: return " PORT_CONNECTORS" ;
11120+ case GPU_VM_STRINGS: return " GPU_STRINGS" ;
11121+ case GPU_CAPABILITIES: return " GPU_CAPABILITIES" ;
11122+ case VM_DEVICES: return " VM_DEVICES" ;
11123+ case PROCESSOR_NUMBER: return " PROCESSOR_NUMBER" ;
11124+ case NUMBER_OF_CORES: return " NUMBER_OF_CORES" ;
11125+ case ACPI_TEMPERATURE: return " ACPI_TEMPERATURE" ;
11126+ case SYS_QEMU: return " SYS_QEMU" ;
11127+ case LSHW_QEMU: return " LSHW_QEMU" ;
11128+ case VIRTUAL_PROCESSORS: return " VIRTUAL_PROCESSORS" ;
11129+ case HYPERV_QUERY: return " HYPERV_QUERY" ;
11130+ case BAD_POOLS: return " BAD_POOLS" ;
11131+ case AMD_SEV: return " AMD_SEV" ;
11132+ case AMD_THREAD_MISMATCH: return " AMD_THREAD_MISMATCH" ;
11133+ case NATIVE_VHD: return " NATIVE_VHD" ;
11134+ case VIRTUAL_REGISTRY: return " VIRTUAL_REGISTRY" ;
11135+ case FIRMWARE: return " FIRMWARE" ;
11136+ case FILE_ACCESS_HISTORY: return " FILE_ACCESS_HISTORY" ;
11137+ case AUDIO: return " AUDIO" ;
11138+ case UNKNOWN_MANUFACTURER: return " UNKNOWN_MANUFACTURER" ;
11139+ case OSXSAVE: return " OSXSAVE" ;
11140+ case NSJAIL_PID: return " NSJAIL_PID" ;
11141+ case PCI_VM: return " PCI_VM" ;
11142+ // ADD NEW CASE HERE FOR NEW TECHNIQUE
11143+ default : return " Unknown flag" ;
1114411144 }
1114511145 }
1114611146
0 commit comments