摘自MSDN的 GetNativeSystemInfo 的說明例子
#include <windows.h><br />#include <tchar.h><br />#include <stdio.h><br />#define BUFSIZE 80<br />typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);<br />int __cdecl _tmain()<br />{<br /> OSVERSIONINFOEX osvi;<br /> SYSTEM_INFO si;<br /> PGNSI pGNSI;<br /> BOOL bOsVersionInfoEx;<br /> ZeroMemory(&si, sizeof(SYSTEM_INFO));<br /> ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));<br /> // Try calling GetVersionEx using the OSVERSIONINFOEX structure.<br /> // If that fails, try using the OSVERSIONINFO structure.<br /> osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);<br /> if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )<br /> {<br /> osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);<br /> if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )<br /> return FALSE;<br /> }<br /> // Call GetNativeSystemInfo if supported<br /> // or GetSystemInfo otherwise.<br /> pGNSI = (PGNSI) GetProcAddress(<br /> GetModuleHandle(TEXT("kernel32.dll")),<br /> "GetNativeSystemInfo");<br /> if(NULL != pGNSI)<br /> pGNSI(&si);<br /> else GetSystemInfo(&si);<br /> switch (osvi.dwPlatformId)<br /> {<br /> // Test for the Windows NT product family.<br /> case VER_PLATFORM_WIN32_NT:<br /> // Test for the specific product.<br /> if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )<br /> {<br /> if( osvi.wProductType == VER_NT_WORKSTATION )<br /> printf ("Windows Vista ");<br /> else printf ("Windows Server /"Longhorn/" " );<br /> }<br /> if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )<br /> {<br /> if( GetSystemMetrics(SM_SERVERR2) )<br /> printf( "Microsoft Windows Server 2003 /"R2/" ");<br /> else if( osvi.wProductType == VER_NT_WORKSTATION &&<br /> si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)<br /> {<br /> printf( "Microsoft Windows XP Professional x64 Edition ");<br /> }<br /> else printf ("Microsoft Windows Server 2003, ");<br /> }<br /> if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )<br /> printf ("Microsoft Windows XP ");<br /> if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )<br /> printf ("Microsoft Windows 2000 ");<br /> if ( osvi.dwMajorVersion <= 4 )<br /> printf ("Microsoft Windows NT ");<br /> // Test for specific product on Windows NT 4.0 SP6 and later.<br /> if( bOsVersionInfoEx )<br /> {<br /> // Test for the workstation type.<br /> if ( osvi.wProductType == VER_NT_WORKSTATION &&<br /> si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)<br /> {<br /> if( osvi.dwMajorVersion == 4 )<br /> printf ( "Workstation 4.0 " );<br /> else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )<br /> printf ( "Home Edition " );<br /> else printf ( "Professional " );<br /> }</p><p> // Test for the server type.<br /> else if ( osvi.wProductType == VER_NT_SERVER ||<br /> osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )<br /> {<br /> if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)<br /> {<br /> if ( si.wProcessorArchitecture ==<br /> PROCESSOR_ARCHITECTURE_IA64 )<br /> {<br /> if( osvi.wSuiteMask & VER_SUITE_DATACENTER )<br /> printf ( "Datacenter Edition "<br /> "for Itanium-based Systems" );<br /> else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )<br /> printf ( "Enterprise Edition "<br /> "for Itanium-based Systems" );<br /> }<br /> else if ( si.wProcessorArchitecture ==<br /> PROCESSOR_ARCHITECTURE_AMD64 )<br /> {<br /> if( osvi.wSuiteMask & VER_SUITE_DATACENTER )<br /> printf ( "Datacenter x64 Edition " );<br /> else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )<br /> printf ( "Enterprise x64 Edition " );<br /> else printf( "Standard x64 Edition " );<br /> }<br /> else<br /> {<br /> if( osvi.wSuiteMask & VER_SUITE_DATACENTER )<br /> printf ( "Datacenter Edition " );<br /> else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )<br /> printf ( "Enterprise Edition " );<br /> else if ( osvi.wSuiteMask & VER_SUITE_BLADE )<br /> printf ( "Web Edition " );<br /> else printf ( "Standard Edition " );<br /> }<br /> }<br /> else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)<br /> {<br /> if( osvi.wSuiteMask & VER_SUITE_DATACENTER )<br /> printf ( "Datacenter Server " );<br /> else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )<br /> printf ( "Advanced Server " );<br /> else printf ( "Server " );<br /> }<br /> else // Windows NT 4.0<br /> {<br /> if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )<br /> printf ("Server 4.0, Enterprise Edition " );<br /> else printf ( "Server 4.0 " );<br /> }<br /> }<br /> }<br /> // Test for specific product on Windows NT 4.0 SP5 and earlier<br /> else<br /> {<br /> HKEY hKey;<br /> TCHAR szProductType[BUFSIZE];<br /> DWORD dwBufLen=BUFSIZE*sizeof(TCHAR);<br /> LONG lRet;<br /> lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,<br /> TEXT("SYSTEM//CurrentControlSet//Control//"<br /> "ProductOptions"), 0, KEY_QUERY_VALUE, &hKey );<br /> if( lRet != ERROR_SUCCESS )<br /> return FALSE;<br /> lRet = RegQueryValueEx( hKey, TEXT("ProductType"),<br /> NULL, NULL, (LPBYTE) szProductType, &dwBufLen);<br /> RegCloseKey( hKey );<br /> if( (lRet != ERROR_SUCCESS) ||<br /> (dwBufLen > BUFSIZE*sizeof(TCHAR)) )<br /> return FALSE;<br /> if ( lstrcmpi( TEXT("WINNT"), szProductType) == 0 )<br /> printf( "Workstation " );<br /> if ( lstrcmpi( TEXT("LANMANNT"), szProductType) == 0 )<br /> printf( "Server " );<br /> if ( lstrcmpi( TEXT("SERVERNT"), szProductType) == 0 )<br /> printf( "Advanced Server " );<br /> printf( "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );<br /> }<br /> // Display service pack (if any) and build number.<br /> if( osvi.dwMajorVersion == 4 &&<br /> lstrcmpi( osvi.szCSDVersion, TEXT("Service Pack 6") ) == 0 )<br /> {<br /> HKEY hKey;<br /> LONG lRet;<br /> // Test for SP6 versus SP6a.<br /> lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,<br /> TEXT("SOFTWARE//Microsoft//Windows NT//CurrentVersion//"<br /> "Hotfix//Q246009"), 0, KEY_QUERY_VALUE, &hKey );<br /> if( lRet == ERROR_SUCCESS )<br /> printf( "Service Pack 6a (Build %d)/n",<br /> osvi.dwBuildNumber & 0xFFFF );<br /> else // Windows NT 4.0 prior to SP6a<br /> {<br /> _tprintf( TEXT("%s (Build %d)/n"),<br /> osvi.szCSDVersion,<br /> osvi.dwBuildNumber & 0xFFFF);<br /> }<br /> RegCloseKey( hKey );<br /> }<br /> else // not Windows NT 4.0<br /> {<br /> _tprintf( TEXT("%s (Build %d)/n"),<br /> osvi.szCSDVersion,<br /> osvi.dwBuildNumber & 0xFFFF);<br /> }<br /> break;<br /> // Test for the Windows Me/98/95.<br /> case VER_PLATFORM_WIN32_WINDOWS:<br /> if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)<br /> {<br /> printf ("Microsoft Windows 95 ");<br /> if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')<br /> printf("OSR2 " );<br /> }<br /> if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)<br /> {<br /> printf ("Microsoft Windows 98 ");<br /> if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')<br /> printf("SE " );<br /> }<br /> if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)<br /> {<br /> printf ("Microsoft Windows Millennium Edition/n");<br /> }<br /> break;<br /> case VER_PLATFORM_WIN32s:<br /> printf ("Microsoft Win32s/n");<br /> break;<br /> }<br /> return TRUE;<br />}<br />