how to detect run in "virtual" PC

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
User avatar
AUGE_OHR
Posts: 2117
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

how to detect run in "virtual" PC

Post by AUGE_OHR »

hi,

is there a Way to detect when run App in "virtual" Environment :?:

WMI e.g. will fail to detect Hardware ...
have fun
Jimmy
User avatar
vagblad
Posts: 174
Joined: Tue Jun 18, 2013 12:18 pm
DBs Used: MySQL,DBF
Location: Thessaloniki, Greece

Re: how to detect run in "virtual" PC

Post by vagblad »

Hi Jimmy,

Do you mean an environment like Oracle Vm Virtualbox or Vmware?
If that's the case then any hardware related function etc should report back with the hardware that the virtual machine is configured to run. For example i run a Windows 10 instance at home with 8gb ram configured, i am guessing thats the amount of memory it should report back, while my pc has 32gb in total.

Now to detect if its a "virtual" environment i am not sure how although WMI should be working properly
I will check tonight when i'll get back home to be sure and ill report back here.
Vagelis Prodromidis
Email: vagblad@gmail.com, Skype: vagblad
User avatar
AUGE_OHR
Posts: 2117
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: how to detect run in "virtual" PC

Post by AUGE_OHR »

vagblad wrote: Thu Sep 16, 2021 9:41 am Now to detect if its a "virtual" environment i am not sure how although WMI should be working properly
try this

Code: Select all

FUNCTION WMIService()
LOCAL oLocator
   IF oWMI == NIL
      oLocator := CreateObject( "wbemScripting.SwbemLocator" )
      oWMI := oLocator:ConnectServer()
   ENDIF
RETURN oWMI

Code: Select all

FUNCTION PhysicalMemoryInfo()
LOCAL oWmi, oMemory
LOCAL aitem   := {}, aProp := {}, bCollBlock, j, jMax, i, iMax, colItems, cLine
LOCAL cInfo   := "" 
LOCAL nSumRAM := 0, cFormFactor := "", cMemoryType := ""
LOCAL bError  := ERRORBLOCK( { | oErr | BREAK( oErr ) } )

   oWmi := WmiService()

   BEGIN SEQUENCE  // will crash in "virtual" PC
      FOR EACH oMemory IN oWmi:ExecQuery( "SELECT * FROM Win32_PhysicalMemory" )
         nSumRAM += VAL( oMemory:Capacity )
         
         cFormFactor := GetFormFaktorText( oMemory:FormFactor )
         cMemoryType := GetRAMtype( oMemory:SMBIOSMemoryType )
      NEXT
   END SEQUENCE
   ERRORBLOCK( bError )

   IF EMPTY( cMemoryType ) .OR. EMPTY( cFormFactor ) .OR. EMPTY( nSumRAM )
   ELSE
      cInfo += LTRIM( STR( INT( nSumRAM / 1024 / 1024 ) ) ) + " MB " + CRLF
      cInfo += "Memory  Type : " + cMemoryType + " " + cFormFactor
   ENDIF

RETURN cInfo

Code: Select all

FUNCTION GetFormFaktorText( nIn )
LOCAL aFT   := {}
LOCAL nPosi, cText

   AADD( aFT, { 00, "Unknown" } )
   AADD( aFT, { 01, "Other" } )
   AADD( aFT, { 02, "SiP" } )
   AADD( aFT, { 03, "DIP" } )
   AADD( aFT, { 04, "ZIP" } )
   AADD( aFT, { 05, "SOJ" } )
   AADD( aFT, { 06, "Proprietary" } )
   AADD( aFT, { 07, "SIMM" } )
   AADD( aFT, { 08, "DIMM" } )
   AADD( aFT, { 09, "TSOPO" } )
   AADD( aFT, { 10, "PGA" } )
   AADD( aFT, { 11, "RIM" } )
   AADD( aFT, { 12, "SODIMM" } )
   AADD( aFT, { 13, "SRIMM" } )
   AADD( aFT, { 14, "SMD" } )
   AADD( aFT, { 15, "SSMP" } )
   AADD( aFT, { 16, "QFP" } )
   AADD( aFT, { 17, "TQFP" } )
   AADD( aFT, { 18, "SOIC" } )
   AADD( aFT, { 19, "LCC" } )
   AADD( aFT, { 20, "PLCC" } )
   AADD( aFT, { 21, "FPGA" } )
   AADD( aFT, { 22, "LGA" } )

   IF VALTYPE( nIn ) = "C"
      nIn := VAL( nIn )
   ENDIF

   nPosi := ASCAN( aFT, { | e | e[ 1 ] = nIn } )
   IF nPosi > 0
      cText := aFT[ nPosi ] [ 2 ]
   ELSE
      cText := TRIM_NUMBER( nIn )
   ENDIF
RETURN cText

Code: Select all

FUNCTION GetRAMtype( nIn )
LOCAL aFT   := {}
LOCAL nPosi, cText

   AADD( aFT, { 00, "Unknown" } )
   AADD( aFT, { 01, "Other" } )
   AADD( aFT, { 02, "DRAM" } )
   AADD( aFT, { 03, "Synchronous DRAM" } )
   AADD( aFT, { 04, "Cache DRAM" } )
   AADD( aFT, { 05, "EDO" } )
   AADD( aFT, { 06, "EDRAM" } )
   AADD( aFT, { 07, "VRAM" } )
   AADD( aFT, { 08, "SRAM" } )
   AADD( aFT, { 09, "ROM" } )
   AADD( aFT, { 10, "ROM" } )
   AADD( aFT, { 11, "FLASH" } )
   AADD( aFT, { 12, "EEPROM" } )
   AADD( aFT, { 13, "FEPROM" } )
   AADD( aFT, { 14, "EPROM" } )
   AADD( aFT, { 15, "CDRAM" } )
   AADD( aFT, { 16, "3DRAM" } )
   AADD( aFT, { 17, "SDRAM" } )
   AADD( aFT, { 18, "SGRAM" } )
   AADD( aFT, { 19, "RDRAM" } )
   AADD( aFT, { 20, "DDR" } )
   AADD( aFT, { 21, "DDR2" } )
   AADD( aFT, { 22, "DDR2 FB-DIMM" } )

   AADD( aFT, { 24, "DDR3" } )
   AADD( aFT, { 25, "FBD2" } )
   AADD( aFT, { 26, "DDR4" } )

   IF VALTYPE( nIn ) = "C"
      nIn := VAL( nIn )
   ENDIF

   nPosi := ASCAN( aFT, { | e | e[ 1 ] = nIn } )
   IF nPosi > 0
      cText := aFT[ nPosi ] [ 2 ]
   ELSE
      cText := TRIM_NUMBER( nIn )
   ENDIF
RETURN cText
have fun
Jimmy
User avatar
AUGE_OHR
Posts: 2117
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: how to detect run in "virtual" PC

Post by AUGE_OHR »

hi,

have found out that WMI can help to identify "virtual" Environment

Code: Select all

WMIC BIOS GET SERIALNUMBER
WMIC COMPUTERSYSTEM GET MODEL
WMIC COMPUTERSYSTEM GET MANUFACTURER
i have "translate" it to HMG and run it under VirtualBox

Code: Select all

   IF cManufacturer = "innotek GmbH" .AND. ;
      cModel        = "VirtualBox"   .AND. ;
      cProduct      = "VirtualBox"
      lRet := .T.
   ENDIF

   MsgDebug(lRet,cManufacturer, cModel , cProduct,cSerialNumber )
please report what you get for other VM like Hyper-V or VM Player with this Source
ISVIRTUAL.ZIP
Function isVirtual() using WMI
(1015 Bytes) Downloaded 77 times
have fun
Jimmy
Post Reply