* cygcheck.cc (dump_sysinfo): Always try to get a OSVERSIONINFOEX

first.  Load kernel32.dll earlier.  Make osname a buffer.  Simplify
	Non-NT code.  Use GetProductInfo in Vista/2008 case.  Clean up
	non-Vista version info.  Exit early if not on NT.
This commit is contained in:
Corinna Vinschen 2008-01-13 13:41:45 +00:00
parent 40617efc8b
commit 2652ae1036
2 changed files with 126 additions and 59 deletions

View File

@ -1,3 +1,10 @@
2008-01-13 Corinna Vinschen <corinna@vinschen.de>
* cygcheck.cc (dump_sysinfo): Always try to get a OSVERSIONINFOEX
first. Load kernel32.dll earlier. Make osname a buffer. Simplify
Non-NT code. Use GetProductInfo in Vista/2008 case. Clean up
non-Vista version info. Exit early if not on NT.
2007-12-29 Dave Korn <dave.korn@artimi.com>
* bloda.cc (enum bad_app): Add BYTEMOBILE.

View File

@ -1179,98 +1179,156 @@ dump_sysinfo ()
time_t now;
char *found_cygwin_dll;
bool is_nt = false;
bool more_info = true;
char osname[80];
printf ("\nCygwin Configuration Diagnostics\n");
time (&now);
printf ("Current System Time: %s\n", ctime (&now));
OSVERSIONINFO osversion;
osversion.dwOSVersionInfoSize = sizeof (osversion);
if (!GetVersionEx (&osversion))
OSVERSIONINFOEX osversion;
osversion.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
if (!GetVersionEx (reinterpret_cast<LPOSVERSIONINFO>(&osversion)))
{
more_info = false;
osversion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (!GetVersionEx (reinterpret_cast<LPOSVERSIONINFO>(&osversion)))
display_error ("dump_sysinfo: GetVersionEx()");
const char *osname = "unknown OS";
}
HMODULE k32 = LoadLibrary ("kernel32.dll");
switch (osversion.dwPlatformId)
{
case VER_PLATFORM_WIN32s:
osname = "32s";
strcpy (osname, "32s (not supported)");
break;
case VER_PLATFORM_WIN32_WINDOWS:
switch (osversion.dwMinorVersion)
{
case 0:
osname = "95 (not supported)";
break;
case 10:
osname = "98 (not supported)";
break;
case 90:
osname = "ME (not supported)";
break;
default:
osname = "9X (not supported)";
break;
}
strcpy (osname, "95/98/Me (not supported)");
break;
case VER_PLATFORM_WIN32_NT:
is_nt = true;
if (osversion.dwMajorVersion == 6)
osname = "Vista";
else if (osversion.dwMajorVersion == 5)
{
BOOL more_info = FALSE;
OSVERSIONINFOEX osversionex;
osversionex.dwOSVersionInfoSize = sizeof (osversionex);
if (GetVersionEx ((OSVERSIONINFO *) &osversionex))
more_info = TRUE;
if (osversion.dwMinorVersion == 0)
{
if (!more_info)
osname = "2000";
else if (osversionex.wProductType == VER_NT_SERVER
|| osversionex.wProductType == VER_NT_DOMAIN_CONTROLLER)
{
if (osversionex.wSuiteMask & VER_SUITE_DATACENTER)
osname = "2000 Datacenter Server";
else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE)
osname = "2000 Advanced Server";
BOOL (WINAPI *GetProductInfo) (DWORD, DWORD, DWORD, DWORD, PDWORD) =
(BOOL (WINAPI *)(DWORD, DWORD, DWORD, DWORD, PDWORD))
GetProcAddress (k32, "GetProductInfo");
if (osversion.wProductType == VER_NT_WORKSTATION)
strcpy (osname, "Vista");
else
osname = "2000 Server";
strcpy (osname, "2008");
DWORD prod;
if (GetProductInfo (osversion.dwMajorVersion,
osversion.dwMinorVersion,
osversion.wServicePackMajor,
osversion.wServicePackMinor,
&prod))
{
#define PRODUCT_UNLICENSED 0xabcdabcd
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x19
const char *products[] =
{
"",
" Ultimate Edition",
" Home Basic Edition",
" Home Premium Edition",
" Enterprise Edition",
" Home Basic N Edition",
" Business Edition",
" Server Standard Edition",
" Server Datacenter Edition",
" Small Business Server",
" Server Enterprise Edition",
" Starter Edition",
" Server Datacenter Edition Core",
" Server Standard Edition Core",
" Server Enterprise Edition Core",
" Server Enterprise Edition for Itanium-based Systems",
" Business N Edition",
" Web Server Edition",
" Cluster Server Edition",
" Home Server Edition",
" Storage Server Express Edition",
" Storage Server Standard Edition",
" Storage Server Workgroup Edition",
" Storage Server Enterprise Edition",
" Server for Small Business Edition",
" Small Business Server Premium Edition"
};
if (prod == PRODUCT_UNLICENSED)
strcat (osname, "Unlicensed");
else if (prod > PRODUCT_SMALLBUSINESS_SERVER_PREMIUM)
strcat (osname, "");
else
strcat (osname, products[prod]);
}
else
osname = "2000 Professional";
{
}
}
else if (osversion.dwMajorVersion == 5)
{
if (osversion.dwMinorVersion == 0)
{
strcpy (osname, "2000");
if (osversion.wProductType == VER_NT_WORKSTATION)
strcat (osname, " Professional");
else if (osversion.wSuiteMask & VER_SUITE_DATACENTER)
strcat (osname, " Datacenter Server");
else if (osversion.wSuiteMask & VER_SUITE_ENTERPRISE)
strcat (osname, " Advanced Server");
else
strcat (osname, " Server");
}
else if (osversion.dwMinorVersion == 1)
{
strcpy (osname, "XP");
if (GetSystemMetrics (SM_MEDIACENTER))
osname = "XP Media Center Edition";
strcat (osname, " Media Center Edition");
else if (GetSystemMetrics (SM_TABLETPC))
osname = "XP Tablet PC Edition";
else if (!more_info)
osname = "XP";
else if (osversionex.wSuiteMask & VER_SUITE_PERSONAL)
osname = "XP Home Edition";
strcat (osname, " Tablet PC Edition");
else if (GetSystemMetrics (SM_STARTER))
strcat (osname, " Starter Edition");
else if (osversion.wSuiteMask & VER_SUITE_PERSONAL)
strcat (osname, " Home Edition");
else
osname = "XP Professional";
strcat (osname, " Professional");
}
else if (osversion.dwMinorVersion == 2)
{
if (!more_info)
osname = "2003 Server";
else if (osversionex.wSuiteMask & VER_SUITE_BLADE)
osname = "2003 Web Server";
else if (osversionex.wSuiteMask & VER_SUITE_DATACENTER)
osname = "2003 Datacenter Server";
else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE)
osname = "2003 Enterprise Server";
strcpy (osname, "2003 Server");
if (GetSystemMetrics (SM_SERVERR2))
strcat (osname, " R2");
if (osversion.wSuiteMask & VER_SUITE_BLADE)
strcat (osname, " Web Edition");
else if (osversion.wSuiteMask & VER_SUITE_DATACENTER)
strcat (osname, " Datacenter Edition");
else if (osversion.wSuiteMask & VER_SUITE_ENTERPRISE)
strcat (osname, " Enterprise Edition");
else if (osversion.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
strcat (osname, " Compute Cluster Edition");
}
}
else if (osversion.dwMajorVersion == 4)
{
strcpy (osname, "NT 4");
if (more_info)
{
if (osversion.wProductType == VER_NT_WORKSTATION)
strcat (osname, " Workstation");
else
osname = "2003 Server";
{
strcat (osname, " Server");
if (osversion.wSuiteMask & VER_SUITE_ENTERPRISE)
strcat (osname, " Enterprise Edition");
}
}
}
else
osname = "NT";
strcpy (osname, "NT");
break;
default:
osname = "??";
strcpy (osname, "??");
break;
}
printf ("Windows %s Ver %lu.%lu Build %lu %s\n", osname,
@ -1280,7 +1338,9 @@ dump_sysinfo ()
osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ?
osversion.szCSDVersion : "");
HMODULE k32 = LoadLibrary ("kernel32.dll");
if (osversion.dwPlatformId == VER_PLATFORM_WIN32s
|| osversion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
exit (EXIT_FAILURE);
BOOL (WINAPI *wow64_func) (HANDLE, PBOOL) = (BOOL (WINAPI *) (HANDLE, PBOOL))
GetProcAddress (k32, "IsWow64Process");