본문 바로가기

개발자이야기/VC++

vc++ 윈도우 구분 소스

반응형
#include <windows.h>
#include <stdio.h>

#define BUFSIZE 80

int main()
{
  OSVERSIONINFOEX osvi;
  BOOL bOsVersionInfoEx;
  
  // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
  // If that fails, try using the OSVERSIONINFO structure.
  
  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  
  if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
  {
    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
      return FALSE;
  }
  
  switch (osvi.dwPlatformId)
  {
    // Test for the Windows NT product family.
  case VER_PLATFORM_WIN32_NT:
    
    // Test for the specific product.
    if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
      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 )
      {
        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( 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 " );
        }
      }
    }
    else // Test for specific product on Windows NT 4.0 SP5 and earlier
    {
      HKEY hKey;
      char szProductType[BUFSIZE];
      DWORD dwBufLen=BUFSIZE;
      LONG lRet;
      
      lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
        "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
        0, KEY_QUERY_VALUE, &hKey );
      if( lRet != ERROR_SUCCESS )
        return FALSE;
      
      lRet = RegQueryValueEx( hKey, "ProductType"NULLNULL,
        (LPBYTE) szProductType, &dwBufLen);
      if( (lRet != ERROR_SUCCESS) (dwBufLen > BUFSIZE) )
        return FALSE;
      
      RegCloseKey( hKey );
      
      if ( lstrcmpi( "WINNT", szProductType) == 0 )
        printf( "Workstation " );
      if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
        printf( "Server " );
      if ( lstrcmpi( "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"Service Pack 6" ) == 0 )
    {
      HKEY hKey;
      LONG lRet;
      
      // Test for SP6 versus SP6a.
      lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
        "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
      {
        printf( "%s (Build %d)\n",
          osvi.szCSDVersion,
          osvi.dwBuildNumber & 0xFFFF);
      }
      
      RegCloseKey( hKey );
    }
    else // not Windows NT 4.0 
    {
      printf( "%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' )
        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
} 
반응형