// ========================================================================== // Class Specification : COXSysInfo // ========================================================================== // // Version: 9.3 // // This software along with its related components, documentation and files ("The Libraries") // is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is // governed by a software license agreement ("Agreement"). Copies of the Agreement are // available at The Code Project (www.codeproject.com), as part of the package you downloaded // to obtain this file, or directly from our office. For a copy of the license governing // this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900. // // ////////////////////////////////////////////////////////////////////////// // Properties: // // NO Abstract class (does not have any objects) // YES Derived from CObject // NO Is a CWnd // NO Two stage creation (constructor & Create()) // NO Has a message map // NO Needs a resource template // // NO Persistant objects // NO Uses exceptions // ////////////////////////////////////////////////////////////////////////// /* DESCRIPTION The COXSysInfo class is an easy way to have an application query system information. COXSysInfo provides a number of function that allow you to retrieve different useful system information in following areas: COMPUTER/NETWORK 1) Computer name 2) User name 3) Domain name (NT only) 4) Network Interface Card (NIC) address COMMUNICATION 1) Primary IP addres 2) List of IP addresses for multihomed computer WINDOWS 1) Version, build number, platform 2) Distinguishes NT from 95/98 and NT Server from NT Workstation, detects OSR2 3) Retrieves Windows, System and Temp directories DISKDRIVES 1) Type of any drive and type of file system installed on each 2) Volume name, serial number, total space, free space for any drive DISPLAY 1) Current screen resolution and color depth 2) Max available screen resolution and color depth 3) List of all display modes (unique combination of screen resolution and color depth) 4) Retrieves flag that specifies whether small or large fonts are currently used in the sytem MEMORY 1) Total and free physical memeory 2) Total and free page file size 3) Total and free virtual memeory RESOURCES 1) Detects the percentage of free system, GDI and user resources (makes sense only for Win 95/98) CPU 1) Retrieves number of processors in system 2) Type and speed of processor 3) Retrieves flag that specifies presence of CoProcessor, MMX-technology 4) Processor time stamp MODEM 1) Retrieves number of modems in system 2) For every modem installed in the system retrieves port on which it installed, desciption, manufacrurer and model info PRINTER 1) Retrieves default printer name 2) Retrieves names of all printers installed in the system 3) Every printer settings: name, server, port, driver name, environment (paper size and orientation, printer's DPI) 4) Retrieves flags that specify whether printer is local or network one, and whether it is shared or not. Refer to the COXSysInfo class function reference for details. And also it's good idea to take look at the "SystemStateInfo" sample where we show how to use COXSysInfo class to its full extent. The sample can be found in .\Samples\Advanced\SystemStateInfo subdirectory of your Ultimate Toolbox directory. Dependencies: #include "OXProcess.h" Source code files: "OXProcess.cpp" Libraries: In order to use COXSysInfo class in your project you have to link the project to Cpuinfr.lib (Release version) and Cpuinfd.lib (Debug version) these libraries can be found in .\Lib\libs subdirectory of your Ultimate Toolbox directory */ #ifndef __OXSYSINFO_H__ #define __OXSYSINFO_H__ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "OXDllExt.h" #ifndef __AFXTEMPL_H__ #include #endif #include #include // includes file for CPU speed functions extern "C" { #include "Cpuid.h" #include "Speed.h" } #include "UTB64Bit.h" // Additional processor type defines: #define PROCESSOR_UNKNOWN -1 #define PROCESSOR_MIPSR4000 4000 #define PROCESSOR_ALPHA21064 21064 #define PROCESSOR_ALPHA21066 21066 #define PROCESSOR_ALPHA21164 21164 #define PROCESSOR_PPC601 601 #define PROCESSOR_PPC603 603 #define PROCESSOR_PPC604 604 #define PROCESSOR_PPC603PLUS 606 #define PROCESSOR_PPC604PLUS 609 #define PROCESSOR_PPC620 620 #define PROCESSOR_INTEL_PENTIUMPRO 626 #define PROCESSOR_INTEL_PENTIUMCELERON 646 #define PROCESSOR_INTEL_PENTIUM2 686 #define PROCESSOR_INTEL_PENTIUM3 786 // CONSTANT DEFINITIONS //////////////////////////////////////// #define CLONE_MASK 0x8000 // Mask to be 'OR'ed with proc- // essor family type enum CPUSpeed { CPUSPEED_16=16, CPUSPEED_20=20, CPUSPEED_25=25, CPUSPEED_33=33, CPUSPEED_40=40, CPUSPEED_50=50, CPUSPEED_60=60, CPUSPEED_66=66, CPUSPEED_75=75, CPUSPEED_80=80, CPUSPEED_90=90, CPUSPEED_100=100, CPUSPEED_120=120, CPUSPEED_133=133, CPUSPEED_150=150, CPUSPEED_166=166, CPUSPEED_180=180, CPUSPEED_200=200, CPUSPEED_233=233, CPUSPEED_266=266, CPUSPEED_300=300, CPUSPEED_333=333, CPUSPEED_350=350, CPUSPEED_400=400, CPUSPEED_450=450, CPUSPEED_500=500, CPUSPEED_533=533, CPUSPEED_550=550, CPUSPEED_600=600, CPUSPEED_650=650, CPUSPEED_667=667, CPUSPEED_700=700, CPUSPEED_733=733, CPUSPEED_750=750, CPUSPEED_800=800, }; typedef struct _tagNICADDRESS { BYTE data[6]; } NICADDRESS, FAR* LPNICADDRESS; // determine number of elements in an array (not bytes) #define countof(array) (sizeof(array)/sizeof(array[0])) typedef struct _tagMODEMINFO { // number of COM port on which modem is installed int nPort; // description of modem driver CString sDriverDesc; // manafacturer info CString sManufacturer; // model info CString sModel; // assignment operator _tagMODEMINFO& operator=( const _tagMODEMINFO& mi ) { if(this==&mi) return *this; nPort=mi.nPort; sDriverDesc=mi.sDriverDesc; sManufacturer=mi.sManufacturer; sModel=mi.sModel; return *this; } } MODEMINFO, FAR* LPMODEMINFO; typedef CArray CArrayModemInfo; typedef struct _tagDISPLAYMODE { // color depth (number of bits used to save info about pixel color) DWORD dwBitsPerPixel; // color depth (number of colors) DWORDLONG dwNumColors; // horizontal screen resolution DWORD dwHorzResolution; // vertical screen resolution DWORD dwVertResolution; // Copy constructor _tagDISPLAYMODE& operator=( const _tagDISPLAYMODE& dm ) { if(this==&dm) return *this; dwBitsPerPixel=dm.dwBitsPerPixel; dwNumColors=dm.dwNumColors; dwHorzResolution=dm.dwHorzResolution; dwVertResolution=dm.dwVertResolution; return *this; } } DISPLAYMODE, FAR* LPDISPLAYMODE; typedef CArray CArrayDisplayMode; int _cdecl DevModeCompare(const void *elem1, const void *elem2); enum RESOURCETYPE { // system resources RT_SYSTEM=0, // GDI resources RT_GDI=1, // USER resources RT_USER=2 }; typedef struct _tagSYSHEAPINFO { DWORD dwSize; int nUserFreePercent; int nGDIFreePercent; int nUserSegment; int nGDISegment; _tagSYSHEAPINFO() { ::ZeroMemory(this,sizeof(*this)); dwSize=sizeof(*this); } } SYSHEAPINFO; /////////////////////////////////////////////////////////// class OX_CLASS_DECL COXSysInfo : public CObject { DECLARE_DYNAMIC(COXSysInfo); // Data members -------------------------------------------- public: protected: MEMORYSTATUS m_memStatus; SYSTEM_INFO m_sysInfo; // Member functions -------------------------------------------- public: // --- In: // --- Out: // --- Returns: // --- Effect: Constructor COXSysInfo(); // --- In: // --- Out: // --- Returns: // --- Effect: Destructor virtual ~COXSysInfo(); // ******** Computer/Network ******** // // --- In: // --- Out: psComputerName - Name of local computer // --- Returns: TRUE if success // --- Effect: Retrieves the name of the local computer BOOL GetComputerName(CString *psComputerName) const; // --- In: // --- Out: psUserName - Name of current user // --- Returns: TRUE if success // --- Effect: Retrieves the name of the current user. Works on Win95 // and Win NT BOOL GetUserName(CString *psUserName) const; // --- In: // --- Out: psUserName - Name of current user // psDomainName - Name of current domain logged on to // --- Returns: TRUE if success // --- Effect: Retrieves the name of the current user and the domain. // Works only on Win NT. BOOL GetUserAndDomainName(CString *psUserName, CString *psDomainName) const; // --- In: // --- Out: pNICAddress - valid pointer to Network // Interface Card (NIC) address structure // --- Returns: TRUE if success // --- Effect: Retrieves the NIC address BOOL GetNICAddress(LPNICADDRESS pNICAddress) const; // ********* COMMUNICATION *********** // // --- In: pszHostName - Host name for which primary // IP address will be retrieved // --- Out: psIPAddress - Current IP address (0.0.0.0 if undefined) // --- Returns: TRUE if success // --- Effect: Retrieves the current network IP address BOOL GetPrimaryIPAddress(CString* psIPAddress, LPCSTR pszHostName=NULL) const; // --- In: bPrimary - TRUE if only primary IP must be retrieved // pszHostName - Host name for which IP address // will be retrieved // --- Out: psIPAddressList - List of IP addresses // --- Returns: TRUE if success // --- Effect: Retrieves the list of network IP address of a // multi-homed computer BOOL GetListIPAddresses(CStringArray* psIPAddressList, BOOL bPrimary = FALSE, LPCSTR pszHostName=NULL) const; // ******** Windows ******** // // --- In: // --- Out: pdwPlatform - Current Windows platform // pdwMajor - Major OS version // pdwMinor - Minor OS version // --- Returns: TRUE if success // --- Effect: Retrieves the current Windows OS version BOOL GetWindowsVersion(DWORD *pdwPlatform, DWORD *pdwMajor, DWORD *pdwMinor) const; // --- In: // --- Out: pdwBuildNumber - Windows platform build number // --- Returns: TRUE if success // --- Effect: Retrieves the current Windows OS version build number BOOL GetWindowsBuildNumber(DWORD *pdwBuildNumber) const; // --- In: // --- Out: sPlatformInfo - additional information about // the operating system // --- Effect: Retrieves additional information for current // Windows OS version BOOL GetWindowsPlatformInfo(CString& sPlatformInfo) const; // --- In: // --- Out: pbResult - TRUE if Windows NT running // --- Returns: TRUE if success // --- Effect: Determines if the current Windows OS // version is NT BOOL IsNT(BOOL *pbResult) const; // --- In: // --- Out: pbResult - TRUE if Windows NT Server // installed // --- Returns: TRUE if success // --- Effect: Determines if the current Windows OS // version is NT Server or not BOOL IsNTServer(BOOL *pbResult) const; // --- In: // --- Out: pbResult - TRUE if Windows 95 OSR 2 // installed // --- Returns: TRUE if success // --- Effect: Determines if the current Windows OS // version is Windows 95 OSR 2 or not BOOL IsOSR2(BOOL *pbResult) const; // --- In: // --- Out: psWinDir - Windows directory // --- Returns: TRUE if success // --- Effect: Retrieves the Windows directory BOOL GetWindowsDir(CString *psWinDir) const; // --- In: // --- Out: psSysDir - System directory // --- Returns: TRUE if success // --- Effect: Retrieves the System directory BOOL GetSystemDir(CString *psSysDir) const; // --- In: // --- Out: psTempDir - Temp directory // --- Returns: TRUE if success // --- Effect: Retrieves the temp directory BOOL GetTempDir(CString *psTempDir) const; // ******** files ******** // // --- In: pszFileName - name of the file // bSmall - set to TRUE if small icon // is requested // bSelected - set to TRUE if icon in selected state // is requested // bFileMustExist - set to FALSE to retrieve an icon without // checking if file exist // --- Out: // --- Returns: A handle to requested icon if successful; otherwise NULL // --- Effect: Retrieves the icon associated with specified file. // It is caller responsibility to eventually destroy the // returned icon object using ::DestroyIcon() function HICON GetFileIcon( LPCTSTR pszFileName, BOOL bSmall, BOOL bSelected, BOOL bFileMustExist) const; // --- In: pszFileExt - file extension // bSmall - set to TRUE if small icon // is requested // bSelected - set to TRUE if icon in selected state // is requested // --- Out: // --- Returns: A handle to requested icon if successful; otherwise NULL // --- Effect: Retrieves the icon associated with specified file extension. // It is caller responsibility to eventually destroy the // returned icon object using ::DestroyIcon() function HICON GetFileExtIcon(LPCTSTR pszFileName, BOOL bSmall, BOOL bSelected) const; // ******** disk drives ******** // // --- In: nDrive - drive, acceptable values: 0-25 (A-Z) // --- Out: psFileSysType - File system type // pnDiskType - Disk type // --- Returns: TRUE if success // --- Effect: Retrieves disk drive information BOOL GetDriveTypeInfo(int nDrive, CString *psFileSysType, int *pnDiskType) const; // --- In: nDrive - drive, acceptable values: 0-25 (A-Z) // --- Out: psVolumeName - Disk volume name // pdwVolSer - Disk serial number // pdwTotalSpace - Total space bytes // pdwFreeSpace - Total free space bytes // --- Returns: TRUE if success // --- Effect: Retrieves disk drive volume information BOOL GetDriveVolumeInfo(int nDrive, CString *psVolumeName, DWORD *pdwVolSer, DWORDLONG *pdwTotalSpace, DWORDLONG *pdwFreeSpace) const; // ******** display ********* // // --- In: // --- Out: xRes - horizontal screen resolution (in pixels) // yRes - vertical screen resolution (in pixels) // --- Returns: TRUE if success // --- Effect: Retrieves the display resolution size BOOL GetDisplayResolution(int *pnxRes, int *pnyRes) const; // --- In: // --- Out: pdwNumColors - Number of colors used by current display // pnNumBits - Number of bits for color depth // --- Returns: TRUE if success // --- Effect: Retrieves the display color usage BOOL GetDisplayNumColors(DWORDLONG *pdwNumColors, int *pnNumBits) const; // --- In: // --- Out: parrDisplayMode - pointer to array of all possible // combinations of screen resolution and // color depth // --- Returns: TRUE if success // --- Effect: Retrieves all possible display modes BOOL GetAllDisplayModes(CArrayDisplayMode* parrDisplayMode) const; // --- In: // --- Out: xRes - max horizontal screen resolution (in pixels) // yRes - max vertical screen resolution (in pixels) // --- Returns: TRUE if success // --- Effect: Retrieves the max display resolution size BOOL GetDisplayMaxResolution(int *pnxRes, int *pnyRes) const; // --- In: // --- Out: pdwNumColors - Max number of colors used // by current display // pnNumBits - Max number of bits for color depth // --- Returns: TRUE if success // --- Effect: Retrieves the display max available color usage BOOL GetDisplayMaxNumColors(DWORDLONG *pdwNumColors, int *pnNumBits) const; // --- In: // --- Out: pbIsSmall - if TRUE then small fonts are used, // otherwise the large ones // --- Returns: TRUE if success // --- Effect: Retrieves the flag that specifies whether small or // large fonts are used in the system BOOL IsSmallFont(BOOL* pbIsSmall) const; // ******** memory ******** // // --- In: // --- Out: pdwPhysMem - Total physical RAM // --- Returns: TRUE if success // --- Effect: Retrieves the amount of physical memory BOOL GetTotalPhysicalMemory(DWORD_PTR *pdwPhysMem); // --- In: // --- Out: pdwFreeMem - Total free physical RAM // --- Returns: TRUE if success // --- Effect: Retrieves the amount of free physical memory BOOL GetFreePhysicalMemory(DWORD_PTR *pdwFreeMem); // --- In: // --- Out: pdwTotalPageFile- Total page file size // --- Returns: TRUE if success // --- Effect: Retrieves the size of the page file BOOL GetTotalPageFile(DWORD_PTR *pdwTotalPageFile); // --- In: // --- Out: pdwFreePageFile - Total free page file size // --- Returns: TRUE if success // --- Effect: Retrieves the free space of the page file BOOL GetFreePageFile(DWORD_PTR *pdwFreePageFile); // --- In: // --- Out: pdwTotalVirtual - Total virtual memory // --- Returns: TRUE if success // --- Effect: Retrieves the size of virtual memory BOOL GetTotalVirtual(DWORD_PTR *pdwTotalVirtual); // --- In: // --- Out: pdwFreeVirtual - Total free virtual memory // --- Returns: TRUE if success // --- Effect: Retrieves the size of the free virtual memory BOOL GetFreeVirtual(DWORD_PTR *pdwFreeVirtual); // ******** resources ******** // // --- In: resourceType - type of requested resource: // // RT_SYSTEM system // RT_GDI GDI // RT_USER user // // --- Out: pnFreeResources - percentage of free system resources // --- Returns: TRUE if success // --- Effect: Retrieves the percentage of free system resources BOOL GetFreeSystemResources(int *pnFreeResources, enum RESOURCETYPE resourceType) const; // ******** CPU ******** // // --- In: // --- Out: pnNumProcessors - Total number of processors on computer // --- Returns: TRUE if success // --- Effect: Retrieves the number of CPUs BOOL GetNumProcessors(int *pnNumProcessors); // --- In: // --- Out: pdwProcessorType - Processor type, one of the following: // // PROCESSOR_UNKNOWN // PROCESSOR_INTEL_386 // PROCESSOR_INTEL_486 // PROCESSOR_INTEL_PENTIUM // PROCESSOR_INTEL_PENTIUM2 // PROCESSOR_MIPS_R4000 // PROCESSOR_ALPHA_21064 // PROCESSOR_MIPSR4000 // PROCESSOR_ALPHA21064 // PROCESSOR_ALPHA21066 // PROCESSOR_ALPHA21164 // PROCESSOR_PPC601 // PROCESSOR_PPC603 // PROCESSOR_PPC604 // PROCESSOR_PPC603PLUS // PROCESSOR_PPC604PLUS // PROCESSOR_PPC620 // // --- Returns: TRUE if success // --- Effect: Retrieves the processor type (primary processor) BOOL GetProcessorType(DWORD *pdwProcessorType); // --- In: // --- Out: pbResult - TRUE if CoProcessor is present, // or FALSE otherwise // --- Returns: TRUE if success // --- Effect: Retrieves the presense of coprocessor BOOL IsCoProcessorPresent(BOOL* pbResult); // --- In: nIndex - the zero-based index of processor // --- Out: pdwProcessorSpeed - Processor speed (in MHz) // --- Returns: TRUE if success // --- Effect: Retrieves the processor speed BOOL GetProcessorSpeed(DWORD* pdwProcessorSpeed, int nIndex=0) const; // --- In: // --- Out: pdwHigh - Upper 32-bits of Time Stamp (Register value) // pdwLow - Lower 32-bits of Time Stamp (Register value) // --- Returns: TRUE if success // --- Effect: Retrieves the processor time stamp BOOL GetTimeStamp(DWORD *pdwHigh, DWORD *pdwLow) const; // --- In: // --- Out: pbMMX - TRUE if primary processor is MMX(TM) technology // processor, or FALSE otherwise // --- Returns: TRUE if success // --- Effect: Retrieves the presense of MMX processor BOOL IsMMXProcessor(BOOL* pbMMX); // --- In: // --- Out: pbOverdrive - TRUE if primary processor is Overdrive // processor, or FALSE otherwise // --- Returns: TRUE if success // --- Effect: Retrieves the flag that specifies if primary processor // is Overdrive or not BOOL IsOverdriveProcessor(BOOL* pbOverdrive); // ******** Modem ******** // // --- In: // --- Out: pnNumModems - Total number of modems installed // --- Returns: TRUE if success // --- Effect: Retrieves the number of modems installed BOOL GetNumModems(int *pnNumModems) const; // --- In: // --- Out: parrModemInfo - pointer to valid array of MODEMINFO // structures that provide information about // all installed modems // --- Returns: TRUE if success // --- Effect: Retrieves the description of all installed modems BOOL GetModemInfo(CArrayModemInfo* parrModemInfo) const; // ******* Printer ****** // // --- In: // --- Out: sPrinterName - reference to string to which the // name of the default printer will be // copied. If it is empty then there is // no default printers in the system // --- Returns: TRUE if success // --- Effect: Retrieves the name of the default printer BOOL GetDefaultPrinterName(CString& sPrinterName) const; // --- In: // --- Out: arrPrinterName - reference to string array to which the // name of found printers will be copied. // If it is empty then there is no // printers found // // --- Returns: TRUE if success // --- Effect: Retrieves the name of all printers in the system. BOOL GetAllPrintersName(CStringArray& arrPrinterName) const; // --- In: sPrinterName - reference to string which is the // name of installed printer. // --- Out: lpPrinterInfo - reference to the pointer to // PRINTER_INFO_2 structure // that will be populated with data as // result of execution of this function. // You shouldn't allocate any memory. // This function will allocate all // necessary memory. The caller will // be responsible for freeing that memory. // Use GlobalFree() function in order to // do that // --- Returns: TRUE if success // --- Effect: Retrieves the printer info for specified printer // installed in the system BOOL GetPrinterInfo(const CString& sPrinterName, LPPRINTER_INFO_2& lpPrinterInfo) const; // --- In: sPrinterName - reference to string which is the // name of installed printer. // --- Out: pbLocalPrinter - TRUE if specified printer is local, // or FALSE otherwise // --- Returns: TRUE if success // --- Effect: Retrieves the flag that specify whether the printer // is local or not BOOL IsLocalPrinter(const CString& sPrinterName, BOOL* pbLocalPrinter) const; // --- In: sPrinterName - reference to string which is the // name of installed printer. // --- Out: pbSharedPrinter - TRUE if specified printer is shared, // or FALSE otherwise // --- Returns: TRUE if success // --- Effect: Retrieves the flag that specify whether the printer // is shared or not BOOL IsSharedPrinter(const CString& sPrinterName, BOOL* pbSharedPrinter) const; protected: // Retrieves memory status void GetMemStatus(); // Retrieves info about display capabilities int DeviceCaps(int iIndex) const; // Retrives general sys info void GetSysInfo(); // Helper function to retrieve value form registry LPTSTR GetRegistryString(HKEY hKeyClass, LPTSTR lpszSubKey, LPTSTR lpszValueName) const; }; #endif // __OXSYSINFO_H__