#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", NULL, NULL,
        (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;
}

 
2006/05/13 23:26 2006/05/13 23:26

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요