2024-09-07 20:53:46 +10:00
< ? php
/**
* WINNT System Class
*
* PHP version 5
*
* @ category PHP
* @ package PSI WINNT OS class
* @ author Michael Cramer < BigMichi1 @ users . sourceforge . net >
* @ copyright 2009 phpSysInfo
2025-05-14 16:14:01 +01:00
* @ license http :// opensource . org / licenses / gpl - 2.0 . php GNU General Public License version 2 , or ( at your option ) any later version
2024-09-07 20:53:46 +10:00
* @ version SVN : $Id : class . WINNT . inc . php 699 2012 - 09 - 15 11 : 57 : 13 Z namiltd $
* @ link http :// phpsysinfo . sourceforge . net
*/
/**
* WINNT sysinfo class
* get all the required information from WINNT systems
* information are retrieved through the WMI interface
*
* @ category PHP
* @ package PSI WINNT OS class
* @ author Michael Cramer < BigMichi1 @ users . sourceforge . net >
* @ copyright 2009 phpSysInfo
2025-05-14 16:14:01 +01:00
* @ license http :// opensource . org / licenses / gpl - 2.0 . php GNU General Public License version 2 , or ( at your option ) any later version
2024-09-07 20:53:46 +10:00
* @ version Release : 3.0
* @ link http :// phpsysinfo . sourceforge . net
*/
class WINNT extends OS
{
/**
2025-05-14 16:14:01 +01:00
* holds codepage for chcp
*
* @ var int
*/
private static $_cp = null ;
/**
* holds the data from WMI Win32_OperatingSystem
*
* @ var array
*/
private static $_Win32_OperatingSystem = null ;
/**
* holds the data from WMI Win32_ComputerSystem
*
* @ var array
*/
private $_Win32_ComputerSystem = null ;
/**
* holds the data from WMI Win32_Processor
*
* @ var array
*/
private static $_Win32_Processor = null ;
/**
* holds the data from WMI Win32_PhysicalMemory
*
* @ var array
*/
private static $_Win32_PhysicalMemory = null ;
/**
* holds the data from WMI Win32_PerfFormattedData_PerfOS_Processor
*
* @ var array
*/
private $_Win32_PerfFormattedData_PerfOS_Processor = null ;
/**
* holds the data from systeminfo command
*
* @ var string
*/
private $_systeminfo = null ;
/**
* holds the COM object that we pull WMI root\CIMv2 data from
*
* @ var Object
*/
private static $_wmi = null ;
/**
* holds the COM object that we pull all the EnumKey and RegRead data from
2024-09-07 20:53:46 +10:00
*
* @ var Object
*/
2025-05-14 16:14:01 +01:00
private $_reg = null ;
/**
* holds result of 'cmd /c ver'
*
* @ var string
*/
private $_ver = " " ;
/**
* holds system manufacturer
*
* @ var string
*/
private $_Manufacturer = " " ;
/**
* holds system model
*
* @ var string
*/
private $_Model = " " ;
2024-09-07 20:53:46 +10:00
/**
* holds all devices , which are in the system
*
* @ var array
*/
2025-05-14 16:14:01 +01:00
private $_wmidevices = null ;
/**
* holds all disks , which are in the system
*
* @ var array
*/
private $_wmidisks = array ();
2024-09-07 20:53:46 +10:00
/**
* store language encoding of the system to convert some output to utf - 8
*
* @ var string
*/
private $_codepage = null ;
/**
* store language of the system
*
* @ var string
*/
private $_syslang = null ;
/**
2025-05-14 16:14:01 +01:00
* value of checking run as administrator
*
* @ var boolean
*/
private static $_asadmin = null ;
/**
* returns codepage for chcp
*
* @ return int
*/
public static function getcp ()
{
return self :: $_cp ;
}
/**
* returns the COM object that we pull WMI root\CIMv2 data from
*
* @ return Object
*/
public static function getcimv2wmi ()
{
return self :: $_wmi ;
}
/**
* reads the data from WMI Win32_OperatingSystem
*
* @ return array
*/
public static function _get_Win32_OperatingSystem ()
{
if ( self :: $_Win32_OperatingSystem === null ) self :: $_Win32_OperatingSystem = self :: getWMI ( self :: $_wmi , 'Win32_OperatingSystem' , array ( 'CodeSet' , 'Locale' , 'LastBootUpTime' , 'LocalDateTime' , 'Version' , 'ServicePackMajorVersion' , 'Caption' , 'TotalVisibleMemorySize' , 'FreePhysicalMemory' ));
return self :: $_Win32_OperatingSystem ;
}
/**
* reads the data from WMI Win32_ComputerSystem
*
* @ return array
*/
private function _get_Win32_ComputerSystem ()
{
if ( $this -> _Win32_ComputerSystem === null ) $this -> _Win32_ComputerSystem = self :: getWMI ( self :: $_wmi , 'Win32_ComputerSystem' , array ( 'Name' , 'Manufacturer' , 'Model' , 'SystemFamily' ));
return $this -> _Win32_ComputerSystem ;
}
/**
* reads the data from WMI Win32_Processor
*
* @ return array
*/
public static function _get_Win32_Processor ()
{
if ( self :: $_Win32_Processor === null ) self :: $_Win32_Processor = self :: getWMI ( self :: $_wmi , 'Win32_Processor' , array ( 'DeviceID' , 'LoadPercentage' , 'AddressWidth' , 'Name' , 'L2CacheSize' , 'L3CacheSize' , 'CurrentClockSpeed' , 'ExtClock' , 'NumberOfCores' , 'NumberOfLogicalProcessors' , 'MaxClockSpeed' , 'Manufacturer' , 'Architecture' , 'Caption' , 'CurrentVoltage' ));
return self :: $_Win32_Processor ;
}
/**
* reads the data from WMI Win32_PhysicalMemory
*
* @ return array
*/
public static function _get_Win32_PhysicalMemory ()
{
if ( self :: $_Win32_PhysicalMemory === null ) self :: $_Win32_PhysicalMemory = self :: getWMI ( self :: $_wmi , 'Win32_PhysicalMemory' , array ( 'PartNumber' , 'DeviceLocator' , 'Capacity' , 'Manufacturer' , 'SerialNumber' , 'Speed' , 'ConfiguredClockSpeed' , 'ConfiguredVoltage' , 'MemoryType' , 'SMBIOSMemoryType' , 'FormFactor' , 'DataWidth' , 'TotalWidth' , 'BankLabel' , 'MinVoltage' , 'MaxVoltage' ));
return self :: $_Win32_PhysicalMemory ;
}
/**
* reads the data from WMI Win32_PerfFormattedData_PerfOS_Processor
*
* @ return array
*/
private function _get_Win32_PerfFormattedData_PerfOS_Processor ()
{
if ( $this -> _Win32_PerfFormattedData_PerfOS_Processor === null ) {
$this -> _Win32_PerfFormattedData_PerfOS_Processor = array ();
$buffer = $this -> _get_Win32_OperatingSystem ();
if ( $buffer && isset ( $buffer [ 0 ]) && isset ( $buffer [ 0 ][ 'Version' ]) && version_compare ( $buffer [ 0 ][ 'Version' ], " 5.1 " , " >= " )) { // minimal windows 2003 or windows XP
$cpubuffer = self :: getWMI ( self :: $_wmi , 'Win32_PerfFormattedData_PerfOS_Processor' , array ( 'Name' , 'PercentProcessorTime' ));
foreach ( $cpubuffer as $cpu ) {
if ( isset ( $cpu [ 'Name' ]) && isset ( $cpu [ 'PercentProcessorTime' ])) {
$this -> _Win32_PerfFormattedData_PerfOS_Processor [ 'cpu' . $cpu [ 'Name' ]] = $cpu [ 'PercentProcessorTime' ];
}
}
}
}
return $this -> _Win32_PerfFormattedData_PerfOS_Processor ;
}
/**
* reads the data from systeminfo
*
* @ return string
*/
private function _get_systeminfo ()
{
if ( ! defined ( 'PSI_EMU_HOSTNAME' )) {
if ( $this -> _systeminfo === null ) CommonFunctions :: executeProgram ( 'systeminfo' , '' , $this -> _systeminfo , false );
return $this -> _systeminfo ;
} else {
return '' ;
}
}
/**
* checks WINNT and 'run as Administrator' mode
*
* @ return boolean
*/
public static function isAdmin ()
{
if ( self :: $_asadmin == null ) {
if ( PSI_OS == 'WINNT' ) {
$strBuf = '' ;
CommonFunctions :: executeProgram ( 'sfc' , '2>&1' , $strBuf , false ); // 'net session' for detection does not work if "Server" (LanmanServer) service is stopped
if ( preg_match ( '/^\/SCANNOW\s/m' , preg_replace ( '/(\x00)/' , '' , $strBuf ))) { // SCANNOW checking - also if Unicode
self :: $_asadmin = true ;
} else {
self :: $_asadmin = false ;
}
} else {
self :: $_asadmin = false ;
}
}
return self :: $_asadmin ;
}
/**
* function for getting a list of values in the specified context
* optionally filter this list , based on the list from third parameter
*
* @ param $wmi object holds the COM object that we pull the WMI data from
* @ param string $strClass name of the class where the values are stored
* @ param array $strValue filter out only needed values , if not set all values of the class are returned
*
* @ return array content of the class stored in an array
*/
public static function getWMI ( $wmi , $strClass , $strValue = array ())
{
$arrData = array ();
if ( gettype ( $wmi ) === " object " ) {
$value = " " ;
try {
$objWEBM = $wmi -> Get ( $strClass );
$arrProp = $objWEBM -> Properties_ ;
$arrWEBMCol = $objWEBM -> Instances_ ();
foreach ( $arrWEBMCol as $objItem ) {
if ( is_array ( $arrProp )) {
reset ( $arrProp );
}
$arrInstance = array ();
foreach ( $arrProp as $propItem ) {
$value = $objItem -> { $propItem -> Name }; //instead exploitable eval("\$value = \$objItem->".$propItem->Name.";");
if ( empty ( $strValue )) {
if ( is_string ( $value )) $arrInstance [ $propItem -> Name ] = trim ( $value );
else $arrInstance [ $propItem -> Name ] = $value ;
} else {
if ( in_array ( $propItem -> Name , $strValue )) {
if ( is_string ( $value )) $arrInstance [ $propItem -> Name ] = trim ( $value );
else $arrInstance [ $propItem -> Name ] = $value ;
}
}
}
$arrData [] = $arrInstance ;
}
} catch ( Exception $e ) {
if ( PSI_DEBUG && (( $message = trim ( $e -> getMessage ())) !== " <b>Source:</b> SWbemServicesEx<br/><b>Description:</b> Not found " )) {
$error = PSI_Error :: singleton ();
$error -> addError ( " getWMI() " , preg_replace ( '/<br\/>/' , " \n " , preg_replace ( '/<b>|<\/b>/' , '' , $message )));
}
}
} elseif (( gettype ( $wmi ) === " string " ) && ( PSI_OS == 'Linux' )) {
$delimeter = '@@@DELIM@@@' ;
if ( CommonFunctions :: executeProgram ( 'wmic' , '--delimiter="' . $delimeter . '" ' . $wmi . ' ' . $strClass . '" 2>/dev/null' , $strBuf , true ) && preg_match ( " /^CLASS: \ s/ " , $strBuf )) {
if ( self :: $_cp ) {
if ( self :: $_cp == 932 ) {
$codename = ' (SJIS)' ;
} elseif ( self :: $_cp == 949 ) {
$codename = ' (EUC-KR)' ;
} elseif ( self :: $_cp == 950 ) {
$codename = ' (BIG-5)' ;
} else {
$codename = '' ;
}
self :: convertCP ( $strBuf , 'windows-' . self :: $_cp . $codename );
}
$lines = preg_split ( '/\n/' , $strBuf , - 1 , PREG_SPLIT_NO_EMPTY );
if ( count ( $lines ) >= 3 ) {
unset ( $lines [ 0 ]);
$names = preg_split ( '/' . $delimeter . '/' , $lines [ 1 ], - 1 , PREG_SPLIT_NO_EMPTY );
$namesc = count ( $names );
unset ( $lines [ 1 ]);
foreach ( $lines as $line ) {
$arrInstance = array ();
$values = preg_split ( '/' . $delimeter . '/' , $line , - 1 );
if ( count ( $values ) == $namesc ) {
foreach ( $values as $id => $value ) {
if ( empty ( $strValue )) {
if ( $value !== " (null) " ) $arrInstance [ $names [ $id ]] = trim ( $value );
else $arrInstance [ $names [ $id ]] = null ;
} else {
if ( in_array ( $names [ $id ], $strValue )) {
if ( $value !== " (null) " ) $arrInstance [ $names [ $id ]] = trim ( $value );
else $arrInstance [ $names [ $id ]] = null ;
}
}
}
$arrData [] = $arrInstance ;
}
}
}
}
}
return $arrData ;
}
/**
* readReg function
*
* @ return boolean command successfull or not
*/
public static function readReg ( $reg , $strName , & $strBuffer , $booErrorRep = true , $dword = false , $bits64 = false )
{
$strBuffer = '' ;
if ( $reg === false ) {
if ( defined ( 'PSI_EMU_HOSTNAME' )) {
return false ;
}
$last = strrpos ( $strName , " \\ " );
$keyname = substr ( $strName , $last + 1 );
if ( $bits64 ) {
$param = ' /reg:64' ;
} else {
$param = '' ;
}
if ( $dword ) {
$valtype = " DWORD " ;
} else {
$valtype = " SZ|EXPAND_SZ " ;
}
if ( self :: $_cp ) {
if ( CommonFunctions :: executeProgram ( 'cmd' , '/c chcp ' . self :: $_cp . ' >nul & reg query "' . substr ( $strName , 0 , $last ) . '" /v ' . $keyname . $param . ' 2>&1' , $strBuf , $booErrorRep ) && ( strlen ( $strBuf ) > 0 ) && preg_match ( " /^ \ s* " . $keyname . " \ s+REG_( " . $valtype . " ) \ s+(.+) \ s* $ /mi " , $strBuf , $buffer2 )) {
if ( $dword ) {
$strBuffer = strval ( hexdec ( $buffer2 [ 2 ]));
} else {
$strBuffer = $buffer2 [ 2 ];
}
} else {
return false ;
}
} else {
if ( CommonFunctions :: executeProgram ( 'reg' , 'query "' . substr ( $strName , 0 , $last ) . '" /v ' . $keyname . $param . ' 2>&1' , $strBuf , $booErrorRep ) && ( strlen ( $strBuf ) > 0 ) && preg_match ( " /^ \ s* " . $keyname . " \ s+REG_( " . $valtype . " ) \ s+(.+) \ s* $ /mi " , $strBuf , $buffer2 )) {
if ( $dword ) {
$strBuffer = strval ( hexdec ( $buffer2 [ 2 ]));
} else {
$strBuffer = $buffer2 [ 2 ];
}
} else {
return false ;
}
}
} elseif ( gettype ( $reg ) === " object " ) {
$_hkey = array ( 'HKEY_CLASSES_ROOT' => 0x80000000 , 'HKEY_CURRENT_USER' => 0x80000001 , 'HKEY_LOCAL_MACHINE' => 0x80000002 , 'HKEY_USERS' => 0x80000003 , 'HKEY_PERFORMANCE_DATA' => 0x80000004 , 'HKEY_PERFORMANCE_TEXT' => 0x80000050 , 'HKEY_PERFORMANCE_NLSTEXT' => 0x80000060 , 'HKEY_CURRENT_CONFIG' => 0x80000005 , 'HKEY_DYN_DATA' => 0x80000006 );
$first = strpos ( $strName , " \\ " );
$last = strrpos ( $strName , " \\ " );
$hkey = substr ( $strName , 0 , $first );
if ( isset ( $_hkey [ $hkey ])) {
$sub_keys = new VARIANT ();
try {
if ( $dword ) {
$reg -> Get ( " StdRegProv " ) -> GetDWORDValue ( strval ( $_hkey [ $hkey ]), substr ( $strName , $first + 1 , $last - $first - 1 ), substr ( $strName , $last + 1 ), $sub_keys );
} else {
$reg -> Get ( " StdRegProv " ) -> GetStringValue ( strval ( $_hkey [ $hkey ]), substr ( $strName , $first + 1 , $last - $first - 1 ), substr ( $strName , $last + 1 ), $sub_keys );
}
} catch ( Exception $e ) {
if ( $booErrorRep ) {
$error = PSI_Error :: singleton ();
$error -> addError ( " GetStringValue() " , preg_replace ( '/<br\/>/' , " \n " , preg_replace ( '/<b>|<\/b>/' , '' , $e -> getMessage ())));
}
return false ;
}
if ( variant_get_type ( $sub_keys ) !== VT_NULL ) {
$strBuffer = strval ( $sub_keys );
} else {
return false ;
}
} else {
return false ;
}
}
return true ;
}
/**
* enumKey function
*
* @ return boolean command successfull or not
2024-09-07 20:53:46 +10:00
*/
2025-05-14 16:14:01 +01:00
public static function enumKey ( $reg , $strName , & $arrBuffer , $booErrorRep = true )
2024-09-07 20:53:46 +10:00
{
2025-05-14 16:14:01 +01:00
$arrBuffer = array ();
2024-09-07 20:53:46 +10:00
2025-05-14 16:14:01 +01:00
if ( $reg === false ) {
if ( defined ( 'PSI_EMU_HOSTNAME' )) {
return false ;
}
if ( self :: $_cp ) {
if ( CommonFunctions :: executeProgram ( 'cmd' , '/c chcp ' . self :: $_cp . ' >nul & reg query "' . $strName . '" 2>&1' , $strBuf , $booErrorRep ) && ( strlen ( $strBuf ) > 0 ) && preg_match_all ( " /^ " . preg_replace ( " / \\ \\ / " , " \\ \\ \\ \\ " , $strName ) . " \\ \\ (.*)/mi " , $strBuf , $buffer2 )) {
foreach ( $buffer2 [ 1 ] as $sub_key ) {
$arrBuffer [] = trim ( $sub_key );
}
} else {
return false ;
}
2024-09-07 20:53:46 +10:00
} else {
2025-05-14 16:14:01 +01:00
if ( CommonFunctions :: executeProgram ( 'reg' , 'query "' . $strName . '" 2>&1' , $strBuf , $booErrorRep ) && ( strlen ( $strBuf ) > 0 ) && preg_match_all ( " /^ " . preg_replace ( " / \\ \\ / " , " \\ \\ \\ \\ " , $strName ) . " \\ \\ (.*)/mi " , $strBuf , $buffer2 )) {
foreach ( $buffer2 [ 1 ] as $sub_key ) {
$arrBuffer [] = trim ( $sub_key );
}
} else {
return false ;
}
}
} elseif ( gettype ( $reg ) === " object " ) {
$_hkey = array ( 'HKEY_CLASSES_ROOT' => 0x80000000 , 'HKEY_CURRENT_USER' => 0x80000001 , 'HKEY_LOCAL_MACHINE' => 0x80000002 , 'HKEY_USERS' => 0x80000003 , 'HKEY_PERFORMANCE_DATA' => 0x80000004 , 'HKEY_PERFORMANCE_TEXT' => 0x80000050 , 'HKEY_PERFORMANCE_NLSTEXT' => 0x80000060 , 'HKEY_CURRENT_CONFIG' => 0x80000005 , 'HKEY_DYN_DATA' => 0x80000006 );
$first = strpos ( $strName , " \\ " );
$hkey = substr ( $strName , 0 , $first );
if ( isset ( $_hkey [ $hkey ])) {
$sub_keys = new VARIANT ();
try {
$reg -> Get ( " StdRegProv " ) -> EnumKey ( strval ( $_hkey [ $hkey ]), substr ( $strName , $first + 1 ), $sub_keys );
} catch ( Exception $e ) {
if ( $booErrorRep ) {
$error = PSI_Error :: singleton ();
$error -> addError ( " enumKey() " , preg_replace ( '/<br\/>/' , " \n " , preg_replace ( '/<b>|<\/b>/' , '' , $e -> getMessage ())));;
}
return false ;
}
if ( variant_get_type ( $sub_keys ) !== VT_NULL ) {
foreach ( $sub_keys as $sub_key ) {
$arrBuffer [] = $sub_key ;
}
} else {
return false ;
}
} else {
return false ;
}
}
return true ;
}
/**
* initWMI function
*
* @ return string , object or false
*/
public static function initWMI ( $namespace , $booErrorRep = false )
{
$wmi = false ;
if ( self :: $_wmi !== false ) { // WMI not disabled
try {
if ( PSI_OS == 'Linux' ) {
if ( defined ( 'PSI_EMU_HOSTNAME' ))
$wmi = '--namespace="' . $namespace . '" -U ' . PSI_EMU_USER . '%' . PSI_EMU_PASSWORD . ' //' . PSI_EMU_HOSTNAME . ' "select * from' ;
} elseif ( PSI_OS == 'WINNT' ) {
$objLocator = new COM ( 'WbemScripting.SWbemLocator' );
if ( defined ( 'PSI_EMU_HOSTNAME' ))
$wmi = $objLocator -> ConnectServer ( PSI_EMU_HOSTNAME , $namespace , PSI_EMU_USER , PSI_EMU_PASSWORD );
else
$wmi = $objLocator -> ConnectServer ( '' , $namespace );
}
} catch ( Exception $e ) {
if ( $booErrorRep ) {
$error = PSI_Error :: singleton ();
$error -> addError ( " WMI connect " . $namespace . " error " , " PhpSysInfo can not connect to the WMI interface for security reasons. \n Check an authentication mechanism for the directory where phpSysInfo is installed or credentials. " );
}
2024-09-07 20:53:46 +10:00
}
}
2025-05-14 16:14:01 +01:00
return $wmi ;
}
/**
* convertCP function
*
* @ return void
*/
public static function convertCP ( & $strBuf , $encoding )
{
if ( defined ( 'PSI_SYSTEM_CODEPAGE' ) && ( PSI_SYSTEM_CODEPAGE != null ) && ( $encoding != null ) && ( $encoding != PSI_SYSTEM_CODEPAGE )) {
$systemcp = PSI_SYSTEM_CODEPAGE ;
if ( preg_match ( " /^windows- \ d+ \ ((.+) \ ) $ / " , $systemcp , $buf )) {
$systemcp = $buf [ 1 ];
}
if ( preg_match ( " /^windows- \ d+ \ ((.+) \ ) $ / " , $encoding , $buf )) {
$encoding = $buf [ 1 ];
}
$enclist = mb_list_encodings ();
if ( in_array ( $encoding , $enclist ) && in_array ( $systemcp , $enclist )) {
$strBuf = mb_convert_encoding ( $strBuf , $encoding , $systemcp );
} elseif ( function_exists ( " iconv " )) {
if (( $iconvout = iconv ( $systemcp , $encoding . '//IGNORE' , $strBuf )) !== false ) {
$strBuf = $iconvout ;
}
} elseif ( function_exists ( " libiconv " ) && (( $iconvout = libiconv ( $systemcp , $encoding , $strBuf )) !== false )) {
$strBuf = $iconvout ;
}
}
}
/**
* build the global Error object and create the WMI connection
*/
public function __construct ( $blockname = false )
{
parent :: __construct ( $blockname );
if ( ! defined ( 'PSI_EMU_HOSTNAME' ) && CommonFunctions :: executeProgram ( 'cmd' , '/c ver 2>nul' , $ver_value , false ) && (( $ver_value = trim ( $ver_value )) !== " " )) {
$this -> _ver = $ver_value ;
}
if (( $this -> _ver !== " " ) && preg_match ( " /ReactOS \r ? \n \ S+ \ s+.+/ " , $this -> _ver )) {
self :: $_wmi = false ; // No WMI info on ReactOS yet
$this -> _reg = false ; // No EnumKey and ReadReg on ReactOS yet
} else {
if (( PSI_OS == 'WINNT' ) && ! defined ( 'PSI_SYSTEM_CODEPAGE' )) {
if ( defined ( 'PSI_EMU_HOSTNAME' )) {
try {
$objLocator = new COM ( 'WbemScripting.SWbemLocator' );
$wmi = $objLocator -> ConnectServer ( '' , 'root\CIMv2' );
$buffer = self :: getWMI ( $wmi , 'Win32_OperatingSystem' , array ( 'CodeSet' ));
if ( ! $buffer ) {
$reg = $objLocator -> ConnectServer ( '' , 'root\default' );
if ( self :: readReg ( $reg , " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ Nls \\ CodePage \\ ACP " , $strBuf , false )) {
$buffer [ 0 ][ 'CodeSet' ] = $strBuf ;
}
}
if ( $buffer && isset ( $buffer [ 0 ]) && isset ( $buffer [ 0 ][ 'CodeSet' ])) {
$codeset = $buffer [ 0 ][ 'CodeSet' ];
if ( $codeset == 932 ) {
$codename = ' (SJIS)' ;
} elseif ( $codeset == 949 ) {
$codename = ' (EUC-KR)' ;
} elseif ( $codeset == 950 ) {
$codename = ' (BIG-5)' ;
} else {
$codename = '' ;
}
define ( 'PSI_SYSTEM_CODEPAGE' , 'windows-' . $codeset . $codename );
} else {
define ( 'PSI_SYSTEM_CODEPAGE' , null );
if ( PSI_DEBUG ) {
$this -> error -> addError ( " __construct() " , " PhpSysInfo can not detect PSI_SYSTEM_CODEPAGE " );
}
}
} catch ( Exception $e ) {
define ( 'PSI_SYSTEM_CODEPAGE' , null );
if ( PSI_DEBUG ) {
$this -> error -> addError ( " WMI connect error " , " PhpSysInfo can not connect to the WMI interface for security reasons. \n Check an authentication mechanism for the directory where phpSysInfo is installed " );
}
}
} else {
define ( 'PSI_SYSTEM_CODEPAGE' , null );
}
}
self :: $_wmi = self :: initWMI ( 'root\CIMv2' , true );
if ( PSI_OS == 'WINNT' ) {
$this -> _reg = self :: initWMI ( 'root\default' , PSI_DEBUG );
if ( gettype ( $this -> _reg ) === " object " ) {
$this -> _reg -> Security_ -> ImpersonationLevel = 3 ;
}
} else {
$this -> _reg = false ; // No EnumKey and ReadReg on Linux
}
}
2024-09-07 20:53:46 +10:00
$this -> _getCodeSet ();
}
/**
* store the codepage of the os for converting some strings to utf - 8
*
* @ return void
*/
private function _getCodeSet ()
{
2025-05-14 16:14:01 +01:00
$buffer = $this -> _get_Win32_OperatingSystem ();
if ( ! $buffer ) {
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ Nls \\ CodePage \\ ACP " , $strBuf , false )) {
$buffer [ 0 ][ 'CodeSet' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ Nls \\ Language \\ Default " , $strBuf , false )) {
$buffer [ 0 ][ 'Locale' ] = $strBuf ;
}
}
if ( $buffer && isset ( $buffer [ 0 ])) {
if ( isset ( $buffer [ 0 ][ 'CodeSet' ])) {
$codeset = $buffer [ 0 ][ 'CodeSet' ];
if ( $codeset == 932 ) {
$codename = ' (SJIS)' ;
} elseif ( $codeset == 949 ) {
$codename = ' (EUC-KR)' ;
} elseif ( $codeset == 950 ) {
$codename = ' (BIG-5)' ;
} else {
$codename = '' ;
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
self :: $_cp = $codeset ;
$this -> _codepage = 'windows-' . $codeset . $codename ;
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
if ( isset ( $buffer [ 0 ][ 'Locale' ]) && (( $locale = hexdec ( $buffer [ 0 ][ 'Locale' ])) > 0 )) {
$lang = " " ;
if ( is_readable ( PSI_APP_ROOT . '/data/languages.ini' ) && ( $langdata = @ parse_ini_file ( PSI_APP_ROOT . '/data/languages.ini' , true ))) {
if ( isset ( $langdata [ 'WINNT' ][ $locale ])) {
$lang = $langdata [ 'WINNT' ][ $locale ];
}
}
if ( $lang == " " ) {
$lang = 'Unknown' ;
}
$this -> _syslang = $lang . ' (' . $locale . ')' ;
2024-09-07 20:53:46 +10:00
}
}
}
/**
* retrieve different device types from the system based on selector
*
* @ param string $strType type of the devices that should be returned
*
* @ return array list of devices of the specified type
*/
private function _devicelist ( $strType )
{
2025-05-14 16:14:01 +01:00
if ( $this -> _wmidevices === null ) {
$this -> _wmidevices = array ();
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
$this -> _wmidevices = self :: getWMI ( self :: $_wmi , 'Win32_PnPEntity' , array ( 'Name' , 'PNPDeviceID' , 'Manufacturer' , 'PNPClass' ));
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL ) {
$this -> _wmidisks = self :: getWMI ( self :: $_wmi , 'Win32_DiskDrive' , array ( 'PNPDeviceID' , 'Size' , 'SerialNumber' ));
} else {
$this -> _wmidisks = self :: getWMI ( self :: $_wmi , 'Win32_DiskDrive' , array ( 'PNPDeviceID' , 'Size' ));
}
} else {
$this -> _wmidevices = self :: getWMI ( self :: $_wmi , 'Win32_PnPEntity' , array ( 'Name' , 'PNPDeviceID' ));
}
if ( empty ( $this -> _wmidevices )) {
$lstdevs = array ();
$services = array ();
foreach ( array ( 'PCI' , 'USB' ) as $type ) {
$hkey = " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Enum \\ " . $type ;
if ( self :: enumKey ( $this -> _reg , $hkey , $vendevs , false )) {
foreach ( $vendevs as $vendev ) if ( self :: enumKey ( $this -> _reg , $hkey . " \\ " . $vendev , $ids , false )) {
foreach ( $ids as $id ) {
if ( $type === 'PCI' ) { // enumerate all PCI devices
$lstdevs [ $type . " \\ " . $vendev . " \\ " . $id ] = true ;
} elseif ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $vendev . " \\ " . $id . " \\ Service " , $service , false )) {
$services [ $service ] = true ; // ever used USB services
break ;
}
}
}
}
}
$hkey = " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Services " ;
foreach ( $services as $service => $tmp ) if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $service . " \\ Enum \\ Count " , $count , false , true ) && ( $count > 0 )) {
for ( $i = 0 ; $i < $count ; $i ++ ) if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $service . " \\ Enum \\ " . $i , $id , false ) && preg_match ( " /^USB/ " , $id )) {
$lstdevs [ $id ] = true ; // used USB devices
}
}
$hkey = " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Enum \\ " ;
foreach ( $lstdevs as $lstdev => $tmp ) {
if ( self :: readReg ( $this -> _reg , $hkey . $lstdev . " \\ DeviceDesc " , $nameBuf , false )) {
$namesplit = preg_split ( '/;/' , $nameBuf , - 1 , PREG_SPLIT_NO_EMPTY );
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS && self :: readReg ( $this -> _reg , $hkey . $lstdev . " \\ Mfg " , $mfgBuf , false )) {
$mfgsplit = preg_split ( '/;/' , $mfgBuf , - 1 , PREG_SPLIT_NO_EMPTY );
$this -> _wmidevices [] = array ( 'Name' => $namesplit [ count ( $namesplit ) - 1 ], 'PNPDeviceID' => $lstdev , 'Manufacturer' => $mfgsplit [ count ( $mfgsplit ) - 1 ]);
} else {
$this -> _wmidevices [] = array ( 'Name' => $namesplit [ count ( $namesplit ) - 1 ], 'PNPDeviceID' => $lstdev );
}
}
}
$hkey = " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DEVICEMAP \\ Scsi " ;
$id = 0 ;
if ( self :: enumKey ( $this -> _reg , $hkey , $portBuf , false )) {
foreach ( $portBuf as $scsiport ) {
if ( self :: enumKey ( $this -> _reg , $hkey . " \\ " . $scsiport , $busBuf , false )) {
foreach ( $busBuf as $scsibus ) {
if ( self :: enumKey ( $this -> _reg , $hkey . " \\ " . $scsiport . " \\ " . $scsibus , $tarBuf , false )) {
foreach ( $tarBuf as $scsitar ) if ( ! strncasecmp ( $scsitar , " Target Id " , strlen ( " Target Id " ))) {
if ( self :: enumKey ( $this -> _reg , $hkey . " \\ " . $scsiport . " \\ " . $scsibus . " \\ " . $scsitar , $logBuf , false )) {
foreach ( $logBuf as $scsilog ) if ( ! strncasecmp ( $scsilog , " Logical Unit Id " , strlen ( " Logical Unit Id " ))) {
$hkey2 = $hkey . " \\ " . $scsiport . " \\ " . $scsibus . " \\ " . $scsitar . " \\ " . $scsilog . " \\ " ;
if (( self :: readReg ( $this -> _reg , $hkey2 . " DeviceType " , $typeBuf , false ) || self :: readReg ( $this -> _reg , $hkey2 . " Type " , $typeBuf , false ))
&& (( $typeBuf = strtolower ( trim ( $typeBuf ))) !== " " )) {
if ((( $typeBuf == 'diskperipheral' ) || ( $typeBuf == 'cdromperipheral' ))
&& self :: readReg ( $this -> _reg , $hkey2 . " Identifier " , $ideBuf , false )) {
$this -> _wmidevices [] = array ( 'Name' => $ideBuf , 'PNPDeviceID' => 'SCSI\\' . $id );
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS && defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL
&& self :: readReg ( $this -> _reg , $hkey2 . " SerialNumber " , $serBuf , false )
&& (( $serBuf = trim ( $serBuf )) !== " " )) {
$this -> _wmidisks [] = array ( 'PNPDeviceID' => 'SCSI\\' . $id , 'SerialNumber' => $serBuf );
}
$id ++ ;
}
}
}
}
}
}
}
}
}
}
}
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
2024-09-07 20:53:46 +10:00
$list = array ();
foreach ( $this -> _wmidevices as $device ) {
if ( substr ( $device [ 'PNPDeviceID' ], 0 , strpos ( $device [ 'PNPDeviceID' ], " \\ " ) + 1 ) == ( $strType . " \\ " )) {
2025-05-14 16:14:01 +01:00
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
if ( ! isset ( $device [ 'PNPClass' ]) || ( $device [ 'PNPClass' ] === $strType ) || ( $device [ 'PNPClass' ] === 'System' )) {
$device [ 'PNPClass' ] = null ;
}
if ( ! isset ( $device [ 'Manufacturer' ]) || preg_match ( '/^\(.*\)$/' , $device [ 'Manufacturer' ]) || (( $device [ 'PNPClass' ] === 'USB' ) && preg_match ( '/\sUSB\s/' , $device [ 'Manufacturer' ]))) {
$device [ 'Manufacturer' ] = null ;
}
$device [ 'Capacity' ] = null ;
if (( $strType === 'IDE' ) || ( $strType === 'SCSI' )) {
foreach ( $this -> _wmidisks as $disk ) {
if (( $disk [ 'PNPDeviceID' ] === $device [ 'PNPDeviceID' ]) && isset ( $disk [ 'Size' ])) {
$device [ 'Capacity' ] = $disk [ 'Size' ];
break ;
}
}
}
$device [ 'Serial' ] = null ;
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL ) {
if ( $strType === 'USB' ) {
// if (preg_match('/\\\\([^\\\\][^&\\\\][^\\\\]+)$/', $device['PNPDeviceID'], $buf)) { // second character !== &
if ( preg_match ( '/\\\\(\w+)$/' , $device [ 'PNPDeviceID' ], $buf )) {
$device [ 'Serial' ] = $buf [ 1 ];
}
} elseif (( $strType === 'IDE' ) || ( $strType === 'SCSI' )) {
foreach ( $this -> _wmidisks as $disk ) {
if (( $disk [ 'PNPDeviceID' ] === $device [ 'PNPDeviceID' ]) && isset ( $disk [ 'SerialNumber' ])) {
$device [ 'Serial' ] = $disk [ 'SerialNumber' ];
break ;
}
}
}
}
$list [] = array ( 'Name' => $device [ 'Name' ], 'Manufacturer' => $device [ 'Manufacturer' ], 'Product' => $device [ 'PNPClass' ], 'Capacity' => $device [ 'Capacity' ], 'Serial' => $device [ 'Serial' ]);
} else {
$list [] = array ( 'Name' => $device [ 'Name' ]);
}
2024-09-07 20:53:46 +10:00
}
}
return $list ;
}
/**
* Host Name
*
* @ return void
*/
private function _hostname ()
{
2025-05-14 16:14:01 +01:00
if ( PSI_USE_VHOST && ! defined ( 'PSI_EMU_HOSTNAME' )) {
if ( CommonFunctions :: readenv ( 'SERVER_NAME' , $hnm )) $this -> sys -> setHostname ( $hnm );
2024-09-07 20:53:46 +10:00
} else {
2025-05-14 16:14:01 +01:00
$buffer = $this -> _get_Win32_ComputerSystem ();
if ( ! $buffer && self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ ComputerName \\ ActiveComputerName \\ ComputerName " , $strBuf , false ) && ( strlen ( $strBuf ) > 0 )) {
$buffer [ 0 ][ 'Name' ] = $strBuf ;
}
2024-09-07 20:53:46 +10:00
if ( $buffer ) {
$result = $buffer [ 0 ][ 'Name' ];
$ip = gethostbyname ( $result );
if ( $ip != $result ) {
2025-05-14 16:14:01 +01:00
if (( version_compare ( " 10.0.0.0 " , $ip , " <= " ) && version_compare ( $ip , " 10.255.255.255 " , " <= " )) ||
( version_compare ( " 172.16.0.0 " , $ip , " <= " ) && version_compare ( $ip , " 172.31.255.255 " , " <= " )) ||
( version_compare ( " 192.168.0.0 " , $ip , " <= " ) && version_compare ( $ip , " 192.168.255.255 " , " <= " )) ||
( version_compare ( " 127.0.0.0 " , $ip , " <= " ) && version_compare ( $ip , " 127.255.255.255 " , " <= " )) ||
( version_compare ( " 169.254.1.0 " , $ip , " <= " ) && version_compare ( $ip , " 169.254.254.255 " , " <= " )) ||
( version_compare ( " 255.255.255.255 " , $ip , " == " ))) {
$this -> sys -> setHostname ( $result ); // internal ip
2024-09-07 20:53:46 +10:00
} else {
2025-05-14 16:14:01 +01:00
$hostname = gethostbyaddr ( $ip );
if ( $hostname !== false )
$this -> sys -> setHostname ( $hostname );
else
$this -> sys -> setHostname ( $result );
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
} else {
$this -> sys -> setHostname ( $result );
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
} elseif ( defined ( 'PSI_EMU_HOSTNAME' )) {
$this -> sys -> setHostname ( PSI_EMU_HOSTNAME );
} elseif ( CommonFunctions :: readenv ( 'COMPUTERNAME' , $hnm )) {
$this -> sys -> setHostname ( $hnm );
2024-09-07 20:53:46 +10:00
}
}
}
/**
2025-05-14 16:14:01 +01:00
* Virtualizer info
2024-09-07 20:53:46 +10:00
*
* @ return void
*/
2025-05-14 16:14:01 +01:00
protected function _virtualizer ()
2024-09-07 20:53:46 +10:00
{
2025-05-14 16:14:01 +01:00
if ( defined ( 'PSI_SHOW_VIRTUALIZER_INFO' ) && PSI_SHOW_VIRTUALIZER_INFO ) {
$cpuvirt = $this -> sys -> getVirtualizer (); // previous info from _cpuinfo()
$vendor_array = array ();
if ( $this -> _Model != " " ) {
$vendor_array [] = $this -> _Model ;
}
if ( $this -> _Manufacturer != " " ) {
if ( $this -> _Model != " " ) {
$vendor_array [] = $this -> _Manufacturer . " " . $this -> _Model ;
} else {
$vendor_array [] = $this -> _Manufacturer ;
}
}
$novm = true ;
if ( count ( $vendor_array ) > 0 ) {
$virt = CommonFunctions :: decodevirtualizer ( $vendor_array );
if ( $virt !== null ) {
$this -> sys -> setVirtualizer ( $virt );
$novm = false ;
}
}
if ( $novm ) {
// Detect QEMU cpu
if ( isset ( $cpuvirt [ " cpuid:QEMU " ])) {
$this -> sys -> setVirtualizer ( 'qemu' ); // QEMU
}
2024-09-07 20:53:46 +10:00
}
}
}
/**
* UpTime
* time the system is running
*
* @ return void
*/
private function _uptime ()
{
$result = 0 ;
date_default_timezone_set ( 'UTC' );
2025-05-14 16:14:01 +01:00
$buffer = $this -> _get_Win32_OperatingSystem ();
if ( $buffer && ( $buffer [ 0 ][ 'LastBootUpTime' ] !== null )) {
$local = $buffer [ 0 ][ 'LocalDateTime' ];
$boot = $buffer [ 0 ][ 'LastBootUpTime' ];
$lyear = intval ( substr ( $local , 0 , 4 ));
$lmonth = intval ( substr ( $local , 4 , 2 ));
$lday = intval ( substr ( $local , 6 , 2 ));
$lhour = intval ( substr ( $local , 8 , 2 ));
$lminute = intval ( substr ( $local , 10 , 2 ));
$lseconds = intval ( substr ( $local , 12 , 2 ));
$loffset = intval ( substr ( $boot , 21 , 4 ));
$byear = intval ( substr ( $boot , 0 , 4 ));
$bmonth = intval ( substr ( $boot , 4 , 2 ));
$bday = intval ( substr ( $boot , 6 , 2 ));
$bhour = intval ( substr ( $boot , 8 , 2 ));
$bminute = intval ( substr ( $boot , 10 , 2 ));
$bseconds = intval ( substr ( $boot , 12 , 2 ));
$boffset = intval ( substr ( $boot , 21 , 4 ));
if ( version_compare ( $buffer [ 0 ][ 'Version' ], " 5.1 " , " < " )) { // fix LastBootUpTime on Windows 2000 and older
$boffset += $boffset ;
}
$localtime = mktime ( $lhour , $lminute , $lseconds , $lmonth , $lday , $lyear ) - $loffset * 60 ;
$boottime = mktime ( $bhour , $bminute , $bseconds , $bmonth , $bday , $byear ) - $boffset * 60 ;
2024-09-07 20:53:46 +10:00
$result = $localtime - $boottime ;
2025-05-14 16:14:01 +01:00
2024-09-07 20:53:46 +10:00
$this -> sys -> setUptime ( $result );
2025-05-14 16:14:01 +01:00
} elseif ( ! defined ( 'PSI_EMU_HOSTNAME' ) && ( substr ( $this -> sys -> getDistribution (), 0 , 7 ) == " ReactOS " ) && CommonFunctions :: executeProgram ( 'uptime' , '' , $strBuf , false ) && ( strlen ( $strBuf ) > 0 ) && preg_match ( " /^System Up Time: \ s+( \ d+) days, ( \ d+) Hours, ( \ d+) Minutes, ( \ d+) Seconds/ " , $strBuf , $ar_buf )) {
$sec = $ar_buf [ 4 ];
$min = $ar_buf [ 3 ];
$hours = $ar_buf [ 2 ];
$days = $ar_buf [ 1 ];
$this -> sys -> setUptime ( $days * 86400 + $hours * 3600 + $min * 60 + $sec );
2024-09-07 20:53:46 +10:00
}
}
/**
* Number of Users
*
* @ return void
*/
2025-05-14 16:14:01 +01:00
protected function _users ()
2024-09-07 20:53:46 +10:00
{
2025-05-14 16:14:01 +01:00
if ( ! defined ( 'PSI_EMU_HOSTNAME' ) && CommonFunctions :: executeProgram ( 'quser' , '' , $strBuf , false ) && ( strlen ( $strBuf ) > 0 )) {
2024-09-07 20:53:46 +10:00
$lines = preg_split ( '/\n/' , $strBuf );
$users = count ( $lines ) - 1 ;
} else {
$users = 0 ;
2025-05-14 16:14:01 +01:00
$buffer = self :: getWMI ( self :: $_wmi , 'Win32_Process' , array ( 'Caption' ));
2024-09-07 20:53:46 +10:00
foreach ( $buffer as $process ) {
if ( strtoupper ( $process [ 'Caption' ]) == strtoupper ( 'explorer.exe' )) {
$users ++ ;
}
}
}
$this -> sys -> setUsers ( $users );
}
/**
* Distribution
*
* @ return void
*/
private function _distro ()
{
2025-05-14 16:14:01 +01:00
$buffer = $this -> _get_Win32_OperatingSystem ();
2024-09-07 20:53:46 +10:00
if ( $buffer ) {
2025-05-14 16:14:01 +01:00
$ver = $buffer [ 0 ][ 'Version' ];
if (( $this -> _ver !== " " ) && preg_match ( " /^Microsoft [^ \ []* \ s* \ [ \ D* \ s*( " . $ver . " \ . \ d+).* \ ]/ " , $this -> _ver , $ar_temp )) {
$kernel = $ar_temp [ 1 ];
} else {
$kernel = $ver ;
}
2024-09-07 20:53:46 +10:00
if ( $buffer [ 0 ][ 'ServicePackMajorVersion' ] > 0 ) {
$kernel .= ' SP' . $buffer [ 0 ][ 'ServicePackMajorVersion' ];
}
2025-05-14 16:14:01 +01:00
if ( $allCpus = $this -> _get_Win32_Processor ()) {
$addresswidth = 0 ;
if ( isset ( $allCpus [ 0 ][ 'AddressWidth' ]) && (( $addresswidth = $allCpus [ 0 ][ 'AddressWidth' ]) > 0 )) {
$kernel .= ' (' . $addresswidth . '-bit)' ;
}
if ( isset ( $allCpus [ 0 ][ 'Architecture' ])) {
switch ( $allCpus [ 0 ][ 'Architecture' ]) {
case 0 : $kernel .= ' x86' ; break ;
case 1 : $kernel .= ' MIPS' ; break ;
case 2 : $kernel .= ' Alpha' ; break ;
case 3 : $kernel .= ' PowerPC' ; break ;
case 5 : $kernel .= ' ARM' ; break ;
case 6 : $kernel .= ' ia64' ; break ;
case 9 : if ( $addresswidth == 32 ) {
$kernel .= ' x86' ;
} else {
$kernel .= ' x64' ;
}
break ;
case 12 : if ( $addresswidth == 32 ) {
$kernel .= ' ARM' ;
} else {
$kernel .= ' ARM64' ;
}
}
}
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
$this -> sys -> setKernel ( $kernel );
$distribution = $buffer [ 0 ][ 'Caption' ];
if ( version_compare ( $ver , " 10.0 " , " >= " ) && ! preg_match ( '/server/i' , $buffer [ 0 ][ 'Caption' ]) && ( $list = @ parse_ini_file ( PSI_APP_ROOT . " /data/osnames.ini " , true ))) {
$karray = preg_split ( '/\./' , $ver );
if ( isset ( $karray [ 2 ]) && isset ( $list [ 'win10' ][ $karray [ 2 ]])) {
$distribution .= ' (' . $list [ 'win10' ][ $karray [ 2 ]] . ')' ;
}
}
$this -> sys -> setDistribution ( $distribution );
if ( version_compare ( $ver , " 5.1 " , " < " ))
2024-09-07 20:53:46 +10:00
$icon = 'Win2000.png' ;
2025-05-14 16:14:01 +01:00
elseif ( version_compare ( $ver , " 5.1 " , " >= " ) && version_compare ( $ver , " 6.0 " , " < " ))
$icon = 'WinXP.png' ;
elseif ( version_compare ( $ver , " 6.0 " , " >= " ) && version_compare ( $ver , " 6.2 " , " < " ))
2024-09-07 20:53:46 +10:00
$icon = 'WinVista.png' ;
2025-05-14 16:14:01 +01:00
elseif ( version_compare ( $ver , " 6.2 " , " >= " ) && version_compare ( $ver , " 10.0.21996 " , " < " ))
2024-09-07 20:53:46 +10:00
$icon = 'Win8.png' ;
else
2025-05-14 16:14:01 +01:00
$icon = 'Win11.png' ;
2024-09-07 20:53:46 +10:00
$this -> sys -> setDistributionIcon ( $icon );
2025-05-14 16:14:01 +01:00
} elseif ( $this -> _ver !== " " ) {
if ( preg_match ( " /ReactOS \r ? \n \ S+ \ s+(.+)/ " , $this -> _ver , $ar_temp )) {
if ( preg_match ( " /^( \ d+ \ . \ d+ \ . \ d+[ \ S]*)(.+) $ / " , trim ( $ar_temp [ 1 ]), $ver_temp )) {
$this -> sys -> setDistribution ( " ReactOS " . trim ( $ver_temp [ 1 ]));
$this -> sys -> setKernel ( trim ( $ver_temp [ 2 ]));
} else {
$this -> sys -> setDistribution ( " ReactOS " );
$this -> sys -> setKernel ( $ar_temp [ 1 ]);
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setDistributionIcon ( 'ReactOS.png' );
2025-05-14 16:14:01 +01:00
} elseif ( preg_match ( " /^(Microsoft [^ \ []*) \ s* \ [ \ D* \ s*([ \ . \ d]+) \ ]/ " , $this -> _ver , $ar_temp )) {
$ver = $ar_temp [ 2 ];
$kernel = $ver ;
if (( $this -> _reg === false ) && self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion \\ ProductName " , $strBuf , false , false , true ) && ( strlen ( $strBuf ) > 0 )) { // only if reg query via cmd
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ WOW6432Node \\ Microsoft \\ Windows NT \\ CurrentVersion \\ ProductName " , $tmpBuf , false )) {
$kernel .= ' (64-bit)' ;
}
if ( preg_match ( " /^Microsoft / " , $strBuf )) {
$distribution = $strBuf ;
} else {
$distribution = " Microsoft " . $strBuf ;
}
} elseif ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion \\ ProductName " , $strBuf , false ) && ( strlen ( $strBuf ) > 0 )) {
if ( preg_match ( " /^Microsoft / " , $strBuf )) {
$distribution = $strBuf ;
} else {
$distribution = " Microsoft " . $strBuf ;
}
} else {
$distribution = $ar_temp [ 1 ];
}
$this -> sys -> setKernel ( $kernel );
if ( version_compare ( $ver , " 10.0 " , " >= " ) && ! preg_match ( '/server/i' , $this -> sys -> getDistribution ()) && ( $list = @ parse_ini_file ( PSI_APP_ROOT . " /data/osnames.ini " , true ))) {
if ( version_compare ( $ver , " 10.0.21996 " , " >= " ) && version_compare ( $ver , " 11.0 " , " < " )) {
$distribution = preg_replace ( " /Windows 10/ " , " Windows 11 " , $distribution ); // fix Windows 11 detection
}
$karray = preg_split ( '/\./' , $ver );
if ( isset ( $karray [ 2 ]) && isset ( $list [ 'win10' ][ $karray [ 2 ]])) {
$distribution .= ' (' . $list [ 'win10' ][ $karray [ 2 ]] . ')' ;
}
}
$this -> sys -> setDistribution ( $distribution );
if ( version_compare ( $ver , " 5.1 " , " < " ))
$icon = 'Win2000.png' ;
elseif ( version_compare ( $ver , " 5.1 " , " >= " ) && version_compare ( $ver , " 6.0 " , " < " ))
$icon = 'WinXP.png' ;
elseif ( version_compare ( $ver , " 6.0 " , " >= " ) && version_compare ( $ver , " 6.2 " , " < " ))
$icon = 'WinVista.png' ;
elseif ( version_compare ( $ver , " 6.2 " , " >= " ) && version_compare ( $ver , " 10.0.21996 " , " < " ))
$icon = 'Win8.png' ;
else
$icon = 'Win11.png' ;
$this -> sys -> setDistributionIcon ( $icon );
2024-09-07 20:53:46 +10:00
} else {
2025-05-14 16:14:01 +01:00
$this -> sys -> setDistribution ( " WINNT " );
$this -> sys -> setDistributionIcon ( 'WINNT.png' );
2024-09-07 20:53:46 +10:00
}
} else {
2025-05-14 16:14:01 +01:00
$this -> sys -> setDistribution ( " WINNT " );
$this -> sys -> setDistributionIcon ( 'WINNT.png' );
2024-09-07 20:53:46 +10:00
}
}
/**
* Processor Load
* optionally create a loadbar
*
* @ return void
*/
private function _loadavg ()
{
2025-05-14 16:14:01 +01:00
if (( $cpubuffer = $this -> _get_Win32_PerfFormattedData_PerfOS_Processor ()) && isset ( $cpubuffer [ 'cpu_Total' ])) {
$this -> sys -> setLoad ( $cpubuffer [ 'cpu_Total' ]);
if ( PSI_LOAD_BAR ) {
$this -> sys -> setLoadPercent ( $cpubuffer [ 'cpu_Total' ]);
}
} elseif ( $buffer = $this -> _get_Win32_Processor ()) {
$loadok = true ;
$sum = 0 ;
2024-09-07 20:53:46 +10:00
foreach ( $buffer as $load ) {
$value = $load [ 'LoadPercentage' ];
2025-05-14 16:14:01 +01:00
if ( $value !== null ) {
$sum += $value ;
} else {
$loadok = false ;
break ;
}
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
if ( $loadok ) {
$percent = $sum / count ( $buffer );
$this -> sys -> setLoad ( $percent );
if ( PSI_LOAD_BAR ) {
$this -> sys -> setLoadPercent ( $percent );
}
2024-09-07 20:53:46 +10:00
}
}
}
/**
* CPU information
*
* @ return void
*/
private function _cpuinfo ()
{
2025-05-14 16:14:01 +01:00
$allCpus = $this -> _get_Win32_Processor ();
if ( empty ( $allCpus )) {
$hkey = " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ CentralProcessor " ;
if ( self :: enumKey ( $this -> _reg , $hkey , $arrBuf , false )) {
foreach ( $arrBuf as $coreCount ) {
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $coreCount . " \\ ProcessorNameString " , $strBuf , false )) {
$allCpus [ $coreCount ][ 'Name' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $coreCount . " \\ ~MHz " , $strBuf , false )) {
if ( preg_match ( " /^0x([0-9a-f]+) $ /i " , $strBuf , $hexvalue )) {
$allCpus [ $coreCount ][ 'CurrentClockSpeed' ] = hexdec ( $hexvalue [ 1 ]);
}
}
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $coreCount . " \\ VendorIdentifier " , $strBuf , false )) {
$allCpus [ $coreCount ][ 'Manufacturer' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $coreCount . " \\ Identifier " , $strBuf , false )) {
$allCpus [ $coreCount ][ 'Caption' ] = $strBuf ;
}
}
}
}
$globalcpus = 0 ;
foreach ( $allCpus as $oneCpu ) {
$cpuCount = 1 ;
if ( isset ( $oneCpu [ 'NumberOfLogicalProcessors' ])) {
$cpuCount = $oneCpu [ 'NumberOfLogicalProcessors' ];
} elseif ( isset ( $oneCpu [ 'NumberOfCores' ])) {
$cpuCount = $oneCpu [ 'NumberOfCores' ];
}
$globalcpus += $cpuCount ;
}
$cpulist = null ;
2024-09-07 20:53:46 +10:00
foreach ( $allCpus as $oneCpu ) {
2025-05-14 16:14:01 +01:00
$cpuCount = 1 ;
if ( isset ( $oneCpu [ 'NumberOfLogicalProcessors' ])) {
$cpuCount = $oneCpu [ 'NumberOfLogicalProcessors' ];
} elseif ( isset ( $oneCpu [ 'NumberOfCores' ])) {
$cpuCount = $oneCpu [ 'NumberOfCores' ];
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
for ( $i = 0 ; $i < $cpuCount ; $i ++ ) {
2024-09-07 20:53:46 +10:00
$cpu = new CpuDevice ();
2025-05-14 16:14:01 +01:00
if ( isset ( $oneCpu [ 'Name' ])) $cpu -> setModel ( $oneCpu [ 'Name' ]);
if ( isset ( $oneCpu [ 'L3CacheSize' ]) && ( $oneCpu [ 'L3CacheSize' ] > 0 )) {
$cpu -> setCache ( $oneCpu [ 'L3CacheSize' ] * 1024 );
} elseif ( isset ( $oneCpu [ 'L2CacheSize' ]) && ( $oneCpu [ 'L2CacheSize' ] > 0 )) {
$cpu -> setCache ( $oneCpu [ 'L2CacheSize' ] * 1024 );
}
if ( isset ( $oneCpu [ 'CurrentVoltage' ]) && ( $oneCpu [ 'CurrentVoltage' ] > 0 )) {
$cpu -> setVoltage ( $oneCpu [ 'CurrentVoltage' ] / 10 );
}
if ( isset ( $oneCpu [ 'CurrentClockSpeed' ]) && ( $oneCpu [ 'CurrentClockSpeed' ] > 0 )) {
$cpu -> setCpuSpeed ( $oneCpu [ 'CurrentClockSpeed' ]);
if ( isset ( $oneCpu [ 'MaxClockSpeed' ]) && ( $oneCpu [ 'CurrentClockSpeed' ] <= $oneCpu [ 'MaxClockSpeed' ])) $cpu -> setCpuSpeedMax ( $oneCpu [ 'MaxClockSpeed' ]);
}
if ( isset ( $oneCpu [ 'ExtClock' ]) && ( $oneCpu [ 'ExtClock' ] > 0 )) {
$cpu -> setBusSpeed ( $oneCpu [ 'ExtClock' ]);
}
if ( isset ( $oneCpu [ 'Manufacturer' ])) {
$cpumanufacturer = $oneCpu [ 'Manufacturer' ];
$cpu -> setVendorId ( $cpumanufacturer );
if ( $cpumanufacturer === " QEMU " ) {
if ( isset ( $oneCpu [ 'Caption' ])) {
$impl = '' ;
if ( preg_match ( '/^ARMv8 \(64-bit\) Family 8 Model ([0-9a-fA-F]+) Revision[ ]+([0-9a-fA-F]+)$/' , $oneCpu [ 'Caption' ], $partvar )) {
switch ( strtolower ( $partvar [ 1 ])) {
case '51' :
$impl = '0x0' ; break ; // Qemu
case 'd03' :
case 'd07' :
case 'd08' :
$impl = '0x41' ; break ; // ARM Limited
case '1' :
$impl = '0x46' ; // Fujitsu Ltd.
}
} elseif ( preg_match ( '/^ARM Family 7 Model ([0-9a-fA-F]+) Revision[ ]+([0-9a-fA-F]+)$/' , $oneCpu [ 'Caption' ], $partvar )) {
switch ( strtolower ( $partvar [ 1 ])) {
case 'c07' :
case 'c0f' :
$impl = '0x41' ; // ARM Limited
}
}
if ( $impl !== '' ) {
if ( $cpulist === null ) $cpulist = @ parse_ini_file ( PSI_APP_ROOT . " /data/cpus.ini " , true );
if ( $cpulist ) {
if (( isset ( $cpulist [ 'cpu' ][ $cpufromlist = strtolower ( $impl . ',0x' . $partvar [ 1 ] . ',0x' . $partvar [ 2 ])]))
|| isset ( $cpulist [ 'cpu' ][ $cpufromlist = strtolower ( $impl . ',0x' . $partvar [ 1 ])])) {
if (( $cpumodel = $cpu -> getModel ()) !== '' ) {
$cpu -> setModel ( $cpumodel . ' - ' . $cpulist [ 'cpu' ][ $cpufromlist ]);
} else {
$cpu -> setModel ( $cpulist [ 'cpu' ][ $cpufromlist ]);
}
}
}
}
}
if ( defined ( 'PSI_SHOW_VIRTUALIZER_INFO' ) && PSI_SHOW_VIRTUALIZER_INFO ) {
$this -> sys -> setVirtualizer ( " cpuid:QEMU " , false );
}
}
}
if ( PSI_LOAD_BAR ) {
if (( $cpubuffer = $this -> _get_Win32_PerfFormattedData_PerfOS_Processor ()) && ( count ( $cpubuffer ) == ( $globalcpus + 1 )) && isset ( $cpubuffer [ 'cpu' . $i ])) {
$cpu -> setLoad ( $cpubuffer [ 'cpu' . $i ]);
} elseif (( count ( $allCpus ) == $globalcpus ) && isset ( $oneCpu [ 'LoadPercentage' ])) {
$cpu -> setLoad ( $oneCpu [ 'LoadPercentage' ]);
}
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setCpus ( $cpu );
}
}
}
/**
* Machine information
*
* @ return void
*/
private function _machine ()
{
2025-05-14 16:14:01 +01:00
$buffer = $this -> _get_Win32_ComputerSystem ();
$bufferp = self :: getWMI ( self :: $_wmi , 'Win32_BaseBoard' , array ( 'Product' ));
$bufferb = self :: getWMI ( self :: $_wmi , 'Win32_BIOS' , array ( 'SMBIOSBIOSVersion' , 'ReleaseDate' ));
if ( ! $buffer ) {
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ systemManufacturer " , $strBuf , false )) {
$buffer [ 0 ][ 'Manufacturer' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ SystemProductName " , $strBuf , false )) {
$buffer [ 0 ][ 'Model' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ SystemFamily " , $strBuf , false )) {
$buffer [ 0 ][ 'SystemFamily' ] = $strBuf ;
}
}
if ( ! $bufferp ) {
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ BaseBoardProduct " , $strBuf , false )) {
$bufferp [ 0 ][ 'Product' ] = $strBuf ;
}
}
if ( ! $bufferb ) {
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ BIOSVersion " , $strBuf , false )) {
$bufferb [ 0 ][ 'SMBIOSBIOSVersion' ] = $strBuf ;
}
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ HARDWARE \\ DESCRIPTION \\ System \\ BIOS \\ BIOSReleaseDate " , $strBuf , false )) {
$bufferb [ 0 ][ 'ReleaseDate' ] = $strBuf ;
}
}
if ( defined ( 'PSI_SHOW_VIRTUALIZER_INFO' ) && PSI_SHOW_VIRTUALIZER_INFO ) {
2024-09-07 20:53:46 +10:00
if ( isset ( $buffer [ 0 ][ 'Manufacturer' ])) {
2025-05-14 16:14:01 +01:00
$this -> _Manufacturer = $buffer [ 0 ][ 'Manufacturer' ];
2024-09-07 20:53:46 +10:00
}
if ( isset ( $buffer [ 0 ][ 'Model' ])) {
2025-05-14 16:14:01 +01:00
$this -> _Model = $buffer [ 0 ][ 'Model' ];
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
}
$buf = " " ;
$model = " " ;
if ( $buffer && isset ( $buffer [ 0 ])) {
if ( isset ( $buffer [ 0 ][ 'Manufacturer' ]) && ! preg_match ( " /^To be filled by O \ .E \ .M \ . $ |^System manufacturer $ |^Not Specified $ /i " , $buf2 = trim ( $buffer [ 0 ][ 'Manufacturer' ])) && ( $buf2 !== " " )) {
$buf .= ' ' . $buf2 ;
}
if ( isset ( $buffer [ 0 ][ 'Model' ]) && ! preg_match ( " /^To be filled by O \ .E \ .M \ . $ |^System Product Name $ |^Not Specified $ /i " , $buf2 = trim ( $buffer [ 0 ][ 'Model' ])) && ( $buf2 !== " " )) {
$model = $buf2 ;
$buf .= ' ' . $buf2 ;
2024-09-07 20:53:46 +10:00
}
}
2025-05-14 16:14:01 +01:00
if ( $bufferp && isset ( $bufferp [ 0 ])) {
if ( isset ( $bufferp [ 0 ][ 'Product' ]) && ! preg_match ( " /^To be filled by O \ .E \ .M \ . $ |^BaseBoard Product Name $ |^Not Specified $ |^Default string $ /i " , $buf2 = trim ( $bufferp [ 0 ][ 'Product' ])) && ( $buf2 !== " " )) {
if ( $buf2 !== $model ) {
$buf .= '/' . $buf2 ;
} elseif ( isset ( $buffer [ 0 ][ 'SystemFamily' ]) && ! preg_match ( " /^To be filled by O \ .E \ .M \ . $ |^System Family $ |^Not Specified $ /i " , $buf2 = trim ( $buffer [ 0 ][ 'SystemFamily' ])) && ( $buf2 !== " " )) {
$buf .= '/' . $buf2 ;
}
}
}
if ( $bufferb && isset ( $bufferb [ 0 ])) {
$bver = " " ;
$brel = " " ;
if ( isset ( $bufferb [ 0 ][ 'SMBIOSBIOSVersion' ]) && (( $buf2 = trim ( $bufferb [ 0 ][ 'SMBIOSBIOSVersion' ])) !== " " )) {
$bver .= ' ' . $buf2 ;
}
if ( isset ( $bufferb [ 0 ][ 'ReleaseDate' ])) {
if ( preg_match ( " /^( \ d { 4})( \ d { 2})( \ d { 2}) \ d { 6} \ . \ d { 6} \ + \ d { 3} $ / " , $bufferb [ 0 ][ 'ReleaseDate' ], $dateout )) {
$brel .= ' ' . $dateout [ 2 ] . '/' . $dateout [ 3 ] . '/' . $dateout [ 1 ];
} elseif ( preg_match ( " /^ \ d { 2} \ / \ d { 2} \ / \ d { 4} $ / " , $bufferb [ 0 ][ 'ReleaseDate' ])) {
$brel .= ' ' . $bufferb [ 0 ][ 'ReleaseDate' ];
}
}
if (( trim ( $bver ) !== " " ) || ( trim ( $brel ) !== " " )) {
$buf .= ', BIOS' . $bver . $brel ;
}
}
if ( trim ( $buf ) != " " ) {
$this -> sys -> setMachine ( trim ( $buf ));
}
2024-09-07 20:53:46 +10:00
}
/**
* Hardwaredevices
*
* @ return void
*/
private function _hardware ()
{
foreach ( $this -> _devicelist ( 'PCI' ) as $pciDev ) {
$dev = new HWDevice ();
2025-05-14 16:14:01 +01:00
$dev -> setName ( $pciDev [ 'Name' ]);
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
if (( $pciDev [ 'Manufacturer' ] !== null ) && preg_match ( " /^@[^ \ .]+ \ .inf,%([^%]+)% $ /i " , trim ( $pciDev [ 'Manufacturer' ]), $mbuff )) {
$dev -> setManufacturer ( $mbuff [ 1 ]);
} else {
$dev -> setManufacturer ( $pciDev [ 'Manufacturer' ]);
}
$dev -> setProduct ( $pciDev [ 'Product' ]);
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setPciDevices ( $dev );
}
foreach ( $this -> _devicelist ( 'IDE' ) as $ideDev ) {
$dev = new HWDevice ();
2025-05-14 16:14:01 +01:00
$dev -> setName ( $ideDev [ 'Name' ]);
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
$dev -> setCapacity ( $ideDev [ 'Capacity' ]);
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL ) {
$dev -> setSerial ( $ideDev [ 'Serial' ]);
}
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setIdeDevices ( $dev );
}
foreach ( $this -> _devicelist ( 'SCSI' ) as $scsiDev ) {
$dev = new HWDevice ();
2025-05-14 16:14:01 +01:00
$dev -> setName ( $scsiDev [ 'Name' ]);
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
$dev -> setCapacity ( $scsiDev [ 'Capacity' ]);
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL ) {
$dev -> setSerial ( $scsiDev [ 'Serial' ]);
}
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setScsiDevices ( $dev );
}
foreach ( $this -> _devicelist ( 'USB' ) as $usbDev ) {
$dev = new HWDevice ();
2025-05-14 16:14:01 +01:00
$dev -> setName ( $usbDev [ 'Name' ]);
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
$dev -> setManufacturer ( $usbDev [ 'Manufacturer' ]);
$dev -> setProduct ( $usbDev [ 'Product' ]);
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL ) {
$dev -> setSerial ( $usbDev [ 'Serial' ]);
}
}
2024-09-07 20:53:46 +10:00
$this -> sys -> setUsbDevices ( $dev );
}
}
/**
* Network devices
*
* @ return void
*/
private function _network ()
{
2025-05-14 16:14:01 +01:00
if ( self :: $_wmi ) {
$buffer = $this -> _get_Win32_OperatingSystem ();
if ( $buffer && isset ( $buffer [ 0 ]) && isset ( $buffer [ 0 ][ 'Version' ]) && version_compare ( $buffer [ 0 ][ 'Version' ], " 6.2 " , " >= " )) { // minimal windows 2012 or windows 8
$allDevices = self :: getWMI ( self :: $_wmi , 'Win32_PerfRawData_Tcpip_NetworkAdapter' , array ( 'Name' , 'BytesSentPersec' , 'BytesTotalPersec' , 'BytesReceivedPersec' , 'PacketsReceivedErrors' , 'PacketsReceivedDiscarded' , 'CurrentBandwidth' ));
} else {
$allDevices = self :: getWMI ( self :: $_wmi , 'Win32_PerfRawData_Tcpip_NetworkInterface' , array ( 'Name' , 'BytesSentPersec' , 'BytesTotalPersec' , 'BytesReceivedPersec' , 'PacketsReceivedErrors' , 'PacketsReceivedDiscarded' , 'CurrentBandwidth' ));
}
if ( $allDevices ) {
$aliases = array ();
$hkey = " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ Network \\ { 4D36E972-E325-11CE-BFC1-08002BE10318} " ;
if ( self :: enumKey ( $this -> _reg , $hkey , $arrBuf , false )) {
foreach ( $arrBuf as $netID ) {
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $netID . " \\ Connection \\ PnPInstanceId " , $strInstanceID , false )) {
if ( self :: readReg ( $this -> _reg , " HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Enum \\ " . $strInstanceID . " \\ FriendlyName " , $strName , false )) {
$cname = str_replace ( array ( '(' , ')' , '#' , '/' ), array ( '[' , ']' , '_' , '_' ), $strName ); //convert to canonical
if ( ! isset ( $aliases [ $cname ])) { // duplicate checking
$aliases [ $cname ][ 'id' ] = $netID ;
$aliases [ $cname ][ 'name' ] = $strName ;
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $netID . " \\ Connection \\ Name " , $strCName , false )
&& ( str_replace ( array ( '(' , ')' , '#' , '/' ), array ( '[' , ']' , '_' , '_' ), $strCName ) !== $cname )) {
$aliases [ $cname ][ 'netname' ] = $strCName ;
}
} else {
$aliases [ $cname ][ 'id' ] = '' ;
}
}
}
}
}
$aliases2 = array ();
$hkey = " HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows NT \\ CurrentVersion \\ NetworkCards " ;
if ( self :: enumKey ( $this -> _reg , $hkey , $arrBuf , false )) {
foreach ( $arrBuf as $netCount ) {
if ( self :: readReg ( $this -> _reg , $hkey . " \\ " . $netCount . " \\ Description " , $strName , false )
&& self :: readReg ( $this -> _reg , $hkey . " \\ " . $netCount . " \\ ServiceName " , $strGUID , false )) {
$cname = str_replace ( array ( '(' , ')' , '#' , '/' ), array ( '[' , ']' , '_' , '_' ), $strName ); //convert to canonical
if ( ! isset ( $aliases2 [ $cname ])) { // duplicate checking
$aliases2 [ $cname ][ 'id' ] = $strGUID ;
$aliases2 [ $cname ][ 'name' ] = $strName ;
} else {
$aliases2 [ $cname ][ 'id' ] = '' ;
}
}
}
}
$allNetworkAdapterConfigurations = self :: getWMI ( self :: $_wmi , 'Win32_NetworkAdapterConfiguration' , array ( 'SettingID' , /*'Description',*/ 'MACAddress' , 'IPAddress' ));
foreach ( $allDevices as $device ) if ( ! preg_match ( '/^WAN Miniport \[/' , $device [ 'Name' ])) {
$dev = new NetDevice ();
$name = $device [ 'Name' ];
if ( preg_match ( '/^isatap\.({[A-Fa-f0-9\-]*})/' , $name )) {
$dev -> setName ( " Microsoft ISATAP Adapter " );
} else {
if ( preg_match ( '/\s-\s([^-]*)$/' , $name , $ar_name )) {
$name = substr ( $name , 0 , strlen ( $name ) - strlen ( $ar_name [ 0 ]));
}
$dev -> setName ( $name );
}
$macexist = false ;
if (((( $ali = $aliases ) && isset ( $ali [ $name ])) || (( $ali = $aliases2 ) && isset ( $ali [ $name ]))) && isset ( $ali [ $name ][ 'id' ]) && ( $ali [ $name ][ 'id' ] !== " " )) {
foreach ( $allNetworkAdapterConfigurations as $NetworkAdapterConfiguration ) {
if ( $ali [ $name ][ 'id' ] == $NetworkAdapterConfiguration [ 'SettingID' ]) {
$mininame = $ali [ $name ][ 'name' ];
if ( preg_match ( '/^isatap\.({[A-Fa-f0-9\-]*})/' , $mininame ))
$mininame = " Microsoft ISATAP Adapter " ;
elseif ( preg_match ( '/\s-\s([^-]*)$/' , $mininame , $ar_name ))
$name = substr ( $mininame , 0 , strlen ( $mininame ) - strlen ( $ar_name [ 0 ]));
$dev -> setName ( $mininame );
if ( isset ( $NetworkAdapterConfiguration [ 'MACAddress' ]) && trim ( $NetworkAdapterConfiguration [ 'MACAddress' ]) !== " " ) $macexist = true ;
if ( defined ( 'PSI_SHOW_NETWORK_INFOS' ) && PSI_SHOW_NETWORK_INFOS ) {
if ( isset ( $ali [ $name ][ 'netname' ])) $dev -> setInfo ( str_replace ( ';' , ':' , $ali [ $name ][ 'netname' ]));
if (( ! defined ( 'PSI_HIDE_NETWORK_MACADDR' ) || ! PSI_HIDE_NETWORK_MACADDR )
&& $macexist ) $dev -> setInfo (( $dev -> getInfo () ? $dev -> getInfo () . ';' : '' ) . str_replace ( ':' , '-' , strtoupper ( trim ( $NetworkAdapterConfiguration [ 'MACAddress' ]))));
if ( isset ( $NetworkAdapterConfiguration [ 'IPAddress' ]))
foreach ( $NetworkAdapterConfiguration [ 'IPAddress' ] as $ipaddres )
if (( $ipaddres != " 0.0.0.0 " ) && ( $ipaddres != " :: " ) && ! preg_match ( '/^fe80::/i' , $ipaddres ))
$dev -> setInfo (( $dev -> getInfo () ? $dev -> getInfo () . ';' : '' ) . strtolower ( $ipaddres ));
}
2024-09-07 20:53:46 +10:00
2025-05-14 16:14:01 +01:00
break ;
}
}
}
2024-09-07 20:53:46 +10:00
2025-05-14 16:14:01 +01:00
if ( $macexist
// || ($device['CurrentBandwidth'] >= 1000000)
|| ( $device [ 'BytesTotalPersec' ] != 0 )
|| ( $device [ 'BytesSentPersec' ] != 0 )
|| ( $device [ 'BytesReceivedPersec' ] != 0 )
|| ( $device [ 'PacketsReceivedErrors' ] != 0 )
|| ( $device [ 'PacketsReceivedDiscarded' ] != 0 )) { // hide unused
2024-09-07 20:53:46 +10:00
if ( defined ( 'PSI_SHOW_NETWORK_INFOS' ) && PSI_SHOW_NETWORK_INFOS ) {
2025-05-14 16:14:01 +01:00
if (( $speedinfo = $device [ 'CurrentBandwidth' ]) >= 1000000 ) {
if ( $speedinfo > 1000000000 ) {
$dev -> setInfo (( $dev -> getInfo () ? $dev -> getInfo () . ';' : '' ) . round ( $speedinfo / 1000000000 , 2 ) . " Gb/s " );
} else {
$dev -> setInfo (( $dev -> getInfo () ? $dev -> getInfo () . ';' : '' ) . round ( $speedinfo / 1000000 , 2 ) . " Mb/s " );
}
}
}
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_perfrawdata_tcpip_networkinterface.asp
// there is a possible bug in the wmi interfaceabout uint32 and uint64: http://www.ureader.com/message/1244948.aspx, so that
// magative numbers would occour, try to calculate the nagative value from total - positive number
$txbytes = $device [ 'BytesSentPersec' ];
$rxbytes = $device [ 'BytesReceivedPersec' ];
if (( $txbytes < 0 ) && ( $rxbytes < 0 )) {
$txbytes += 4294967296 ;
$rxbytes += 4294967296 ;
} elseif ( $txbytes < 0 ) {
if ( $device [ 'BytesTotalPersec' ] > $rxbytes )
$txbytes = $device [ 'BytesTotalPersec' ] - $rxbytes ;
else
$txbytes += 4294967296 ;
} elseif ( $rxbytes < 0 ) {
if ( $device [ 'BytesTotalPersec' ] > $txbytes )
$rxbytes = $device [ 'BytesTotalPersec' ] - $txbytes ;
else
$rxbytes += 4294967296 ;
2024-09-07 20:53:46 +10:00
}
2025-05-14 16:14:01 +01:00
$dev -> setTxBytes ( $txbytes );
$dev -> setRxBytes ( $rxbytes );
$dev -> setErrors ( $device [ 'PacketsReceivedErrors' ]);
$dev -> setDrops ( $device [ 'PacketsReceivedDiscarded' ]);
2024-09-07 20:53:46 +10:00
2025-05-14 16:14:01 +01:00
$this -> sys -> setNetDevices ( $dev );
}
2024-09-07 20:53:46 +10:00
}
}
2025-05-14 16:14:01 +01:00
} elseif (( $buffer = $this -> _get_systeminfo ()) && preg_match ( '/^(\s+)\[\d+\]:[^\r\n]+\r\n\s+[^\s\[]/m' , $buffer , $matches , PREG_OFFSET_CAPTURE )) {
$netbuf = substr ( $buffer , $matches [ 0 ][ 1 ]);
if ( preg_match ( '/^[^\s]/m' , $netbuf , $matches2 , PREG_OFFSET_CAPTURE )) {
$netbuf = substr ( $netbuf , 0 , $matches2 [ 0 ][ 1 ]);
}
$netstrs = preg_split ( '/^' . $matches [ 1 ][ 0 ] . '\[\d+\]:/m' , $netbuf , - 1 , PREG_SPLIT_NO_EMPTY );
$devnr = 0 ;
foreach ( $netstrs as $netstr ) {
$netstrls = preg_split ( '/\r\n/' , $netstr , - 1 , PREG_SPLIT_NO_EMPTY );
if ( sizeof ( $netstrls ) > 1 ) {
$dev = new NetDevice ();
foreach ( $netstrls as $nr => $netstrl ) {
if ( $nr === 0 ) {
$name = trim ( $netstrl );
if ( $name !== " " ) {
$dev -> setName ( $name );
} else {
$dev -> setName ( 'dev' . $devnr );
$devnr ++ ;
}
} elseif ( preg_match ( '/\[\d+\]:\s+(.+)/' , $netstrl , $netinfo )) {
$ipaddres = trim ( $netinfo [ 1 ]);
if (( $ipaddres != " 0.0.0.0 " ) && ! preg_match ( '/^fe80::/i' , $ipaddres ))
$dev -> setInfo (( $dev -> getInfo () ? $dev -> getInfo () . ';' : '' ) . strtolower ( $ipaddres ));
2024-09-07 20:53:46 +10:00
}
}
2025-05-14 16:14:01 +01:00
$this -> sys -> setNetDevices ( $dev );
2024-09-07 20:53:46 +10:00
}
}
}
}
/**
* Physical memory information and Swap Space information
*
* @ link http :// msdn2 . microsoft . com / En - US / library / aa394239 . aspx
* @ link http :// msdn2 . microsoft . com / en - us / library / aa394246 . aspx
* @ return void
*/
private function _memory ()
{
2025-05-14 16:14:01 +01:00
if ( self :: $_wmi ) {
$buffer = $this -> _get_Win32_OperatingSystem ();
if ( $buffer ) {
$this -> sys -> setMemTotal ( $buffer [ 0 ][ 'TotalVisibleMemorySize' ] * 1024 );
$this -> sys -> setMemFree ( $buffer [ 0 ][ 'FreePhysicalMemory' ] * 1024 );
$this -> sys -> setMemUsed ( $this -> sys -> getMemTotal () - $this -> sys -> getMemFree ());
}
$buffer = self :: getWMI ( self :: $_wmi , 'Win32_PageFileUsage' );
foreach ( $buffer as $swapdevice ) {
$dev = new DiskDevice ();
$dev -> setName ( " SWAP " );
$dev -> setMountPoint ( $swapdevice [ 'Name' ]);
$dev -> setTotal ( $swapdevice [ 'AllocatedBaseSize' ] * 1024 * 1024 );
$dev -> setUsed ( $swapdevice [ 'CurrentUsage' ] * 1024 * 1024 );
$dev -> setFree ( $dev -> getTotal () - $dev -> getUsed ());
$dev -> setFsType ( 'swap' );
$this -> sys -> setSwapDevices ( $dev );
}
} elseif (( $buffer = $this -> _get_systeminfo ()) && preg_match ( " /: \ s([ \ d \xFF ]+) \ sMB \r \n .+: \ s([ \ d \xFF ]+) \ sMB \r \n .+: \ s([ \ d \xFF ]+) \ sMB \r \n .+: \ s([ \ d \xFF ]+) \ sMB \r \n .+ \ s([ \ d \xFF ]+) \ sMB \r \n /m " , $buffer , $buffer2 )) {
// && (preg_match("/:\s([\d \xFF]+)\sMB\r\n.+:\s([\d \xFF]+)\sMB\r\n.+:\s([\d \xFF]+)\sMB\r\n.+:\s([\d \xFF]+)\sMB\r\n.+\s([\d \xFF]+)\sMB\r\n.*:\s+(\S+)\r\n/m", $buffer, $buffer2)) {
$this -> sys -> setMemTotal ( preg_replace ( '/(\s)|(\xFF)/' , '' , $buffer2 [ 1 ]) * 1024 * 1024 );
$this -> sys -> setMemFree ( preg_replace ( '/(\s)|(\xFF)/' , '' , $buffer2 [ 2 ]) * 1024 * 1024 );
2024-09-07 20:53:46 +10:00
$this -> sys -> setMemUsed ( $this -> sys -> getMemTotal () - $this -> sys -> getMemFree ());
}
}
/**
* filesystem information
*
* @ return void
*/
private function _filesystems ()
{
$typearray = array ( 'Unknown' , 'No Root Directory' , 'Removable Disk' , 'Local Disk' , 'Network Drive' , 'Compact Disc' , 'RAM Disk' );
$floppyarray = array ( 'Unknown' , '5 1/4 in.' , '3 1/2 in.' , '3 1/2 in.' , '3 1/2 in.' , '3 1/2 in.' , '5 1/4 in.' , '5 1/4 in.' , '5 1/4 in.' , '5 1/4 in.' , '5 1/4 in.' , 'Other' , 'HD' , '3 1/2 in.' , '3 1/2 in.' , '5 1/4 in.' , '5 1/4 in.' , '3 1/2 in.' , '3 1/2 in.' , '5 1/4 in.' , '3 1/2 in.' , '3 1/2 in.' , '8 in.' );
2025-05-14 16:14:01 +01:00
$buffer = self :: getWMI ( self :: $_wmi , 'Win32_LogicalDisk' , array ( 'Name' , 'Size' , 'FreeSpace' , 'FileSystem' , 'DriveType' , 'MediaType' ));
2024-09-07 20:53:46 +10:00
foreach ( $buffer as $filesystem ) {
$dev = new DiskDevice ();
$dev -> setMountPoint ( $filesystem [ 'Name' ]);
2025-05-14 16:14:01 +01:00
if ( isset ( $filesystem [ 'FileSystem' ])) {
$dev -> setFsType ( $filesystem [ 'FileSystem' ]);
}
2024-09-07 20:53:46 +10:00
if ( $filesystem [ 'Size' ] > 0 ) {
$dev -> setTotal ( $filesystem [ 'Size' ]);
$dev -> setFree ( $filesystem [ 'FreeSpace' ]);
$dev -> setUsed ( $filesystem [ 'Size' ] - $filesystem [ 'FreeSpace' ]);
}
if ( $filesystem [ 'MediaType' ] != " " && $filesystem [ 'DriveType' ] == 2 ) {
$dev -> setName ( $typearray [ $filesystem [ 'DriveType' ]] . " ( " . $floppyarray [ $filesystem [ 'MediaType' ]] . " ) " );
} else {
$dev -> setName ( $typearray [ $filesystem [ 'DriveType' ]]);
}
$this -> sys -> setDiskDevices ( $dev );
}
2025-05-14 16:14:01 +01:00
if ( ! $buffer && ! defined ( 'PSI_EMU_HOSTNAME' )) {
$letters = array ();
if ( CommonFunctions :: executeProgram ( 'fsutil' , 'fsinfo drives 2>nul' , $out_value , false ) && ( $out_value !== '' ) && preg_match ( '/^Drives:\s*(.+)$/i' , $out_value , $disks )) {
$diskarr = preg_split ( '/ /' , $disks [ 1 ], - 1 , PREG_SPLIT_NO_EMPTY );
foreach ( $diskarr as $disk ) if ( preg_match ( '/^(\w):\\\\$/' , $disk , $diskletter )) {
$letters [] = $diskletter [ 1 ];
}
}
if ( count ( $letters ) == 0 ) for ( $letter = 'A' ; $letter != 'AA' ; $letter ++ ) {
$letters [] = $letter ;
}
if (( substr ( $this -> sys -> getDistribution (), 0 , 7 ) == " ReactOS " ) && CommonFunctions :: executeProgram ( 'cmd' , '/c free 2>nul' , $out_value , false )) {
foreach ( $letters as $letter ) if ( CommonFunctions :: executeProgram ( 'cmd' , '/c free ' . $letter . ': 2>nul' , $out_value , false )) {
$values = preg_replace ( '/[^\d\n]/' , '' , $out_value );
if ( preg_match ( '/\n(\d+)\n(\d+)\n(\d+)$/' , $values , $out_dig )) {
$size = $out_dig [ 1 ];
$used = $out_dig [ 2 ];
$free = $out_dig [ 3 ];
2024-09-07 20:53:46 +10:00
if ( $used + $free == $size ) {
$dev = new DiskDevice ();
$dev -> setMountPoint ( $letter . " : " );
2025-05-14 16:14:01 +01:00
if ( CommonFunctions :: executeProgram ( 'fsutil' , 'fsinfo volumeinfo ' . $letter . ':\ 2>nul' , $out_value , false ) && ( $out_value !== '' ) && preg_match ( '/\nFile System Name\s*:\s*(\S+)/im' , $out_value , $fsname )) {
$dev -> setFsType ( $fsname [ 1 ]);
} else {
$dev -> setFsType ( 'Unknown' );
}
$dev -> setName ( 'Unknown' );
2024-09-07 20:53:46 +10:00
$dev -> setTotal ( $size );
$dev -> setUsed ( $used );
2025-05-14 16:14:01 +01:00
$dev -> setFree ( $free );
2024-09-07 20:53:46 +10:00
$this -> sys -> setDiskDevices ( $dev );
}
}
}
2025-05-14 16:14:01 +01:00
} else {
if ( substr ( $this -> sys -> getDistribution (), 0 , 7 ) == " ReactOS " ) {
$disksep = ':\\' ;
} else {
$disksep = ':' ;
}
foreach ( $letters as $letter ) {
$size = disk_total_space ( $letter . ':\\' );
$free = disk_free_space ( $letter . ':\\' );
if (( $size !== false ) && ( $free !== false ) && ( $size >= 0 ) && ( $free >= 0 ) && ( $size >= $free )) {
$dev = new DiskDevice ();
$dev -> setMountPoint ( $letter . " : " );
if ( CommonFunctions :: executeProgram ( 'fsutil' , 'fsinfo volumeinfo ' . $letter . $disksep . ' 2>nul' , $out_value , false ) && ( $out_value !== '' ) && preg_match ( '/\nFile System Name\s*:\s*(\S+)/im' , $out_value , $fsname )) {
$dev -> setFsType ( $fsname [ 1 ]);
} else {
$dev -> setFsType ( 'Unknown' );
}
$dev -> setName ( 'Unknown' );
$dev -> setTotal ( $size );
$dev -> setUsed ( $size - $free );
$dev -> setFree ( $free );
$this -> sys -> setDiskDevices ( $dev );
}
}
2024-09-07 20:53:46 +10:00
}
}
}
/**
* get os specific encoding
*
* @ see OS :: getEncoding ()
*
* @ return string
*/
public function getEncoding ()
{
return $this -> _codepage ;
}
/**
* get os specific language
*
* @ see OS :: getLanguage ()
*
* @ return string
*/
public function getLanguage ()
{
return $this -> _syslang ;
}
public function _processes ()
{
$processes [ '*' ] = 0 ;
2025-05-14 16:14:01 +01:00
if ( ! defined ( 'PSI_EMU_HOSTNAME' ) && CommonFunctions :: executeProgram ( 'qprocess' , '*' , $strBuf , false ) && ( strlen ( $strBuf ) > 0 )) {
2024-09-07 20:53:46 +10:00
$lines = preg_split ( '/\n/' , $strBuf );
2025-05-14 16:14:01 +01:00
$processes [ '*' ] = ( count ( $lines ) - 1 ) - 3 ; //correction for process "qprocess *"
2024-09-07 20:53:46 +10:00
}
if ( $processes [ '*' ] <= 0 ) {
2025-05-14 16:14:01 +01:00
$buffer = self :: getWMI ( self :: $_wmi , 'Win32_Process' , array ( 'Caption' ));
2024-09-07 20:53:46 +10:00
$processes [ '*' ] = count ( $buffer );
}
$processes [ ' ' ] = $processes [ '*' ];
$this -> sys -> setProcesses ( $processes );
}
2025-05-14 16:14:01 +01:00
/**
* MEM information
*
* @ return void
*/
private function _meminfo ()
{
$allMems = self :: _get_Win32_PhysicalMemory ();
if ( $allMems ) {
$reg = false ;
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
$arrMems = self :: getWMI ( self :: $_wmi , 'Win32_PhysicalMemoryArray' , array ( 'MemoryErrorCorrection' ));
$reg = ( count ( $arrMems ) == 1 ) && isset ( $arrMems [ 0 ][ 'MemoryErrorCorrection' ]) && ( $arrMems [ 0 ][ 'MemoryErrorCorrection' ] == 6 );
}
foreach ( $allMems as $mem ) {
$dev = new HWDevice ();
$name = '' ;
if ( isset ( $mem [ 'PartNumber' ]) && ! preg_match ( " /^PartNum \ d+ $ / " , $part = $mem [ 'PartNumber' ]) && ( $part != '' ) && ( $part != 'None' ) && ( $part != 'N/A' ) && ( $part != 'NOT AVAILABLE' )) {
$name = $part ;
}
if ( isset ( $mem [ 'DeviceLocator' ]) && (( $dloc = $mem [ 'DeviceLocator' ]) != '' ) && ( $dloc != 'None' ) && ( $dloc != 'N/A' )) {
if ( $name != '' ) {
$name .= ' - ' . $dloc ;
} else {
$name = $dloc ;
}
}
if ( isset ( $mem [ 'BankLabel' ]) && (( $bank = $mem [ 'BankLabel' ]) != '' ) && ( $bank != 'None' ) && ( $bank != 'N/A' )) {
if ( $name != '' ) {
$name .= ' in ' . $bank ;
} else {
$name = 'Physical Memory in ' . $bank ;
}
}
if ( $name != '' ) {
$dev -> setName ( trim ( $name ));
} else {
$dev -> setName ( 'Physical Memory' );
}
if ( defined ( 'PSI_SHOW_DEVICES_INFOS' ) && PSI_SHOW_DEVICES_INFOS ) {
if ( isset ( $mem [ 'Manufacturer' ]) && ! preg_match ( " /^([A-F \ d] { 4}|[A-F \ d] { 12}|[A-F \ d] { 16}) $ / " , $manufacturer = $mem [ 'Manufacturer' ]) && ! preg_match ( " /^Manufacturer \ d+ $ / " , $manufacturer ) && ! preg_match ( " /^Mfg \ d+ $ / " , $manufacturer ) && ( $manufacturer != '' ) && ( $manufacturer != 'None' ) && ( $manufacturer != 'N/A' ) && ( $manufacturer != 'UNKNOWN' )) {
$dev -> setManufacturer ( $manufacturer );
}
if ( isset ( $mem [ 'Capacity' ])) {
$dev -> setCapacity ( $mem [ 'Capacity' ]);
}
$memtype = '' ;
if ( isset ( $mem [ 'MemoryType' ]) && (( $memval = $mem [ 'MemoryType' ]) != 0 )) {
switch ( $memval ) {
// case 0: $memtype = 'Unknown'; break;
// case 1: $memtype = 'Other'; break;
case 2 : $memtype = 'DRAM' ; break ;
case 3 : $memtype = 'Synchronous DRAM' ; break ;
case 4 : $memtype = 'Cache DRAM' ; break ;
case 5 : $memtype = 'EDO' ; break ;
case 6 : $memtype = 'EDRAM' ; break ;
case 7 : $memtype = 'VRAM' ; break ;
case 8 : $memtype = 'SRAM' ; break ;
case 9 : $memtype = 'RAM' ; break ;
case 10 : $memtype = 'ROM' ; break ;
case 11 : $memtype = 'Flash' ; break ;
case 12 : $memtype = 'EEPROM' ; break ;
case 13 : $memtype = 'FEPROM' ; break ;
case 14 : $memtype = 'EPROM' ; break ;
case 15 : $memtype = 'CDRAM' ; break ;
case 16 : $memtype = '3DRAM' ; break ;
case 17 : $memtype = 'SDRAM' ; break ;
case 18 : $memtype = 'SGRAM' ; break ;
case 19 : $memtype = 'RDRAM' ; break ;
case 20 : $memtype = 'DDR' ; break ;
case 21 : $memtype = 'DDR2' ; break ;
case 22 : $memtype = 'DDR2 FB-DIMM' ; break ;
case 24 : $memtype = 'DDR3' ; break ;
case 25 : $memtype = 'FBD2' ; break ;
case 26 : $memtype = 'DDR4' ;
}
} elseif ( isset ( $mem [ 'SMBIOSMemoryType' ])) {
switch ( $mem [ 'SMBIOSMemoryType' ]) {
// case 0: $memtype = 'Invalid'; break;
// case 1: $memtype = 'Other'; break;
// case 2: $memtype = 'Unknown'; break;
case 3 : $memtype = 'DRAM' ; break ;
case 4 : $memtype = 'EDRAM' ; break ;
case 5 : $memtype = 'VRAM' ; break ;
case 6 : $memtype = 'SRAM' ; break ;
case 7 : $memtype = 'RAM' ; break ;
case 8 : $memtype = 'ROM' ; break ;
case 9 : $memtype = 'FLASH' ; break ;
case 10 : $memtype = 'EEPROM' ; break ;
case 11 : $memtype = 'FEPROM' ; break ;
case 12 : $memtype = 'EPROM' ; break ;
case 13 : $memtype = 'CDRAM' ; break ;
case 14 : $memtype = '3DRAM' ; break ;
case 15 : $memtype = 'SDRAM' ; break ;
case 16 : $memtype = 'SGRAM' ; break ;
case 17 : $memtype = 'RDRAM' ; break ;
case 18 : $memtype = 'DDR' ; break ;
case 19 : $memtype = 'DDR2' ; break ;
case 20 : $memtype = 'DDR2 FB-DIMM' ; break ;
case 24 : $memtype = 'DDR3' ; break ;
case 25 : $memtype = 'FBD2' ; break ;
case 26 : $memtype = 'DDR4' ; break ;
case 27 : $memtype = 'LPDDR' ; break ;
case 28 : $memtype = 'LPDDR2' ; break ;
case 29 : $memtype = 'LPDDR3' ; break ;
case 30 : $memtype = 'DDR3' ; break ;
case 31 : $memtype = 'FBD2' ; break ;
case 32 : $memtype = 'Logical non-volatile device' ; break ;
case 33 : $memtype = 'HBM2' ; break ;
case 34 : $memtype = 'DDR5' ; break ;
case 35 : $memtype = 'LPDDR5' ;
}
}
if ( isset ( $mem [ 'Speed' ]) && (( $speed = $mem [ 'Speed' ]) > 0 ) && ( preg_match ( '/^(DDR\d*)(.*)/' , $memtype , $dr ) || preg_match ( '/^(SDR)AM(.*)/' , $memtype , $dr ))) {
if ( isset ( $mem [ 'MinVoltage' ]) && isset ( $mem [ 'MaxVoltage' ]) && (( $minv = $mem [ 'MinVoltage' ]) > 0 ) && (( $maxv = $mem [ 'MaxVoltage' ]) > 0 ) && ( $minv < $maxv )) {
$lv = 'L' ;
} else {
$lv = '' ;
}
if ( isset ( $dr [ 2 ])) {
$memtype = $dr [ 1 ] . $lv . '-' . $speed . ' ' . $dr [ 2 ];
} else {
$memtype = $dr [ 1 ] . $lv . '-' . $speed ;
}
}
if ( isset ( $mem [ 'FormFactor' ])) {
switch ( $mem [ 'FormFactor' ]) {
// case 0: $memtype .= ' Unknown'; break;
// case 1: $memtype .= ' Other'; break;
case 2 : $memtype .= ' SIP' ; break ;
case 3 : $memtype .= ' DIP' ; break ;
case 4 : $memtype .= ' ZIP' ; break ;
case 5 : $memtype .= ' SOJ' ; break ;
case 6 : $memtype .= ' Proprietary' ; break ;
case 7 : $memtype .= ' SIMM' ; break ;
case 8 : $memtype .= ' DIMM' ; break ;
case 9 : $memtype .= ' TSOPO' ; break ;
case 10 : $memtype .= ' PGA' ; break ;
case 11 : $memtype .= ' RIM' ; break ;
case 12 : $memtype .= ' SODIMM' ; break ;
case 13 : $memtype .= ' SRIMM' ; break ;
case 14 : $memtype .= ' SMD' ; break ;
case 15 : $memtype .= ' SSMP' ; break ;
case 16 : $memtype .= ' QFP' ; break ;
case 17 : $memtype .= ' TQFP' ; break ;
case 18 : $memtype .= ' SOIC' ; break ;
case 19 : $memtype .= ' LCC' ; break ;
case 20 : $memtype .= ' PLCC' ; break ;
case 21 : $memtype .= ' BGA' ; break ;
case 22 : $memtype .= ' FPBGA' ; break ;
case 23 : $memtype .= ' LGA' ;
}
}
if ( isset ( $mem [ 'DataWidth' ]) && isset ( $mem [ 'TotalWidth' ]) && (( $dataw = $mem [ 'DataWidth' ]) > 0 ) && (( $totalw = $mem [ 'TotalWidth' ]) > 0 ) && ( $dataw < $totalw )) {
$memtype .= ' ECC' ;
}
if ( $reg ) {
$memtype .= ' REG' ;
}
if (( $memtype = trim ( $memtype )) != '' ) {
$dev -> setProduct ( $memtype );
}
if ( isset ( $mem [ 'ConfiguredClockSpeed' ]) && (( $clock = $mem [ 'ConfiguredClockSpeed' ]) > 0 )) {
$dev -> setSpeed ( $clock );
}
if ( isset ( $mem [ 'ConfiguredVoltage' ]) && (( $voltage = $mem [ 'ConfiguredVoltage' ]) > 0 )) {
$dev -> setVoltage ( $voltage / 1000 );
}
if ( defined ( 'PSI_SHOW_DEVICES_SERIAL' ) && PSI_SHOW_DEVICES_SERIAL &&
isset ( $mem [ 'SerialNumber' ]) && ! preg_match ( " /^SerNum \ d+ $ / " , $serial = $mem [ 'SerialNumber' ]) && ( $serial != '' ) && ( $serial != 'None' )) {
$dev -> setSerial ( $serial );
}
}
$this -> sys -> setMemDevices ( $dev );
}
}
}
2024-09-07 20:53:46 +10:00
/**
* get the information
*
* @ see PSI_Interface_OS :: build ()
*
2025-05-14 16:14:01 +01:00
* @ return void
2024-09-07 20:53:46 +10:00
*/
public function build ()
{
2025-05-14 16:14:01 +01:00
$this -> _distro (); // share getDistribution()
if ( substr ( $this -> sys -> getDistribution (), 0 , 7 ) == " ReactOS " ) {
$this -> error -> addWarning ( " The ReactOS version of phpSysInfo is a work in progress, some things currently don't work " );
}
if ( ! $this -> blockname || $this -> blockname === 'vitals' ) {
$this -> _hostname ();
$this -> _users ();
$this -> _uptime ();
$this -> _loadavg ();
$this -> _processes ();
}
if ( ! $this -> blockname || $this -> blockname === 'hardware' ) {
$this -> _machine ();
$this -> _cpuinfo ();
$this -> _virtualizer ();
$this -> _meminfo ();
$this -> _hardware ();
}
if ( ! $this -> blockname || $this -> blockname === 'memory' ) {
$this -> _memory ();
}
if ( ! $this -> blockname || $this -> blockname === 'filesystem' ) {
$this -> _filesystems ();
}
if ( ! $this -> blockname || $this -> blockname === 'network' ) {
$this -> _network ();
}
2024-09-07 20:53:46 +10:00
}
}