获取操作系统版本和系统位数

获取操作系统版本和系统位数

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define BUFSIZE 
80

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO)
;

int __cdecl _tmain()
{
   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 )
             printf (
" Windows Vista  " ) ;
         else printf ( " Windows Server \ " Longhorn\ "   "  ) ;
      }

      if ( osvi.dwMajorVersion 
==   5  && osvi.dwMinorVersion  ==   2  )
      {
         if( GetSystemMetrics(SM_SERVERR2) )
            printf( 
" Microsoft Windows Server 2003 \ " R2\ "   " ) ;
         else if( osvi.wProductType  ==  VER_NT_WORKSTATION &&
            si.wProcessorArchitecture
== PROCESSOR_ARCHITECTURE_AMD64)  // PROCESSOR_ARCHITECTURE_AMD64 64位;  PROCESSOR_ARCHITECTURE_INTEL  32位
         {
            printf( 
" Microsoft Windows XP Professional x64 Edition  " ) ;
         }
         else printf (
" Microsoft Windows Server 2003,  " ) ;
      }

      if ( osvi.dwMajorVersion 
==   5  && osvi.dwMinorVersion  ==   1  )
         printf (
" Microsoft Windows XP  " ) ;

      if ( osvi.dwMajorVersion 
==   5  && osvi.dwMinorVersion  ==   0  )
         printf (
" Microsoft Windows 2000  " ) ;

      if ( osvi.dwMajorVersion <
=   4  )
         printf (
" Microsoft Windows NT  " ) ;

      // Test for specific product on Windows NT 
4.0  SP6 and later.
      if( bOsVersionInfoEx )
      {
         // Test for the workstation type.
         if ( osvi.wProductType 
==  VER_NT_WORKSTATION &&
              si.wProcessorArchitecture!
= PROCESSOR_ARCHITECTURE_AMD64)
         {
            if( osvi.dwMajorVersion 
==   4  )
               printf ( 
" Workstation 4.0  "  ) ;
            else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
               printf ( 
" Home Edition  "  ) ;
            else printf (  " 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 )
                      printf ( 
" Datacenter Edition  "
                               
" for Itanium-based Systems "  ) ;
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                      printf ( 
" Enterprise Edition  "
                               
" for Itanium-based Systems "  ) ;
               }

               else if ( si.wProcessorArchitecture 
==
                         PROCESSOR_ARCHITECTURE_AMD64 )
               {
                   if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                      printf ( 
" Datacenter x64 Edition  "  ) ;
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                      printf ( 
" Enterprise x64 Edition  "  ) ;
                   else printf(  " Standard x64 Edition  "  ) ;
               }

               else
               {
                   if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                      printf ( 
" Datacenter Edition  "  ) ;
                   else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                      printf ( 
" Enterprise Edition  "  ) ;
                   else if ( osvi.wSuiteMask & VER_SUITE_BLADE )
                      printf ( 
" Web Edition  "  ) ;
                   else printf (  " Standard Edition  "  ) ;
               }
            }
            else if(osvi.dwMajorVersion
== 5  && osvi.dwMinorVersion == 0 )
            {
               if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
                  printf ( 
" Datacenter Server  "  ) ;
               else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                  printf ( 
" Advanced Server  "  ) ;
               else printf (  " Server  "  ) ;
            }
            else  // Windows NT 
4.0  
            {
               if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
                  printf (
" Server 4.0, Enterprise Edition  "  ) ;
               else printf (  " 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  )
            printf( 
" Workstation  "  ) ;
         if ( lstrcmpi( TEXT( " LANMANNT " ) ,  szProductType)  ==   0  )
            printf( 
" Server  "  ) ;
         if ( lstrcmpi( TEXT( " SERVERNT " ) ,  szProductType)  ==   0  )
            printf( 
" Advanced Server  "  ) ;
         printf(  " %d.%d  " ,  osvi.dwMajorVersion ,  osvi.dwMinorVersion ) ;
      }

      // 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 )
            printf( 
" Service Pack 6a (Build %d)\n " ,  
            osvi.dwBuildNumber & 0xFFFF )
;          
         else // Windows NT  4.0  prior to SP6a
         {
            _tprintf( TEXT(
" %s (Build %d)\n " ) ,
               osvi.szCSDVersion
,
               osvi.dwBuildNumber & 0xFFFF)
;
         }

         RegCloseKey( hKey )
;
      }
      else // not Windows NT 
4.0  
      {
         _tprintf( TEXT(
" %s (Build %d)\n " ) ,
            osvi.szCSDVersion
,
            osvi.dwBuildNumber & 0xFFFF)
;
      }

      break
;

      // Test for the Windows Me/
98 / 95 .
      case VER_PLATFORM_WIN32_WINDOWS:

      if (osvi.dwMajorVersion 
==   4  && osvi.dwMinorVersion  ==   0 )
      {
          printf (
" Microsoft Windows 95  " ) ;
          if (osvi.szCSDVersion [ 1 ] == 'C' || osvi.szCSDVersion [ 1 ] == 'B')
             printf(
" OSR2  "  ) ;
      } 

      if (osvi.dwMajorVersion 
==   4  && osvi.dwMinorVersion  ==   10 )
      {
          printf (
" Microsoft Windows 98  " ) ;
          if ( osvi.szCSDVersion [ 1 ] == 'A' || osvi.szCSDVersion [ 1 ] == 'B')
             printf(
" SE  "  ) ;
      } 

      if (osvi.dwMajorVersion 
==   4  && osvi.dwMinorVersion  ==   90 )
      {
          printf (
" Microsoft Windows Millennium Edition\n " ) ;
      } 
      break
;

      case VER_PLATFORM_WIN32s:

      printf (
" Microsoft Win32s\n " ) ;
      break ;
   }
   return TRUE
;  
}

To determine whether a Win32-based application is running under WOW64, call the IsWow64Process function. (GetCurrentProcess)

你可能感兴趣的:(获取操作系统版本和系统位数)