24b02ba725
- aggiornamento riconoscimento OS per Windows 11 - modifiche per chiave di rete.
403 lines
16 KiB
C++
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)
|
|
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 ;
|
|
}
|