//---------------------------------------------------------------------------- // 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) 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 ; }