Windows-Server-2003/sdktools/cmdline/systeminfo/systeminfo.cpp

2345 lines
66 KiB
C++

// *********************************************************************************
//
// Copyright (c) Microsoft Corporation
//
// Module Name:
//
// SystemInfo.cpp
//
// Abstract:
//
// This module displays the system information of local / remote system.
//
// Author:
//
// Sunil G.V.N. Murali (murali.sunil@wipro.com) 27-Dec-2000
//
// Revision History:
//
// Sunil G.V.N. Murali (murali.sunil@wipro.com) 27-Dec-2000 : Created It.
//
// *********************************************************************************
#include "pch.h"
#include "wmi.h"
#include "SystemInfo.h"
//
// private function prototype(s)
//
BOOL TranslateLocaleCode( CHString& strLocale );
BOOL FormatNumber( LPCWSTR strValue, CHString& strFmtValue );
BOOL FormatNumberEx( LPCWSTR pwszValue, CHString& strFmtValue );
VOID PrintProgressMsg( HANDLE hOutput, LPCWSTR pwszMsg, const CONSOLE_SCREEN_BUFFER_INFO& csbi );
DWORD __cdecl
wmain(
IN DWORD argc,
IN LPCTSTR argv[]
)
/*++
// Routine Description:
// This the entry point to this utility.
//
// Arguments:
// [ in ] argc : argument(s) count specified at the command prompt
// [ in ] argv : argument(s) specified at the command prompt
//
// Return Value:
// The below are actually not return values but are the exit values
// returned to the OS by this application
// 0 : utility is successfull
// 1 : utility failed
--*/
{
// local variables
CSystemInfo sysinfo;
BOOL bResult = FALSE;
// initialize the systeminfo utility
if ( sysinfo.Initialize() == FALSE )
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
EXIT_PROCESS( 1 );
}
// now do parse the command line options
if ( sysinfo.ProcessOptions( argc, argv ) == FALSE )
{
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
EXIT_PROCESS( 1 );
}
// check whether usage has to be displayed or not
if ( sysinfo.m_bUsage == TRUE )
{
// show the usage of the utility
sysinfo.ShowUsage();
// quit from the utility
EXIT_PROCESS( 0 );
}
// connect to the WMI
bResult = sysinfo.Connect();
if ( bResult == FALSE )
{
// show the error message
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
EXIT_PROCESS( 1 );
}
// load the data
if ( sysinfo.LoadData() == FALSE )
{
// show the error message
ShowLastErrorEx ( stderr, SLE_TYPE_ERROR | SLE_INTERNAL );
EXIT_PROCESS( 1 );
}
#ifdef _FAST_LIST
// NOTE: for list for output will be shown while loading itself.
// so show the output incase of table and csv formats only
if ( (sysinfo.m_dwFormat & SR_FORMAT_MASK) != SR_FORMAT_LIST )
#endif
// show the system configuration information
sysinfo.ShowOutput();
// exit from the program
EXIT_PROCESS( 0 );
}
BOOL
CSystemInfo::Connect()
/*++
// Routine Description:
// Connects to WMI
//
// Arguments:
// None
//
// Return Value:
// TRUE on success
// FALSE oni failure
--*/
{
// local variables
BOOL bResult = FALSE;
BOOL bLocalSystem = FALSE;
// connect to WMI
bResult = ConnectWmiEx( m_pWbemLocator,
&m_pWbemServices, m_strServer, m_strUserName, m_strPassword,
&m_pAuthIdentity, m_bNeedPassword, WMI_NAMESPACE_CIMV2, &bLocalSystem );
// check the result of connection
if ( bResult == FALSE )
{
return FALSE;
}
// check the local credentials and if need display warning
if ( GetLastError() == WBEM_E_LOCAL_CREDENTIALS )
{
WMISaveError( WBEM_E_LOCAL_CREDENTIALS );
ShowLastErrorEx( stderr, SLE_TYPE_WARNING | SLE_INTERNAL );
// get the new screen co-ordinates
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
// check the remote system version and its compatiblity
if ( bLocalSystem == FALSE )
{
DWORD dwVersion = 0;
dwVersion = GetTargetVersionEx( m_pWbemServices, m_pAuthIdentity );
if ( IsCompatibleOperatingSystem( dwVersion ) == FALSE )
{
SetReason( ERROR_REMOTE_INCOMPATIBLE );
return FALSE;
}
}
// return the result
return bResult;
}
BOOL
CSystemInfo::LoadData()
/*++
// Routine Description:
// Loads the system data
//
// Arguments:
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
BOOL bResult = FALSE;
//
// load os information
bResult = LoadOSInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// Host Name, OS Name, OS Version, OS Manufacturer
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_HOSTNAME, CI_OS_MANUFACTURER );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
//
// load computer information
bResult = LoadComputerInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// OS Configuration, OS Build Type, Registered Owner,
// Registered Organization, Product ID, Original Install Date
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_OS_CONFIG, CI_INSTALL_DATE );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
//
// load systemuptime information from perf data
bResult = LoadPerformanceInfo();
if ( bResult == FALSE )
{
// return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// System Up Time, System Manufacturer, System Model, System type
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_SYSTEM_UPTIME, CI_SYSTEM_TYPE );
if ( m_hOutput != NULL )
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
#endif
//
// load processor information
bResult = LoadProcessorInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// Processor(s)
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_PROCESSOR, CI_PROCESSOR );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
//
// load bios information
bResult = LoadBiosInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// BIOS Version, Windows Directory, System Directory, Boot Device, System Locale
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_BIOS_VERSION, CI_SYSTEM_LOCALE );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
//
// load input locale information from keyboard class
bResult = LoadKeyboardInfo();
if ( bResult == FALSE )
{
return FALSE;
}
//
// load timezone information
bResult = LoadTimeZoneInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// Input Locale, Time Zone, Total Physical Memory, Available Physical Memory,
// Virtual Memory: Max Size, Virtual Memory: Available, Virtual Memory: In Use
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_INPUT_LOCALE, CI_VIRTUAL_MEMORY_INUSE );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
// load the logon server information
bResult = LoadProfileInfo();
if ( bResult == FALSE )
{
return FALSE;
}
//
// load pagefile information
bResult = LoadPageFileInfo();
if ( bResult == FALSE )
{
return FALSE;
}
//
// load hotfix information from quick fix engineering class
bResult = LoadHotfixInfo();
if ( bResult == FALSE )
{
return FALSE;
}
//
// load n/w card information from network adapter class
bResult = LoadNetworkCardInfo();
if ( bResult == FALSE )
{
return FALSE;
}
#ifdef _FAST_LIST
// ***********************************************
// show the paritial output .. only in list format
// ***********************************************
// Columns Shown here:
// Page File Location(s), Domain, Logon Server, Hotfix(s), NetWork Card(s)
// ***********************************************
if ( (m_dwFormat & SR_FORMAT_MASK) == SR_FORMAT_LIST )
{
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
ShowOutput( CI_PAGEFILE_LOCATION, CI_NETWORK_CARD );
if ( m_hOutput != NULL )
{
GetConsoleScreenBufferInfo( m_hOutput, &m_csbi );
}
}
#endif
// erase the last status message
PrintProgressMsg( m_hOutput, NULL, m_csbi );
// return
return TRUE;
}
BOOL
CSystemInfo::LoadOSInfo()
/*++
// Routine Description:
// Loads OS information
//
// Arguments: None
//
// Return Value:
// TRUE on success
// FALSE on failure
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
CHString strInstallDate;
CHString strVirtualMemoryInUse; // totalvirtualmemorysize - freevirtualmemory
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
// property values
CHString strHostName; // csname
CHString strName; // caption
CHString strVersion; // version
CHString strServicePack; // csdversion
CHString strBuildNumber; // buildnumber
CHString strManufacturer; // manufacturer
CHString strBuildType; // buildtype
CHString strOwner; // registereduser
CHString strOrganization; // organization
CHString strSerialNumber; // serialnumber
CHString strWindowsDir; // windowsdirectory
CHString strSystemDir; // systemdirectory
CHString strBootDevice; // bootdevice
CHString strFreePhysicalMemory; // freephysicalmemory
CHString strTotalVirtualMemory; // totalvirtualmemorysize
CHString strFreeVirtualMemory; // freevirtualmemory
CHString strLocale; // locale
SYSTEMTIME systimeInstallDate; // installdate
// display the status message
PrintProgressMsg( m_hOutput, MSG_OSINFO, m_csbi );
try
{
// enumerate the instances of Win32_OperatingSystem class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_OPERATINGSYSTEM ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_CAPTION, strName );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_CSNAME, strHostName );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_VERSION, strVersion );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_CSDVERSION, strServicePack );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_BUILDNUMBER, strBuildNumber );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_MANUFACTURER, strManufacturer );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_BUILDTYPE, strBuildType );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_REGUSER, strOwner );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_ORGANIZATION, strOrganization );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_SERIALNUMBER, strSerialNumber );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_WINDOWSDIR, strWindowsDir );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_SYSTEMDIR, strSystemDir );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_BOOTDEVICE, strBootDevice );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_LOCALE, strLocale );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_FREEPHYSICALMEMORY, strFreePhysicalMemory );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_TOTALVIRTUALMEMORY, strTotalVirtualMemory );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_FREEVIRTUALMEMORY, strFreeVirtualMemory );
PropertyGet( pWbemObject, WIN32_OPERATINGSYSTEM_P_INSTALLDATE, systimeInstallDate );
// relase the interfaces
SAFE_RELEASE( pWbemEnum );
SAFE_RELEASE( pWbemObject );
//
// do the needed formatting the information obtained
//
// convert the system locale into appropriate code
TranslateLocaleCode( strLocale );
//
// format the version info
try
{
// sub-local variable
CHString str;
// attach the service pack info
str = strVersion;
if ( strServicePack.IsEmpty() == FALSE )
{
str.Format( L"%s %s", strVersion, strServicePack );
}
// attach the build number
strVersion.Format( FMT_OSVERSION, str, strBuildNumber );
}
catch( ... )
{
SetLastError((DWORD) E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
//
// get the formatted date and time
{
// sub-local variables
LCID lcid;
CHString strTime;
CHString strDate;
BOOL bLocaleChanged = FALSE;
// verify whether console supports the current locale 100% or not
lcid = GetSupportedUserLocale( &bLocaleChanged );
// get the formatted date
try
{
// get the size of buffer that is needed
DWORD dwCount = 0;
dwCount = GetDateFormat( lcid, 0, &systimeInstallDate,
((bLocaleChanged == TRUE) ? L"MM/dd/yyyy" : NULL), NULL, 0 );
// get the required buffer
LPWSTR pwszTemp = NULL;
pwszTemp = strDate.GetBufferSetLength( dwCount + 1 );
// now format the date
GetDateFormat( lcid, 0, &systimeInstallDate,
((bLocaleChanged == TRUE) ? L"MM/dd/yyyy" : NULL), pwszTemp, dwCount );
// release the buffer
strDate.ReleaseBuffer();
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// get the formatted time
try
{
// get the size of buffer that is needed
DWORD dwCount = 0;
dwCount = GetTimeFormat( LOCALE_USER_DEFAULT, 0, &systimeInstallDate,
((bLocaleChanged == TRUE) ? L"HH:mm:ss" : NULL), NULL, 0 );
// get the required buffer
LPWSTR pwszTemp = NULL;
pwszTemp = strTime.GetBufferSetLength( dwCount + 1 );
// now format the date
GetTimeFormat( LOCALE_USER_DEFAULT, 0, &systimeInstallDate,
((bLocaleChanged == TRUE) ? L"HH:mm:ss" : NULL), pwszTemp, dwCount );
// release the buffer
strTime.ReleaseBuffer();
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// prepare the
try
{
// prepare the datetime
strInstallDate.Format( L"%s, %s", strDate, strTime );
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
}
// format the numeric data
try
{
// sub-local variables
CHString str;
WCHAR wszBuffer[ 33 ] = L"\0";
//
// first determine the virtual memory in use
ULONGLONG ullAvailablePhysicalMemory = 0;
ULONGLONG ullTotal = 0;
ULONGLONG ullFree = 0;
ULONGLONG ullInUse = 0;
ullFree = (ULONGLONG) ( ((( float ) _wtoi64( strFreeVirtualMemory )) / 1024.0f) + 0.5f );
ullTotal = (ULONGLONG) ( ((( float ) _wtoi64( strTotalVirtualMemory )) / 1024.0f) + 0.5f );
ullAvailablePhysicalMemory = (ULONGLONG) ( ((( float ) _wtoi64( strFreePhysicalMemory )) / 1024.0f) + 0.5f );
ullInUse = ullTotal - ullFree;
//
// format the virtual memory in use
_ui64tow( ullInUse, wszBuffer, 10 ); // convert the ulonglong value into string
if ( FormatNumberEx( wszBuffer, str ) == FALSE )
{
return FALSE;
}
// ...
strVirtualMemoryInUse.Format( FMT_MEGABYTES, str );
//
// format the available physical memory
_ui64tow( ullAvailablePhysicalMemory, wszBuffer, 10 ); // convert the ulonglong value into string
if ( FormatNumberEx( wszBuffer, str ) == FALSE )
return FALSE;
// ...
strFreePhysicalMemory.Format( FMT_MEGABYTES, str );
//
// format the virtual memory max.
_ui64tow( ullTotal, wszBuffer, 10 ); // convert the ulonglong value into string
if ( FormatNumberEx( wszBuffer, str ) == FALSE )
return FALSE;
// ...
strTotalVirtualMemory.Format( FMT_MEGABYTES, str );
//
// format the virtual memory free
_ui64tow( ullFree, wszBuffer, 10 ); // convert the ulonglong value into string
if ( FormatNumberEx( wszBuffer, str ) == FALSE )
{
return FALSE;
}
// ...
strFreeVirtualMemory.Format( FMT_MEGABYTES, str );
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
//
// save the info in dynamic array
DynArraySetString2( m_arrData, 0, CI_HOSTNAME, strHostName, 0 );
DynArraySetString2( m_arrData, 0, CI_OS_NAME, strName, 0 );
DynArraySetString2( m_arrData, 0, CI_OS_VERSION, strVersion, 0 );
DynArraySetString2( m_arrData, 0, CI_OS_MANUFACTURER, strManufacturer, 0 );
DynArraySetString2( m_arrData, 0, CI_OS_BUILDTYPE, strBuildType, 0 );
DynArraySetString2( m_arrData, 0, CI_REG_OWNER, strOwner, 0 );
DynArraySetString2( m_arrData, 0, CI_REG_ORG, strOrganization, 0 );
DynArraySetString2( m_arrData, 0, CI_PRODUCT_ID, strSerialNumber, 0 );
DynArraySetString2( m_arrData, 0, CI_INSTALL_DATE, strInstallDate, 0 );
DynArraySetString2( m_arrData, 0, CI_WINDOWS_DIRECTORY, strWindowsDir, 0 );
DynArraySetString2( m_arrData, 0, CI_SYSTEM_DIRECTORY, strSystemDir, 0 );
DynArraySetString2( m_arrData, 0, CI_BOOT_DEVICE, strBootDevice, 0 );
DynArraySetString2( m_arrData, 0, CI_SYSTEM_LOCALE, strLocale, 0 );
DynArraySetString2( m_arrData, 0, CI_AVAILABLE_PHYSICAL_MEMORY, strFreePhysicalMemory, 0 );
DynArraySetString2( m_arrData, 0, CI_VIRTUAL_MEMORY_MAX, strTotalVirtualMemory, 0 );
DynArraySetString2( m_arrData, 0, CI_VIRTUAL_MEMORY_AVAILABLE, strFreeVirtualMemory, 0 );
DynArraySetString2( m_arrData, 0, CI_VIRTUAL_MEMORY_INUSE, strVirtualMemoryInUse, 0 );
// return success
return TRUE;
}
BOOL
CSystemInfo::LoadComputerInfo()
/*++
// Routine Description:
// Loads computer information
//
// Arguments:
// None
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
CHString strDomainRole;
CHString strTotalPhysicalMemory;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
// property values
CHString strModel;
DWORD dwDomainRole;
CHString strDomain;
CHString strSystemType;
CHString strManufacturer;
ULONGLONG ullTotalPhysicalMemory;
// display the status message
PrintProgressMsg( m_hOutput, MSG_COMPINFO, m_csbi );
try
{
// enumerate the instances of Win32_ComputerSystem class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_COMPUTERSYSTEM ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_MODEL, strModel );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_DOMAIN, strDomain );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_USERNAME, m_strLogonUser );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_DOMAINROLE, dwDomainRole );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_SYSTEMTYPE, strSystemType );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_MANUFACTURER, strManufacturer );
PropertyGet( pWbemObject, WIN32_COMPUTERSYSTEM_P_TOTALPHYSICALMEMORY, ullTotalPhysicalMemory );
// relase the interfaces
SAFE_RELEASE( pWbemEnum );
SAFE_RELEASE( pWbemObject );
//
// do the needed formatting the information obtained
//
// convert the total physical memory from KB into MB
try
{
// NOTE:
// ----
// The max. value of
// (2 ^ 64) - 1 = "18,446,744,073,709,600,000 K" (29 chars).
// = "18,014,398,509,482,031 M" (22 chars).
//
// so, the buffer size to store the number is fixed as 32 characters
// which is more than the 29 characters in actuals
// sub-local variables
CHString str;
WCHAR wszBuffer[ 33 ] = L"\0";
// convert the value first ( take care of rounding )
ullTotalPhysicalMemory =
(ULONGLONG) (( ((float) ullTotalPhysicalMemory) / (1024.0f * 1024.0f)) + 0.5f);
// now ULONGLONG to string
_ui64tow( ullTotalPhysicalMemory, wszBuffer, 10 );
// get the formatted number
if ( FormatNumberEx( wszBuffer, str ) == FALSE )
return FALSE;
// ...
strTotalPhysicalMemory.Format( FMT_MEGABYTES, str );
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// map the domain role from numeric value to appropriate text value
try
{
//
// Mapping information of Win32_ComputerSystem's DomainRole property
// NOTE: Refer to the _DSROLE_MACHINE_ROLE enumeration values in DsRole.h header file
switch( dwDomainRole )
{
case DsRole_RoleStandaloneWorkstation:
strDomainRole = VALUE_STANDALONEWORKSTATION;
break;
case DsRole_RoleMemberWorkstation:
strDomainRole = VALUE_MEMBERWORKSTATION;
break;
case DsRole_RoleStandaloneServer:
strDomainRole = VALUE_STANDALONESERVER;
break;
case DsRole_RoleMemberServer:
strDomainRole = VALUE_MEMBERSERVER;
break;
case DsRole_RoleBackupDomainController:
strDomainRole = VALUE_BACKUPDOMAINCONTROLLER;
break;
case DsRole_RolePrimaryDomainController:
strDomainRole = VALUE_PRIMARYDOMAINCONTROLLER;
break;
}
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
//
// save the info in dynamic array
DynArraySetString2( m_arrData, 0, CI_DOMAIN, strDomain, 0 );
DynArraySetString2( m_arrData, 0, CI_SYSTEM_MODEL, strModel, 0 );
DynArraySetString2( m_arrData, 0, CI_OS_CONFIG, strDomainRole, 0 );
DynArraySetString2( m_arrData, 0, CI_SYSTEM_TYPE, strSystemType, 0 );
DynArraySetString2( m_arrData, 0, CI_SYSTEM_MANUFACTURER, strManufacturer, 0 );
DynArraySetString2( m_arrData, 0, CI_TOTAL_PHYSICAL_MEMORY, strTotalPhysicalMemory, 0 );
// return success
return TRUE;
}
BOOL
CSystemInfo::LoadBiosInfo()
/*++
// Routine Description:
// Loads BIOS information
//
// Arguments:
// None
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
// property values
CHString strVersion;
// display the status message
PrintProgressMsg( m_hOutput, MSG_BIOSINFO, m_csbi );
try
{
// enumerate the instances of Win32_BIOS class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_BIOS ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_BIOS_P_VERSION, strVersion );
// relase the interfaces
SAFE_RELEASE( pWbemEnum );
SAFE_RELEASE( pWbemObject );
//
// save the info in dynamic array
DynArraySetString2( m_arrData, 0, CI_BIOS_VERSION, strVersion, 0 );
// return success
return TRUE;
}
BOOL
CSystemInfo::LoadTimeZoneInfo()
/*++
// Routine Description:
// Loads time-zone information
//
// Arguments: None
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
// property values
CHString strCaption;
// display the status message
PrintProgressMsg( m_hOutput, MSG_TZINFO, m_csbi );
try
{
// enumerate the instances of Win32_TimeZone class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_TIMEZONE ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_TIMEZONE_P_CAPTION, strCaption );
// relase the interfaces
SAFE_RELEASE( pWbemEnum );
SAFE_RELEASE( pWbemObject );
//
// save the info in dynamic array
DynArraySetString2( m_arrData, 0, CI_TIME_ZONE, strCaption, 0 );
// return success
return TRUE;
}
BOOL
CSystemInfo::LoadPageFileInfo()
/*++
// Routine Description:
// Loads page file information
//
// Arguments: none
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
TARRAY arrValues = NULL;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
BOOL bNoBreak = TRUE;
// property values
CHString strCaption;
// display the status message
PrintProgressMsg( m_hOutput, MSG_PAGEFILEINFO, m_csbi );
try
{
// enumerate the instances of Win32_PageFile class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_PAGEFILE ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
do
{
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( hr == (HRESULT) WBEM_S_FALSE )
{
bNoBreak = FALSE;
// we've reached the end of enumeration .. go out of the loop
break;
}
else if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_PAGEFILE_P_NAME, strCaption );
// release the current object
SAFE_RELEASE( pWbemObject );
// add the values to the data
if ( arrValues == NULL )
{
arrValues = DynArrayItem2( m_arrData, 0, CI_PAGEFILE_LOCATION );
if ( arrValues == NULL )
{
SetLastError((DWORD) E_UNEXPECTED );
SaveLastError();
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// remove all the existing entries
DynArrayRemoveAll( arrValues );
}
// add the data
DynArrayAppendString( arrValues, strCaption, 0 );
} while ( TRUE == bNoBreak );
// release the enumerated object
SAFE_RELEASE( pWbemEnum );
// return
return TRUE;
}
BOOL
CSystemInfo::LoadProcessorInfo()
/*++
// Routine Description:
// Loads processor information
//
// Arguments:none
//
// Return Value:
// FALSE on failure
// TRUE on success
--*/
{
// local variables
HRESULT hr;
CHString str;
DWORD dwCount = 0;
ULONG ulReturned = 0;
TARRAY arrValues = NULL;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
BOOL bNoBreak = TRUE;
// property values
DWORD dwClockSpeed;
CHString strCaption;
CHString strManufacturer;
// display the status message
PrintProgressMsg( m_hOutput, MSG_PROCESSORINFO, m_csbi );
try
{
// enumerate the instances of Win32_Processor class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_PROCESSOR ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
try
{
do
{
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( hr == (HRESULT) WBEM_S_FALSE )
{
bNoBreak = FALSE;
// we've reached the end of enumeration .. go out of the loop
break;
}
else if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// update the counter
dwCount++;
// get the propert information
PropertyGet( pWbemObject, WIN32_PROCESSOR_P_CAPTION, strCaption );
PropertyGet( pWbemObject, WIN32_PROCESSOR_P_MANUFACTURER, strManufacturer );
PropertyGet( pWbemObject, WIN32_PROCESSOR_P_CURRENTCLOCKSPEED, dwClockSpeed );
// check whether we got the clock speed correctly or not
// if not, get the max. clock speed
if ( dwClockSpeed == 0 )
PropertyGet( pWbemObject, WIN32_PROCESSOR_P_MAXCLOCKSPEED, dwClockSpeed );
// release the current object
SAFE_RELEASE( pWbemObject );
// add the values to the data
if ( arrValues == NULL )
{
arrValues = DynArrayItem2( m_arrData, 0, CI_PROCESSOR );
if ( arrValues == NULL )
{
SetLastError( (DWORD)E_UNEXPECTED );
SaveLastError();
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// remove all the existing entries
DynArrayRemoveAll( arrValues );
}
//
// prepare the processor info
str.Format( FMT_PROCESSOR_INFO, dwCount, strCaption, strManufacturer, dwClockSpeed );
// add the data
DynArrayAppendString( arrValues, str, 0 );
} while ( TRUE == bNoBreak );
// release the enumerated object
SAFE_RELEASE( pWbemEnum );
// update the total no. of processors info
if ( arrValues != NULL )
{
// NOTE: this should appear at the first line
str.Format( FMT_PROCESSOR_TOTAL, dwCount );
DynArrayInsertString( arrValues, 0, str, 0 );
}
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// return
return TRUE;
}
BOOL
CSystemInfo::LoadKeyboardInfo()
/*++
// Routine Description:
// Loads keyboard information
//
// Arguments: none
//
// Return Value:
// FALSE on failure
// TRUE on success
--*/
{
// local variables
HRESULT hr;
ULONG ulReturned = 0;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
// property values
CHString strLayout;
// display the status message
PrintProgressMsg( m_hOutput, MSG_INPUTLOCALEINFO, m_csbi );
try
{
// enumerate the instances of Win32_Keyboard class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_KEYBOARD ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the propert information
PropertyGet( pWbemObject, WIN32_KEYBOARD_P_LAYOUT, strLayout );
// relase the interfaces
SAFE_RELEASE( pWbemEnum );
SAFE_RELEASE( pWbemObject );
// convert the code page into appropriate text
TranslateLocaleCode( strLayout );
//
// save the info in dynamic array
DynArraySetString2( m_arrData, 0, CI_INPUT_LOCALE, strLayout, 0 );
// return
return TRUE;
}
BOOL
CSystemInfo::LoadHotfixInfo()
/*++
// Routine Description:
// Loads hot fix information
//
// Arguments: None
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
CHString str;
DWORD dwCount = 0;
ULONG ulReturned = 0;
TARRAY arrValues = NULL;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
BOOL bNoBreak = TRUE;
// property values
CHString strHotFix;
CHString strComments;
// display the status message
PrintProgressMsg( m_hOutput, MSG_HOTFIXINFO, m_csbi );
try
{
// enumerate the instances of Win32_QuickFixEngineering class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_QUICKFIXENGINEERING ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
try
{
do
{
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( hr == (HRESULT) WBEM_S_FALSE )
{
bNoBreak = FALSE;
// we've reached the end of enumeration .. go out of the loop
break;
}
else if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// update the counter
dwCount++;
// get the propert information
PropertyGet( pWbemObject, WIN32_QUICKFIXENGINEERING_P_HOTFIXID, strHotFix );
PropertyGet( pWbemObject, WIN32_QUICKFIXENGINEERING_P_FIXCOMMENTS, strComments );
// release the current object
SAFE_RELEASE( pWbemObject );
// add the values to the data
if ( arrValues == NULL )
{
arrValues = DynArrayItem2( m_arrData, 0, CI_HOTFIX );
if ( arrValues == NULL )
{
SetLastError( (DWORD)E_UNEXPECTED );
SaveLastError();
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// remove all the existing entries
DynArrayRemoveAll( arrValues );
}
// check if fix comments were available or not
// if available, append that to the the hot fix number
if ( strComments.GetLength() != 0 )
strHotFix += L" - " + strComments;
// prepare the hot fix info
str.Format( FMT_HOTFIX_INFO, dwCount, strHotFix );
// add the data
DynArrayAppendString( arrValues, str, 0 );
} while ( TRUE == bNoBreak );
// release the enumerated object
SAFE_RELEASE( pWbemEnum );
// update the total no. of hotfix's info
if ( arrValues != NULL )
{
// NOTE: this should appear at the first line
str.Format( FMT_HOTFIX_TOTAL, dwCount );
DynArrayInsertString( arrValues, 0, str, 0 );
}
}
catch( ... )
{
SetLastError((DWORD) E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// return
return TRUE;
}
BOOL
CSystemInfo::LoadPerformanceInfo()
/*++
// Routine Description:
// Loads performance information
//
// Arguments: None
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
CHString strUpTime;
ULONG ulReturned = 0;
ULONGLONG ullSysUpTime = 0;
ULONGLONG ullElapsedTime = 0;
ULONGLONG ullFrequencyObject = 0;
ULONGLONG ullTimestampObject = 0;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
DWORD dwDays = 0, dwHours = 0, dwMinutes = 0, dwSeconds = 0;
// display the status message
PrintProgressMsg( m_hOutput, MSG_PERFINFO, m_csbi );
try
{
// enumerate the instances of Win32_PerfRawData_PerfOS_System class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_PERFRAWDATA_PERFOS_SYSTEM ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
// NOTE: This needs to be traversed only one time.
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the performance information
PropertyGet( pWbemObject, WIN32_PERFRAWDATA_PERFOS_SYSTEM_P_SYSUPTIME, ullSysUpTime );
PropertyGet( pWbemObject, WIN32_PERFRAWDATA_PERFOS_SYSTEM_P_TIMESTAMP, ullTimestampObject );
PropertyGet( pWbemObject, WIN32_PERFRAWDATA_PERFOS_SYSTEM_P_FREQUENCY, ullFrequencyObject );
// release the interfaces
SAFE_RELEASE( pWbemObject );
SAFE_RELEASE( pWbemEnum );
// ( performance_time_object - system_up_time ) / frequency_object = elapsed_time
// NOTE: take care of divide by zero errors.
if ( ullFrequencyObject == 0 )
{
SetLastError( (DWORD)STG_E_UNKNOWN );
SaveLastError();
return FALSE;
}
// ...
ullElapsedTime = ( ullTimestampObject - ullSysUpTime ) / ullFrequencyObject;
//
// in calculations currently assuming as differences will not cross 2 ^ 32 value
//
// no. of days = elapsed_time / 86400
// update with elapsed_time %= 86400
dwDays = (DWORD) (ullElapsedTime / 86400);
ullElapsedTime %= 86400;
// no. of hours = elapsed_time / 3600
// update with elapsed_time %= 3600
dwHours = (DWORD) (ullElapsedTime / 3600);
ullElapsedTime %= 3600;
// no. of minutes = elapsed_time / 60
// no. of seconds = elapsed_time % 60
dwMinutes = (DWORD) (ullElapsedTime / 60);
dwSeconds = (DWORD) (ullElapsedTime % 60);
try
{
// now prepare the system up time information
strUpTime.Format( FMT_UPTIME, dwDays, dwHours, dwMinutes, dwSeconds );
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// save the info
DynArraySetString2( m_arrData, 0, CI_SYSTEM_UPTIME, strUpTime, 0 );
// return
return TRUE;
}
BOOL
CSystemInfo::LoadNetworkCardInfo()
/*++
// Routine Description:
// Loads network card information
//
// Arguments: none
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
HRESULT hr;
CHString str;
DWORD dwCount = 0;
DWORD dwNicCount = 0;
DWORD dwStatus = 0;
BOOL bResult = FALSE;
ULONG ulReturned = 0;
TARRAY arrValues = NULL;
IWbemClassObject* pWbemObject = NULL;
IEnumWbemClassObject* pWbemEnum = NULL;
BOOL bNoBreak = TRUE;
// property values
DWORD dwIndex = 0;
CHString strConnection;
CHString strDescription;
// display the status message
PrintProgressMsg( m_hOutput, MSG_NICINFO, m_csbi );
try
{
// enumerate the instances of Win32_NetworkAdapter class
hr = m_pWbemServices->CreateInstanceEnum( _bstr_t( WIN32_NETWORKADAPTER ),
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pWbemEnum );
// check the result of enumeration
if ( FAILED( hr ) )
{
WMISaveError( hr );
return FALSE;
}
}
catch( _com_error& e )
{
WMISaveError( e );
return FALSE;
}
// set the security on the obtained interface
hr = SetInterfaceSecurity( pWbemEnum, m_pAuthIdentity );
if ( FAILED( hr ) )
{
WMISaveError( hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the enumerated objects information
try
{
do
{
hr = pWbemEnum->Next( WBEM_INFINITE, 1, &pWbemObject, &ulReturned );
if ( hr == (HRESULT) WBEM_S_FALSE )
{
bNoBreak = FALSE;
// we've reached the end of enumeration .. go out of the loop
break;
}
else if ( FAILED( hr ) )
{
// some error has occured ... oooppps
WMISaveError( (DWORD) hr );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// get the property information
// NOTE: get the result of getting status property information
PropertyGet( pWbemObject, WIN32_NETWORKADAPTER_P_INDEX, dwIndex );
PropertyGet( pWbemObject, WIN32_NETWORKADAPTER_P_DESCRIPTION, strDescription );
PropertyGet( pWbemObject, WIN32_NETWORKADAPTER_P_NETCONNECTIONID, strConnection );
bResult = PropertyGet( pWbemObject, WIN32_NETWORKADAPTER_P_STATUS, dwStatus, 0 );
// release the current object
SAFE_RELEASE( pWbemObject );
// add the values to the data
// NOTE: do this only if either we couldn't find the property or status is not -1
// FOR WINDOWS 2000 MACHINES 'NetConnectionStatus' PROPERT IS NOT EXISTED IN
// WMI 'Win32_NetworkAdapter' CLASS. SO WE WILL BE DISPLAYING THE N/W CARD
// INFORMATION IF PROPERTY DOESN'T EXIST OR IF EXISTS AND THE STATUS IS NOT -1
if ( bResult == FALSE || dwStatus != 0 )
{
// update the counter
dwCount++;
if ( arrValues == NULL )
{
arrValues = DynArrayItem2( m_arrData, 0, CI_NETWORK_CARD );
if ( arrValues == NULL )
{
SetLastError( (DWORD)E_UNEXPECTED );
SaveLastError();
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// remove all the existing entries
DynArrayRemoveAll( arrValues );
}
// prepare the n/w card info
str.Format( FMT_NIC_INFO, dwCount, strDescription );
// add the data
DynArrayAppendString( arrValues, str, 0 );
// now check the status in detail ... only if the property exists
if ( bResult == TRUE )
{
//
// property do exists ... so determine the status
// display the status of the NIC except it is connected
// if the NIC is connected, display the ipaddress and its other information
// add the connection name
str.Format( FMT_CONNECTION, strConnection );
DynArrayAppendString( arrValues, str, 0 );
// ...
if ( dwStatus != 2 )
{
// sub-local variables
CHString strValues[] = {
VALUE_DISCONNECTED, VALUE_CONNECTING,
VALUE_CONNECTED, VALUE_DISCONNECTING, VALUE_HWNOTPRESENT,
VALUE_HWDISABLED, VALUE_HWMALFUNCTION, VALUE_MEDIADISCONNECTED,
VALUE_AUTHENTICATING, VALUE_AUTHSUCCEEDED, VALUE_AUTHFAILED };
// prepare the status info
if ( dwStatus > 0 && dwStatus < SIZE_OF_ARRAY( strValues ) )
{
// ...
str.Format( FMT_NIC_STATUS, strValues[ dwStatus ] );
// save the info
DynArrayAppendString( arrValues, str, 0 );
}
}
else
{
//
// get the adapter configuration
// sub-local variables
CHString strTemp;
CHString strDhcpServer;
DWORD dwDhcpEnabled = 0;
TARRAY arrIPAddress = NULL;
// create the ipaddress array
arrIPAddress = CreateDynamicArray();
if ( arrIPAddress == NULL )
{
WMISaveError( E_OUTOFMEMORY );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// prepare the object path
str.Format( WIN32_NETWORKADAPTERCONFIGURATION_GET, dwIndex );
// get the nic config info object
hr = m_pWbemServices->GetObject( _bstr_t( str ),
WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &pWbemObject, NULL );
// check the result .. proceed furthur only if successfull
if ( SUCCEEDED( hr ) )
{
// get the needed property values
PropertyGet( pWbemObject, WIN32_NETWORKADAPTERCONFIGURATION_P_IPADDRESS, arrIPAddress );
PropertyGet( pWbemObject, WIN32_NETWORKADAPTERCONFIGURATION_P_DHCPSERVER, strDhcpServer );
PropertyGet( pWbemObject, WIN32_NETWORKADAPTERCONFIGURATION_P_DHCPENABLED, dwDhcpEnabled );
// check and add the dhcp information
// NOTE: CIM_BOOLEAN -> TRUE = -1, FALSE = 0
strTemp = FMT_DHCP_STATUS;
str.Format( strTemp, ( ( dwDhcpEnabled == -1 ) ? VALUE_YES : VALUE_NO ) );
DynArrayAppendString( arrValues, str, 0 );
// add the dhcp server info ( if needed )
if ( dwDhcpEnabled == -1 )
{
str.Format( FMT_DHCP_SERVER, strDhcpServer );
DynArrayAppendString( arrValues, str, 0 );
}
//
// add the IP Address information
DynArrayAppendString( arrValues, FMT_IPADDRESS_TOTAL, 0 );
dwNicCount = DynArrayGetCount( arrIPAddress );
for( DWORD dw = 0; dw < dwNicCount; dw++ )
{
// get the info
LPCWSTR pwsz = NULL;
pwsz = DynArrayItemAsString( arrIPAddress, dw );
if ( pwsz == NULL )
continue;
// prepare and add the info
str.Format( FMT_IPADDRESS_INFO, dw + 1, pwsz );
DynArrayAppendString( arrValues, str, 0 );
}
}
// release the object
SAFE_RELEASE( pWbemObject );
// destroy the dynamic array created for storing ip address info
DestroyDynamicArray( &arrIPAddress );
}
}
}
} while ( TRUE == bNoBreak );
// release the enumerated object
SAFE_RELEASE( pWbemEnum );
// update the total no. of hotfix's info
if ( arrValues != NULL )
{
// NOTE: this should appear at the first line
str.Format( FMT_NIC_TOTAL, dwCount );
DynArrayInsertString( arrValues, 0, str, 0 );
}
}
catch( ... )
{
WMISaveError( (DWORD)E_OUTOFMEMORY );
SAFE_RELEASE( pWbemObject );
SAFE_RELEASE( pWbemEnum );
return FALSE;
}
// return success
return TRUE;
}
BOOL
CSystemInfo::LoadProfileInfo()
/*++
// Routine Description:
// Loads profile information
//
// Arguments:none
//
// Return Value:
// FALSE on failure
// TRUE on success
//
--*/
{
// local variables
BOOL bResult = FALSE;
CHString strLogonServer;
LPCWSTR pwszPassword = NULL;
IWbemServices* pDefaultNamespace = NULL;
// display the status message
PrintProgressMsg( m_hOutput, MSG_PROFILEINFO, m_csbi );
// determine the password with which connection to default name has to be made
pwszPassword = NULL;
if ( m_pAuthIdentity != NULL )
{
pwszPassword = m_pAuthIdentity->Password;
}
// we need to establish connection to the remote system's registry
// for this connect to the default namespace of the WMI using the credentials available with us
bResult = ConnectWmi( m_pWbemLocator, &pDefaultNamespace,
m_strServer, m_strUserName, pwszPassword, &m_pAuthIdentity, FALSE, WMI_NAMESPACE_DEFAULT );
if ( bResult == FALSE )
{
return FALSE;
}
// get the value of the LOGONSERVER
RegQueryValueWMI( pDefaultNamespace, WMI_HKEY_CURRENT_USER,
SUBKEY_VOLATILE_ENVIRONMENT, KEY_LOGONSERVER, strLogonServer );
// release the interface
SAFE_RELEASE( pDefaultNamespace );
//
// save the info
DynArraySetString2( m_arrData, 0, CI_LOGON_SERVER, strLogonServer, 0 );
// return
return TRUE;
}
VOID
PrintProgressMsg(
IN HANDLE hOutput,
IN LPCWSTR pwszMsg,
IN const CONSOLE_SCREEN_BUFFER_INFO& csbi
)
/*++
// Routine Description:
// Prints the message on console
//
// Arguments:
// [in] hOutput : output handle
// [in] pwszMsg : Message to be printed
// [in] csbi : console screen buffer structure
//
//
// Return Value: none
//
--*/
{
// local variables
COORD coord;
DWORD dwSize = 0;
WCHAR wszSpaces[ 80 ] = L"";
// check the handle. if it is null, it means that output is being redirected. so return
if ( hOutput == NULL )
{
return;
}
// set the cursor position
coord.X = 0;
coord.Y = csbi.dwCursorPosition.Y;
// first erase contents on the current line
SecureZeroMemory( wszSpaces, SIZE_OF_ARRAY(wszSpaces) );
SetConsoleCursorPosition( hOutput, coord );
WriteConsoleW( hOutput, Replicate( wszSpaces, L" ", 79, 79 ), 79, &dwSize, NULL );
// now display the message ( if exists )
SetConsoleCursorPosition( hOutput, coord );
if ( pwszMsg != NULL )
{
WriteConsoleW( hOutput, pwszMsg, StringLength( pwszMsg, 0 ), &dwSize, NULL );
}
}
BOOL
TranslateLocaleCode( CHString& strLocale )
/*++
// Routine Description:
// Translates locale code
//
// Arguments:
// [in] strLocale : locale
//
// Return Value:
// TRUE on success
// FALSE on failure
//
--*/
{
// local variables
CHString str;
HKEY hKey = NULL;
DWORD dwSize = 0;
LONG lRegReturn = 0;
HKEY hMainKey = NULL;
WCHAR wszValue[ 64 ] = L"\0";
//
// THIS IS A TYPICAL THING WHICH WE ARE DOING HERE
// BECAUSE WE DONT KNOW WHAT LANGUAGE TARGET MACHINE IS USING
// SO WE GET THE LOCALE CODE PAGE BEING USED BY THE TARGET MACHINE
// AND GET THE APPROPRIATE NAME FOR THAT LOCALE FROM THE CURRENT SYSTEM
// REGISTRY DATABASE. IF THE REGISTRY IS CORRUPTED THEN THERE IS NO WAY
// TO JUDGE THE OUTPUT THAT DISPLAYED BY THIS UTILITY IS VALID OR INVALID
//
try
{
// get the reference to the promary hive
lRegReturn = RegConnectRegistry( NULL, HKEY_CLASSES_ROOT, &hMainKey );
if ( lRegReturn != ERROR_SUCCESS )
{
SaveLastError();
return FALSE;
}
else if ( hMainKey == NULL )
{
// THIS IS MEANING LESS IN DOING
// BUT JUST TO AVOID PREfix BUG THIS PART IS WRITTEN
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// now get the reference to the database path
lRegReturn = RegOpenKeyEx( hMainKey, LOCALE_PATH, 0, KEY_QUERY_VALUE, &hKey);
if ( lRegReturn != ERROR_SUCCESS )
{
switch( lRegReturn )
{
case ERROR_FILE_NOT_FOUND:
SetLastError( ERROR_REGISTRY_CORRUPT );
break;
default:
// save the error information and return FAILURE
SetLastError( lRegReturn );
break;
}
// close the key and return
SaveLastError();
RegCloseKey( hMainKey );
return FALSE;
}
else if ( hKey == NULL )
{
// THIS IS MEANING LESS IN DOING
// BUT JUST TO AVOID PREfix BUG THIS PART IS WRITTEN
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// we are interested in the last 4 characters of the code page info
str = strLocale.Right( 4 );
//copy the last four charecters in to the string to get the locale
dwSize = SIZE_OF_ARRAY( wszValue );
lRegReturn = RegQueryValueExW( hKey, str, NULL, NULL, ( LPBYTE ) wszValue, &dwSize);
// first close the registry handles
if ( NULL != hKey )
{
RegCloseKey( hKey );
}
if ( NULL != hMainKey )
{
RegCloseKey( hMainKey );
}
// now check the return value
if( lRegReturn != ERROR_SUCCESS )
return FALSE;
// save the value
strLocale = wszValue;
}
catch( ... )
{
WMISaveError( E_OUTOFMEMORY );
// release the registry handles
if ( NULL != hKey )
{
RegCloseKey( hKey );
hKey = NULL;
}
if ( NULL != hMainKey )
{
RegCloseKey( hMainKey );
hMainKey = NULL;
}
return FALSE;
}
// return
return TRUE;
}
BOOL
FormatNumber(
IN LPCWSTR pwszValue,
IN CHString& strFmtValue
)
/*++
// Routine Description:
//
// Arguments:
// [in] pwszValue : value
// [in] strFmtValue : format value
//
// Return Value:
// TRUE on success
// FALSE on failure
//
--*/
{
try
{
// get the size of buffer that is needed
DWORD dwCount = 0;
if( NULL == pwszValue )
{
SetLastError( ERROR_INVALID_PARAMETER );
SaveLastError();
return FALSE;
}
dwCount = GetNumberFormat( LOCALE_USER_DEFAULT, 0, pwszValue, NULL, L"", 0 );
// get the required buffer
LPWSTR pwszTemp = NULL;
pwszTemp = strFmtValue.GetBufferSetLength( dwCount + 1 );
// now format the date
dwCount = GetNumberFormat( LOCALE_USER_DEFAULT, 0, pwszValue, NULL, pwszTemp, dwCount );
if( 0 == dwCount )
{
SaveLastError();
return FALSE;
}
// release the buffer
strFmtValue.ReleaseBuffer();
}
catch( ... )
{
SetLastError((DWORD) E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// return
return TRUE;
}
BOOL
FormatNumberEx(
IN LPCWSTR pwszValue,
OUT CHString& strFmtValue
)
/*++
// Routine Description:
// Formats the number
//
// Arguments:
// [in] pwszValue: Value string
// [in] strFmtValue : format value
//
// Return Value:
// TRUE on success
// FALSE on failure
//
--*/
{
// local variables
CHString str;
LONG lTemp = 0;
NUMBERFMTW nfmtw;
DWORD dwGroupSep = 0;
LPWSTR pwszTemp = NULL;
CHString strGroupThousSep;
try
{
//
// get the group seperator character
lTemp = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SGROUPING, NULL, 0 );
if ( lTemp == 0 )
{
// we don't know how to resolve this
return FALSE;
}
else
{
// get the group seperation character
pwszTemp = str.GetBufferSetLength( lTemp + 2 );
SecureZeroMemory( pwszTemp, ( lTemp + 2 ) * sizeof( WCHAR ) );
GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SGROUPING, pwszTemp, lTemp );
// change the group info into appropriate number
lTemp = 0;
dwGroupSep = 0;
while ( lTemp < str.GetLength() )
{
if ( AsLong( str.Mid( lTemp, 1 ), 10 ) != 0 )
dwGroupSep = dwGroupSep * 10 + AsLong( str.Mid( lTemp, 1 ), 10 );
// increment by 2
lTemp += 2;
}
}
//
// get the thousand seperator character
lTemp = GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, NULL, 0 );
if ( lTemp == 0 )
{
// we don't know how to resolve this
return FALSE;
}
else
{
// get the thousand sepeartion charactor
pwszTemp = strGroupThousSep.GetBufferSetLength( lTemp + 2 );
SecureZeroMemory( pwszTemp, ( lTemp + 2 ) * sizeof( WCHAR ) );
GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pwszTemp, lTemp );
}
// release the CHStrig buffers
str.ReleaseBuffer();
strGroupThousSep.ReleaseBuffer();
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// format the number
try
{
nfmtw.NumDigits = 0;
nfmtw.LeadingZero = 0;
nfmtw.NegativeOrder = 0;
nfmtw.Grouping = dwGroupSep;
nfmtw.lpDecimalSep = L"";
nfmtw.lpThousandSep = strGroupThousSep.GetBuffer( strGroupThousSep.GetLength() );
// get the size of buffer that is needed
lTemp = GetNumberFormatW( LOCALE_USER_DEFAULT, 0, pwszValue, &nfmtw, NULL, 0 );
// get/allocate the required buffer
pwszTemp = strFmtValue.GetBufferSetLength( lTemp + 1 );
// now format the date
GetNumberFormat( LOCALE_USER_DEFAULT, 0, pwszValue, &nfmtw, pwszTemp, lTemp );
// release the buffer
strFmtValue.ReleaseBuffer();
}
catch( ... )
{
SetLastError( (DWORD)E_OUTOFMEMORY );
SaveLastError();
return FALSE;
}
// return
return TRUE;
}