/////////////////////////////////////////////////////////////////////////////// // // File : kvi_osinfo.cpp // Creation date : 19 Jan 2006 GMT by Alexey Uzhva // // This toolbar is part of the KVirc irc client distribution // Copyright (C) 2006 Alexey Uzhva // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your opinion) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // /////////////////////////////////////////////////////////////////////////////// #define __KVILIB__ #include "kvi_osinfo.h" #include "kvi_locale.h" #include "kvi_qstring.h" #ifndef COMPILE_ON_WINDOWS #include #include #include #endif #ifdef COMPILE_ON_WINDOWS #include typedef enum QueryInfo { Os_Release, Os_Version, Os_Type }; typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); typedef BOOL (WINAPI *PGETPRODUCTINFO)(DWORD,DWORD,DWORD,DWORD,PDWORD); #define SM_SERVERR2 89 #define BUFSIZE 1024 //Vista :/ #define PRODUCT_BUSINESS 0x00000006 #define PRODUCT_BUSINESS_N 0x00000010 #define PRODUCT_CLUSTER_SERVER 0x00000012 #define PRODUCT_DATACENTER_SERVER 0x00000008 #define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C #define PRODUCT_ENTERPRISE 0x00000004 #define PRODUCT_ENTERPRISE_SERVER 0x0000000A #define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E #define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F #define PRODUCT_HOME_BASIC 0x00000002 #define PRODUCT_HOME_BASIC_N 0x00000005 #define PRODUCT_HOME_PREMIUM 0x00000003 #define PRODUCT_HOME_SERVER 0x00000013 #define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018 #define PRODUCT_SMALLBUSINESS_SERVER 0x00000009 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019 #define PRODUCT_STANDARD_SERVER 0x00000007 #define PRODUCT_STANDARD_SERVER_CORE 0x0000000D #define PRODUCT_STARTER 0x0000000B #define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017 #define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014 #define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015 #define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016 #define PRODUCT_UNDEFINED 0x00000000 #define PRODUCT_ULTIMATE 0x00000001 #define PRODUCT_WEB_SERVER 0x00000011 static TQString queryWinInfo( QueryInfo info) { TQString szVersion; OSVERSIONINFOEX osvi; SYSTEM_INFO si; PGNSI pGNSI; BOOL bOsVersionInfoEx; ZeroMemory(&si, sizeof(SYSTEM_INFO)); ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) { osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return FALSE; } // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. pGNSI = (PGNSI) GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); if(NULL != pGNSI) pGNSI(&si); else GetSystemInfo(&si); switch (osvi.dwPlatformId) { // Test for the Windows NT product family. case VER_PLATFORM_WIN32_NT: // Test for the specific product. if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) { if( osvi.wProductType == VER_NT_WORKSTATION ) szVersion+= "Windows Vista "; else szVersion+="Windows Server \"Longhorn\" "; } if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) { if( GetSystemMetrics(SM_SERVERR2) ) szVersion+="Windows Server 2003 \"R2\" "; else if( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) { szVersion+="Windows XP Professional x64 Edition "; } else szVersion+="Windows Server 2003, "; } if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) szVersion+="Windows XP "; if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) szVersion+="Windows 2000 "; if ( osvi.dwMajorVersion <= 4 ) szVersion+="Windows NT "; PGETPRODUCTINFO pGetProductInfo; pGetProductInfo = (PGETPRODUCTINFO) GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo"); // Test for specific product on Windows NT 4.0 SP6 and later. if( bOsVersionInfoEx ) { DWORD dwPlatformInfo; if(NULL != pGetProductInfo) if(pGetProductInfo(osvi.dwMajorVersion,osvi.dwMinorVersion, osvi.wServicePackMajor,osvi.wServicePackMinor,&dwPlatformInfo)) { switch(dwPlatformInfo) { case PRODUCT_BUSINESS: szVersion+="Business Edition"; break; case PRODUCT_BUSINESS_N: szVersion+="Business N Edition"; break; case PRODUCT_CLUSTER_SERVER: szVersion+="Cluster Server Edition"; break; case PRODUCT_DATACENTER_SERVER: szVersion+="Server Datacenter Edition (full installation)"; break; case PRODUCT_DATACENTER_SERVER_CORE: szVersion+="Server Datacenter Edition (core installation)"; break; case PRODUCT_ENTERPRISE: szVersion+="Enterprise Edition"; break; case PRODUCT_ENTERPRISE_SERVER: szVersion+="Server Enterprise Edition (full installation)"; break; case PRODUCT_ENTERPRISE_SERVER_CORE: szVersion+="Server Enterprise Edition (core installation)"; break; case PRODUCT_ENTERPRISE_SERVER_IA64: szVersion+="Server Enterprise Edition for Itanium-based Systems"; break; case PRODUCT_HOME_BASIC: szVersion+="Home Basic Edition"; break; case PRODUCT_HOME_BASIC_N: szVersion+="Home Basic N Edition"; break; case PRODUCT_HOME_PREMIUM: szVersion+="Home Premium Edition"; break; case PRODUCT_HOME_SERVER: szVersion+="Home Server Edition"; break; case PRODUCT_SERVER_FOR_SMALLBUSINESS: szVersion+="Server for Small Business Edition"; break; case PRODUCT_SMALLBUSINESS_SERVER: szVersion+="Small Business Server"; break; case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: szVersion+="Small Business Server Premium Edition"; break; case PRODUCT_STANDARD_SERVER: szVersion+="Server Standard Edition (full installation)"; break; case PRODUCT_STANDARD_SERVER_CORE: szVersion+="Server Standard Edition (core installation)"; break; case PRODUCT_STARTER: szVersion+="Starter Edition"; break; case PRODUCT_STORAGE_ENTERPRISE_SERVER: szVersion+="Storage Server Enterprise Edition"; break; case PRODUCT_STORAGE_EXPRESS_SERVER: szVersion+="Storage Server Express Edition"; break; case PRODUCT_STORAGE_STANDARD_SERVER: szVersion+="Storage Server Standard Edition"; break; case PRODUCT_STORAGE_WORKGROUP_SERVER: szVersion+="Storage Server Workgroup Edition"; break; case PRODUCT_UNDEFINED: szVersion+="An unknown product"; break; case PRODUCT_ULTIMATE: szVersion+="Ultimate Edition"; break; case PRODUCT_WEB_SERVER: szVersion+="Web Server Edition"; break; } szVersion+=" "; if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) { szVersion+="(x64) "; } } else { // Test for the workstation type. if ( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64) { if( osvi.dwMajorVersion == 4 ) szVersion+= "Workstation 4.0 " ; else if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) szVersion+= "Home Edition " ; else szVersion+= "Professional " ; } // Test for the server type. else if ( osvi.wProductType == VER_NT_SERVER || osvi.wProductType == VER_NT_DOMAIN_CONTROLLER ) { if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2) { if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) szVersion+= "Datacenter Edition for Itanium-based Systems" ; else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) szVersion+= "Enterprise Edition for Itanium-based Systems" ; } else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) szVersion+= "Datacenter x64 Edition " ; else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) szVersion+= "Enterprise x64 Edition " ; else szVersion+= "Standard x64 Edition " ; } else { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) szVersion+= "Datacenter Edition " ; else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) szVersion+= "Enterprise Edition " ; else if ( osvi.wSuiteMask == VER_SUITE_BLADE ) szVersion+= "Web Edition " ; else szVersion+= "Standard Edition " ; } } else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) szVersion+= "Datacenter Server " ; else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) szVersion+= "Advanced Server " ; else szVersion+= "Server " ; } else // Windows NT 4.0 { if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) szVersion+="Server 4.0, Enterprise Edition " ; else szVersion+= "Server 4.0 " ; } } } } // Test for specific product on Windows NT 4.0 SP5 and earlier else { HKEY hKey; TCHAR szProductType[BUFSIZE]; DWORD dwBufLen=BUFSIZE*sizeof(TCHAR); LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) return FALSE; lRet = RegQueryValueEx( hKey, TEXT("ProductType"), NULL, NULL, (LPBYTE) szProductType, &dwBufLen); RegCloseKey( hKey ); if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE*sizeof(TCHAR)) ) return FALSE; if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 ) szVersion+= "Workstation " ; if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 ) szVersion+= "Server " ; if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 ) szVersion+= "Advanced Server " ; } // Display service pack (if any) and build number. if( osvi.dwMajorVersion == 4 && lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 ) { HKEY hKey; LONG lRet; // Test for SP6 versus SP6a. lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey ); if( lRet == ERROR_SUCCESS ) szVersion+= TQString("Service Pack 6a (Build %1)").arg( osvi.dwBuildNumber & 0xFFFF ); else // Windows NT 4.0 prior to SP6a { szVersion+= TQString( "%1 (Build %2)").arg( osvi.szCSDVersion).arg( osvi.dwBuildNumber & 0xFFFF); } RegCloseKey( hKey ); } else // not Windows NT 4.0 { szVersion+= TQString( "%1 (Build %2)").arg( osvi.szCSDVersion).arg( osvi.dwBuildNumber & 0xFFFF); } break; // Test for the Windows Me/98/95. case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { szVersion+="Windows 95 "; if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B') szVersion+="OSR2 "; } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { szVersion+="Windows 98 "; if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B') szVersion+="SE "; } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { szVersion+="Windows Millennium Edition"; } break; case VER_PLATFORM_WIN32s: szVersion+="Win32s"; break; } if(info==Os_Release) { unsigned long major = osvi.dwMajorVersion; unsigned long minor = osvi.dwMinorVersion; unsigned long release = osvi.dwBuildNumber; TQString szMajor, szMinor, szRelease, szVersion; szMajor.setNum(major); szMinor.setNum(minor); szRelease.setNum(release); szVersion = "Release : "+szMajor +"."+ szMinor +"."+ szRelease; return szVersion; } if(info==Os_Type) { if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) return " NT "; if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) return " Windows "; if(osvi.dwPlatformId == VER_PLATFORM_WIN32s) return " Win32s "; return __tr2qs("Unknown "); } if(info==Os_Version) { return szVersion; } return "what's wrong? o.O"; } #endif namespace KviOsInfo { TQString type() { #ifdef COMPILE_ON_WINDOWS return queryWinInfo(Os_Type); #else #ifdef Q_OS_MACX return "macosx"; #else return "unix"; #endif #endif } TQString name() { #ifdef COMPILE_ON_WINDOWS return "windows"; #else struct utsname uts; if(uname(&uts) == 0) return TQString::fromLocal8Bit(uts.sysname); return KviTQString::empty; #endif } TQString version() { #ifdef COMPILE_ON_WINDOWS return queryWinInfo(Os_Version); #else struct utsname uts; if(uname(&uts) == 0) return TQString::fromLocal8Bit(uts.version); return KviTQString::empty; #endif } TQString release() { #ifdef COMPILE_ON_WINDOWS return queryWinInfo(Os_Release); #else struct utsname uts; if(uname(&uts) == 0) return TQString::fromLocal8Bit(uts.release); return KviTQString::empty; #endif } TQString machine() { #ifdef COMPILE_ON_WINDOWS TQString mach = getenv("PROCESSOR_IDENTIFIER"); return mach.section(",",0,0); #else struct utsname uts; if(uname(&uts) == 0) return TQString::fromLocal8Bit(uts.machine); return KviTQString::empty; #endif } TQString nodename() { #ifdef COMPILE_ON_WINDOWS return "windows"; #else struct utsname uts; if(uname(&uts) == 0) return TQString::fromLocal8Bit(uts.nodename); return KviTQString::empty; #endif } TQString hostname() { char hbuffer[1024]; if(gethostname(hbuffer,1024) == 0) return TQString::fromLocal8Bit(hbuffer); else return KviTQString::empty; } }