1 //獲取系統版本 2 BOOL GetOSName( CString& csOsName ) 3 { 4 OSVERSIONINFOEX osvi; 5 SYSTEM_INFO si; 6 BOOL bOsVersionInfoEx; 7 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 8 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 9 10 // Try calling GetVersionEx using the OSVERSIONINFOEX structure. 11 // If that fails, try using the OSVERSIONINFO structure. 12 13 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 14 15 bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi); 16 if( !bOsVersionInfoEx ) 17 { 18 osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); 19 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 20 return FALSE; 21 } 22 23 // Call GetNativeSystemInfo if supported 24 // or GetSystemInfo otherwise. 25 else GetSystemInfo(&si); 26 27 switch (osvi.dwPlatformId) 28 { 29 // Test for the Windows NT product family. 30 31 case VER_PLATFORM_WIN32_NT: 32 33 // Test for the specific product. 34 35 if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) 36 { 37 if( osvi.wProductType == VER_NT_WORKSTATION ) 38 { 39 csOsName += _T( "Windows Vista " ); 40 } 41 else 42 { 43 csOsName += _T( "Windows Server \"Longhorn\" " ); 44 } 45 } 46 47 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) 48 { 49 if( osvi.wProductType == VER_NT_WORKSTATION && 50 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) 51 { 52 csOsName += _T( "Microsoft Windows XP Professional x64 Edition " ); 53 } 54 else 55 { 56 csOsName += _T( "Microsoft Windows Server 2003, " ); 57 } 58 } 59 60 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) 61 { 62 csOsName += _T( "Microsoft Windows XP " ); 63 } 64 65 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) 66 { 67 csOsName += _T( "Microsoft Windows 2000 " ); 68 } 69 70 if ( osvi.dwMajorVersion <= 4 ) 71 { 72 csOsName += _T( "Microsoft Windows NT " ); 73 } 74 75 // Test for specific product on Windows NT 4.0 SP6 and later. 76 if( bOsVersionInfoEx ) 77 { 78 // Test for the workstation type. 79 if ( osvi.wProductType == VER_NT_WORKSTATION && 80 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64) 81 { 82 if( osvi.dwMajorVersion == 4 ) 83 { 84 csOsName += _T( "Workstation 4.0 " ); 85 } 86 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) 87 { 88 csOsName += _T( "Home Edition " ); 89 } 90 else 91 { 92 csOsName += _T( "Professional " ); 93 } 94 } 95 96 // Test for the server type. 97 else if ( osvi.wProductType == VER_NT_SERVER || 98 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER ) 99 { 100 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2) 101 { 102 if ( si.wProcessorArchitecture == 103 PROCESSOR_ARCHITECTURE_IA64 ) 104 { 105 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 106 { 107 csOsName += _T("Datacenter Edition for Itanium-based Systems"); 108 } 109 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 110 { 111 csOsName += _T("Enterprise Edition for Itanium-based Systems"); 112 } 113 } 114 115 else if ( si.wProcessorArchitecture == 116 PROCESSOR_ARCHITECTURE_AMD64 ) 117 { 118 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 119 { 120 csOsName += _T( "Datacenter x64 Edition " ); 121 } 122 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 123 { 124 125 } 126 else 127 { 128 csOsName += _T( "Standard x64 Edition " ); 129 } 130 } 131 else 132 { 133 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 134 { 135 csOsName += _T( "Datacenter Edition " ); 136 } 137 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 138 { 139 csOsName += _T( "Enterprise Edition " ); 140 } 141 else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) 142 { 143 csOsName += _T( "Web Edition " ); 144 } 145 else 146 { 147 csOsName += _T( "Standard Edition " ); 148 } 149 } 150 } 151 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0) 152 { 153 if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 154 { 155 csOsName += _T( "Datacenter Server " ); 156 } 157 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 158 { 159 csOsName += _T( "Advanced Server " ); 160 } 161 else 162 { 163 csOsName += _T( "Server " ); 164 } 165 } 166 else // Windows NT 4.0 167 { 168 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 169 { 170 csOsName += _T( "Server 4.0, Enterprise Edition " ); 171 } 172 else 173 { 174 csOsName += _T( "Server 4.0 " ); 175 } 176 } 177 } 178 } 179 // Test for specific product on Windows NT 4.0 SP5 and earlier 180 else 181 { 182 HKEY hKey; 183 TCHAR szProductType[256]; 184 DWORD dwBufLen=256*sizeof(TCHAR); 185 LONG lRet; 186 187 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, 188 _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 189 0, KEY_QUERY_VALUE, &hKey ); 190 if( lRet != ERROR_SUCCESS ) 191 return FALSE; 192 193 lRet = RegQueryValueEx( hKey, TEXT("ProductType"), 194 NULL, NULL, (LPBYTE) szProductType, &dwBufLen); 195 RegCloseKey( hKey ); 196 197 if( (lRet != ERROR_SUCCESS) || 198 (dwBufLen > 256*sizeof(TCHAR)) ) 199 return FALSE; 200 201 if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 ) 202 { 203 csOsName += _T( "Workstation " ); 204 } 205 if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 ) 206 { 207 csOsName += _T( "Server " ); 208 } 209 if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 ) 210 { 211 csOsName += _T( "Advanced Server " ); 212 } 213 CString cstmp; 214 cstmp.Format( _T( "%d.%d " ), osvi.dwMajorVersion, osvi.dwMinorVersion ); 215 csOsName += cstmp; 216 } 217 218 // Display service pack (if any) and build number. 219 220 if( osvi.dwMajorVersion == 4 && 221 lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 ) 222 { 223 HKEY hKey; 224 LONG lRet; 225 226 // Test for SP6 versus SP6a. 227 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, 228 _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 229 0, KEY_QUERY_VALUE, &hKey ); 230 if( lRet == ERROR_SUCCESS ) 231 { 232 CString cstmp; 233 cstmp.Format( _T( "Service Pack 6a (Build %d)" ), osvi.dwBuildNumber & 0xFFFF ); 234 csOsName += cstmp; 235 } 236 else // Windows NT 4.0 prior to SP6a 237 { 238 CString cstmp; 239 cstmp.Format( _T( "%s (Build %d)" ), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF ); 240 csOsName += cstmp; 241 } 242 RegCloseKey( hKey ); 243 } 244 else // not Windows NT 4.0 245 { 246 CString cstmp; 247 cstmp.Format( _T( "%s (Build %d)" ), osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF ); 248 csOsName += cstmp; 249 } 250 251 break; 252 253 // Test for the Windows Me/98/95. 254 case VER_PLATFORM_WIN32_WINDOWS: 255 256 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) 257 { 258 csOsName += _T( "Microsoft Windows 95 " ); 259 if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B') 260 { 261 csOsName += _T( "OSR2 " ); 262 } 263 } 264 265 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) 266 { 267 csOsName += _T("Microsoft Windows 98 "); 268 if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B') 269 { 270 csOsName += _T("SE " ); 271 } 272 } 273 274 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) 275 { 276 csOsName += _T("Microsoft Windows Millennium Edition"); 277 } 278 break; 279 280 case VER_PLATFORM_WIN32s: 281 282 csOsName += _T("Microsoft Win32s\n"); 283 break; 284 } 285 return TRUE; 286 }