Page 1 of 1

how to detect run in "virtual" PC

Posted: Thu Sep 16, 2021 8:33 am
by AUGE_OHR
hi,

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

WMI e.g. will fail to detect Hardware ...

Re: how to detect run in "virtual" PC

Posted: Thu Sep 16, 2021 9:41 am
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.

Re: how to detect run in "virtual" PC

Posted: Thu Sep 16, 2021 8:08 pm
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

Re: how to detect run in "virtual" PC

Posted: Sat Sep 18, 2021 5:38 am
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