Files
EgtGeneral/GetOsInfo.cpp
Dario Sassi 9ef479bed3 EgtGeneral 2.7b1 :
- ricompilazione con cambio versione.
2025-03-02 19:41:05 +01:00

403 lines
16 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2015-2016
//----------------------------------------------------------------------------
// File : GetOsInfo.cpp Data : 29.03.16 Versione : 1.6o4
// Contenuto : Funzioni per informazioni sul sistema operativo.
//
//
//
// Modifiche : 11.03.15 DS Creazione modulo.
// 29.03.16 DS Modifiche per Windows 10.
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "Stdafx.h"
#include "/EgtDEv/Include/EGnPcInfo.h"
#include "/EgtDEv/Include/EGnStringUtils.h"
#include "/EgtDEv/Include/EgtStringConverter.h"
#define NOMINMAX
#include "Windows.h"
#include "lmcons.h"
#include "strsafe.h"
using namespace std ;
//---------- Define speciali (da WinUser.h con _WIN32_WINNT >= 0x0501)---------
#define SM_TABLETPC 86
#define SM_MEDIACENTER 87
#define SM_STARTER 88
#define SM_SERVERR2 89
//--------------------------- Tipi --------------------------------------------
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO) ;
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD) ;
//-----------------------------------------------------------------------------
static bool
EqualsMajorVersion( DWORD majorVersion)
{
OSVERSIONINFOEX osVersionInfo ;
::ZeroMemory( &osVersionInfo, sizeof(OSVERSIONINFOEX)) ;
osVersionInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX) ;
osVersionInfo.dwMajorVersion = majorVersion ;
ULONGLONG maskCondition = ::VerSetConditionMask( 0, VER_MAJORVERSION, VER_EQUAL) ;
return ( ::VerifyVersionInfo( &osVersionInfo, VER_MAJORVERSION, maskCondition) != FALSE) ;
}
//-----------------------------------------------------------------------------
static bool
EqualsMinorVersion( DWORD minorVersion)
{
OSVERSIONINFOEX osVersionInfo ;
::ZeroMemory( &osVersionInfo, sizeof(OSVERSIONINFOEX)) ;
osVersionInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX) ;
osVersionInfo.dwMinorVersion = minorVersion ;
ULONGLONG maskCondition = ::VerSetConditionMask( 0, VER_MINORVERSION, VER_EQUAL) ;
return ( ::VerifyVersionInfo( &osVersionInfo, VER_MINORVERSION, maskCondition) != FALSE) ;
}
//-----------------------------------------------------------------------------
static bool
EqualsProductType( BYTE productType)
{
OSVERSIONINFOEX osVersionInfo ;
::ZeroMemory( &osVersionInfo, sizeof( OSVERSIONINFOEX)) ;
osVersionInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX) ;
osVersionInfo.wProductType = productType ;
ULONGLONG maskCondition = ::VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL) ;
return ( ::VerifyVersionInfo( &osVersionInfo, VER_PRODUCT_TYPE, maskCondition) != FALSE) ;
}
//-----------------------------------------------------------------------------
bool
GetOsInfo( string& sOsInfo)
{
// verifico validità stringa di ritorno
if ( &sOsInfo == nullptr)
return false ;
// Inizializzazione strutture per info sistema
SYSTEM_INFO si ;
ZeroMemory( &si, sizeof( SYSTEM_INFO)) ;
OSVERSIONINFOEX osvi ;
ZeroMemory( &osvi, sizeof( OSVERSIONINFOEX)) ;
osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX) ;
// Se non recupero le informazioni, provo con forma semplificata
#pragma warning( push)
#pragma warning( disable : 4996)
bool bOsVersionInfoEx = ( GetVersionEx( (OSVERSIONINFO *) &osvi) != FALSE) ;
if ( ! bOsVersionInfoEx) {
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO) ;
// se non riesco ancora, ritorno sistema operativo sconosciuto
if ( ! GetVersionEx( (OSVERSIONINFO *) &osvi)) {
sOsInfo = "OS unknown" ;
return false ;
}
}
#pragma warning( pop)
// Chiamo GetNativeSystemInfo se supportato o GetSystemInfo altrimenti
PGNSI pGNSI = (PGNSI) GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll")), "GetNativeSystemInfo") ;
if ( pGNSI != nullptr)
pGNSI( &si) ;
else
GetSystemInfo( &si) ;
// Assegnazione dati ( solo NT, 2000, XP, Vista, 7, 8, 8.1, 10, 11)
if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// Nome del prodotto
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) {
if ( EqualsMajorVersion( 10)) {
osvi.dwMajorVersion = 10 ;
osvi.dwMinorVersion = 0 ;
osvi.wProductType = VER_NT_WORKSTATION ;
if ( osvi.dwBuildNumber >= 22000)
sOsInfo = "OS Ms Windows 11 " ;
else
sOsInfo = "OS Ms Windows 10 " ;
}
else if ( EqualsMinorVersion( 3)) {
osvi.dwMinorVersion = 3 ;
if ( EqualsProductType( VER_NT_WORKSTATION)) {
osvi.wProductType = VER_NT_WORKSTATION ;
sOsInfo = "OS Ms Windows 8.1 " ;
}
else {
osvi.wProductType = VER_NT_SERVER ;
sOsInfo = "OS Ms Windows Server 2012 R2 " ;
}
}
else {
if ( osvi.wProductType == VER_NT_WORKSTATION)
sOsInfo = "OS Ms Windows 8 " ;
else
sOsInfo = "OS Ms Windows Server 2012 " ;
}
}
else if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) {
if ( osvi.wProductType == VER_NT_WORKSTATION)
sOsInfo = "OS Ms Windows 7 " ;
else
sOsInfo = "OS Ms Windows Server 2008 R2 " ;
}
else if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) {
if ( osvi.wProductType == VER_NT_WORKSTATION)
sOsInfo = "OS Ms Windows Vista " ;
else
sOsInfo = "OS Ms Windows Server 2008 " ;
}
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
if ( GetSystemMetrics( SM_SERVERR2))
sOsInfo = "OS Ms Windows Server 2003 \"R2\" ";
else if ( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
sOsInfo = "OS Ms Windows XP Professional x64 Edition " ;
else
sOsInfo = "OS Ms Windows Server 2003, " ;
}
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
sOsInfo = "OS Ms Windows XP " ;
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
sOsInfo = "OS Ms Windows 2000 " ;
else if ( osvi.dwMajorVersion <= 4)
sOsInfo = "OS Ms Windows NT " ;
else
sOsInfo = "OS Ms Windows " + ToString( int( osvi.dwMajorVersion)) +
"." + ToString( int( osvi.dwMinorVersion)) ;
// Tipo del prodotto
// se Windows Vista o successivo
if ( osvi.dwMajorVersion == 6) {
// Chiamo GetProductInfo
PGPI pGPI = (PGPI) GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll")), "GetProductInfo") ;
if ( pGPI != nullptr) {
DWORD dwType ;
pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType) ;
// a seconda del tipo, ...
switch( dwType) {
case 0x0001 : // PRODUCT_ULTIMATE
sOsInfo += "Ultimate Edition " ;
break;
case 0x0030 : // PRODUCT_PROFESSIONAL
sOsInfo += "Professional " ;
break;
case 0x0003 : // PRODUCT_HOME_PREMIUM
sOsInfo += "Home Premium Edition " ;
break;
case 0x0002 : // PRODUCT_HOME_BASIC
sOsInfo += "Home Basic Edition " ;
break;
case 0x0004 : // PRODUCT_ENTERPRISE
sOsInfo += "Enterprise Edition " ;
break;
case 0x0006 : // PRODUCT_BUSINESS
sOsInfo += "Business Edition " ;
break;
case 0x000B : // PRODUCT_STARTER
sOsInfo += "Starter Edition " ;
break;
case 0x0012 : // PRODUCT_CLUSTER_SERVER
sOsInfo += "Cluster Server Edition " ;
break;
case 0x0008 : // PRODUCT_DATACENTER_SERVER
sOsInfo += "Datacenter Edition " ;
break;
case 0x000C : // PRODUCT_DATACENTER_SERVER_CORE
sOsInfo += "Datacenter Edition (core installation) " ;
break;
case 0x000A : // PRODUCT_ENTERPRISE_SERVER
sOsInfo += "Enterprise Edition " ;
break;
case 0x000E : // PRODUCT_ENTERPRISE_SERVER_CORE
sOsInfo += "Enterprise Edition (core installation) " ;
break;
case 0x000F : // PRODUCT_ENTERPRISE_SERVER_IA64
sOsInfo += "Enterprise Edition for Itanium-based Systems " ;
break;
case 0x0009 : // PRODUCT_SMALLBUSINESS_SERVER
sOsInfo += "Small Business Server " ;
break;
case 0x0019 : // PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
sOsInfo += "Small Business Server Premium Edition " ;
break;
case 0x0007 : // PRODUCT_STANDARD_SERVER
sOsInfo += "Standard Edition " ;
break;
case 0x000D : // PRODUCT_STANDARD_SERVER_CORE
sOsInfo += "Standard Edition (core installation) " ;
break;
case 0x0011 : // PRODUCT_WEB_SERVER
sOsInfo += "Web Server Edition " ;
break;
}
}
// 32/64 bit
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
sOsInfo += "64-bit " ;
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
sOsInfo += "32-bit " ;
}
// se Windows NT 4.0 SP6 o successivo
else if ( bOsVersionInfoEx) {
// Test for the workstation type
if ( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_AMD64) {
if ( osvi.dwMajorVersion == 4)
sOsInfo += "Workstation 4.0 " ;
else if ( osvi.wSuiteMask & VER_SUITE_PERSONAL)
sOsInfo += "Home Edition " ;
else if ( GetSystemMetrics( SM_MEDIACENTER))
sOsInfo += "Media Center Edition " ;
else
sOsInfo += "Professional " ;
}
// Test for the server type.
else if ( osvi.wProductType == VER_NT_SERVER ||
osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) {
// Windows Server 2003
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) {
if ( osvi.wSuiteMask & VER_SUITE_DATACENTER )
sOsInfo += "Datacenter Edition for Itanium-based Systems " ;
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
sOsInfo += "Enterprise Edition for Itanium-based Systems " ;
}
else if ( si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
if ( osvi.wSuiteMask & VER_SUITE_DATACENTER)
sOsInfo += "Datacenter x64 Edition " ;
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
sOsInfo += "Enterprise x64 Edition " ;
else
sOsInfo += "Standard x64 Edition " ;
}
else {
if ( osvi.wSuiteMask & VER_SUITE_DATACENTER)
sOsInfo += "Datacenter Edition " ;
else if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
sOsInfo += "Enterprise Edition " ;
else if ( osvi.wSuiteMask == VER_SUITE_BLADE)
sOsInfo += "Web Edition " ;
else
sOsInfo += "Standard Edition " ;
}
}
// Windows 2000
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
if ( osvi.wSuiteMask & VER_SUITE_DATACENTER)
sOsInfo += "Datacenter Server " ;
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
sOsInfo += "Advanced Server " ;
else
sOsInfo += "Server " ;
}
// Windows NT 4.0
else {
if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
sOsInfo += "Server 4.0, Enterprise Edition " ;
else
sOsInfo += "Server 4.0 " ;
}
}
}
// se Windows NT 4.0 SP5 o precedente
else {
HKEY hKey ;
DWORD dwBufLen ;
wchar_t szProductType[80] ;
LONG lRet ;
dwBufLen = 80 ;
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
0, KEY_QUERY_VALUE, &hKey) ;
if ( lRet == ERROR_SUCCESS) {
lRet = RegQueryValueEx( hKey, L"ProductType", NULL, NULL,
(LPBYTE) szProductType, &dwBufLen) ;
if ( lRet == ERROR_SUCCESS && dwBufLen <= 80) {
if ( lstrcmpi( L"WINNT", szProductType) == 0 )
sOsInfo += "Professional " ;
if ( lstrcmpi( L"LANMANNT", szProductType) == 0 )
sOsInfo += "Server " ;
if ( lstrcmpi( L"SERVERNT", szProductType) == 0 )
sOsInfo += "Advanced Server " ;
}
}
RegCloseKey( hKey) ;
sOsInfo += "version " + ToString( int( osvi.dwMajorVersion)) + "." + ToString( int( osvi.dwMinorVersion)) ;
}
// Service pack (se presente), e numero di build
if ( osvi.dwMajorVersion == 4 &&
lstrcmpi( osvi.szCSDVersion, L"Service Pack 6") == 0) {
HKEY hKey ;
LONG lRet ;
// Test for SP6 versus SP6a.
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
0, KEY_QUERY_VALUE, &hKey) ;
if ( lRet == ERROR_SUCCESS) {
sOsInfo += "Service Pack 6a (Build " + ToString( int( osvi.dwBuildNumber & 0xFFFF)) + ")" ;
}
// Windows NT 4.0 prior to SP6a
else {
sOsInfo += wstrztoA( osvi.szCSDVersion) + string( " (Build ") + ToString( int( osvi.dwBuildNumber & 0xFFFF)) + ")" ;
}
RegCloseKey( hKey) ;
}
// non Windows NT 4.0
else {
// build non valida per Windows 8.1
if ( osvi.dwMajorVersion != 6 && osvi.dwMinorVersion != 3)
sOsInfo += wstrztoA( osvi.szCSDVersion) + string( " (Build ") + ToString( int( osvi.dwBuildNumber & 0xFFFF)) + ")" ;
}
}
// sistema operativo vecchio (non dovrebbe mai arrivare qui)
else
sOsInfo = "OS unknown (old)" ;
return true ;
}
//-----------------------------------------------------------------------------
bool
GetMemoryInfo( string& sMemInfo)
{
// verifico validità stringa di ritorno
if ( &sMemInfo == nullptr)
return false ;
// Recupero info sulla memoria
MEMORYSTATUSEX MemStat ;
MemStat.dwLength = sizeof( MEMORYSTATUSEX) ;
GlobalMemoryStatusEx( &MemStat) ;
// Costruisco stringa con info
sMemInfo = "Memory " + ToString( int( MemStat.ullTotalPhys / 1048576)) + " MB" ;
sMemInfo += " (virtual " + ToString( int( MemStat.ullTotalPageFile / 1048576)) + " MB)" ;
return true ;
}
//-----------------------------------------------------------------------------
bool
GetUserInfo( string& sUserInfo)
{
// verifico validità stringa di ritorno
if ( &sUserInfo == nullptr)
return false ;
// leggo nome computer su cui viene lanciato il programma
unsigned long nCnSize = MAX_COMPUTERNAME_LENGTH + 1 ;
wchar_t szCname[MAX_COMPUTERNAME_LENGTH + 1] ;
unsigned long nUnSize = UNLEN + 1 ;
wchar_t szUname[UNLEN + 1] ;
if ( GetUserName( szUname, &nUnSize) && GetComputerName( szCname, &nCnSize)) {
sUserInfo = wstrztoA( szUname) ;
sUserInfo += string( "/") + wstrztoA( szCname) ;
return true ;
}
return false ;
}