* 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> 2007-12-29 Dave Korn <dave.korn@artimi.com>
* bloda.cc (enum bad_app): Add BYTEMOBILE. * bloda.cc (enum bad_app): Add BYTEMOBILE.

View File

@ -1179,98 +1179,156 @@ dump_sysinfo ()
time_t now; time_t now;
char *found_cygwin_dll; char *found_cygwin_dll;
bool is_nt = false; bool is_nt = false;
bool more_info = true;
char osname[80];
printf ("\nCygwin Configuration Diagnostics\n"); printf ("\nCygwin Configuration Diagnostics\n");
time (&now); time (&now);
printf ("Current System Time: %s\n", ctime (&now)); printf ("Current System Time: %s\n", ctime (&now));
OSVERSIONINFO osversion; OSVERSIONINFOEX osversion;
osversion.dwOSVersionInfoSize = sizeof (osversion); osversion.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
if (!GetVersionEx (&osversion)) if (!GetVersionEx (reinterpret_cast<LPOSVERSIONINFO>(&osversion)))
display_error ("dump_sysinfo: GetVersionEx()"); {
const char *osname = "unknown OS"; more_info = false;
osversion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (!GetVersionEx (reinterpret_cast<LPOSVERSIONINFO>(&osversion)))
display_error ("dump_sysinfo: GetVersionEx()");
}
HMODULE k32 = LoadLibrary ("kernel32.dll");
switch (osversion.dwPlatformId) switch (osversion.dwPlatformId)
{ {
case VER_PLATFORM_WIN32s: case VER_PLATFORM_WIN32s:
osname = "32s"; strcpy (osname, "32s (not supported)");
break; break;
case VER_PLATFORM_WIN32_WINDOWS: case VER_PLATFORM_WIN32_WINDOWS:
switch (osversion.dwMinorVersion) strcpy (osname, "95/98/Me (not supported)");
{
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;
}
break; break;
case VER_PLATFORM_WIN32_NT: case VER_PLATFORM_WIN32_NT:
is_nt = true; is_nt = true;
if (osversion.dwMajorVersion == 6) if (osversion.dwMajorVersion == 6)
osname = "Vista"; {
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
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
{
}
}
else if (osversion.dwMajorVersion == 5) 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 (osversion.dwMinorVersion == 0)
{ {
if (!more_info) strcpy (osname, "2000");
osname = "2000"; if (osversion.wProductType == VER_NT_WORKSTATION)
else if (osversionex.wProductType == VER_NT_SERVER strcat (osname, " Professional");
|| osversionex.wProductType == VER_NT_DOMAIN_CONTROLLER) else if (osversion.wSuiteMask & VER_SUITE_DATACENTER)
{ strcat (osname, " Datacenter Server");
if (osversionex.wSuiteMask & VER_SUITE_DATACENTER) else if (osversion.wSuiteMask & VER_SUITE_ENTERPRISE)
osname = "2000 Datacenter Server"; strcat (osname, " Advanced Server");
else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE)
osname = "2000 Advanced Server";
else
osname = "2000 Server";
}
else else
osname = "2000 Professional"; strcat (osname, " Server");
} }
else if (osversion.dwMinorVersion == 1) else if (osversion.dwMinorVersion == 1)
{ {
strcpy (osname, "XP");
if (GetSystemMetrics (SM_MEDIACENTER)) if (GetSystemMetrics (SM_MEDIACENTER))
osname = "XP Media Center Edition"; strcat (osname, " Media Center Edition");
else if (GetSystemMetrics (SM_TABLETPC)) else if (GetSystemMetrics (SM_TABLETPC))
osname = "XP Tablet PC Edition"; strcat (osname, " Tablet PC Edition");
else if (!more_info) else if (GetSystemMetrics (SM_STARTER))
osname = "XP"; strcat (osname, " Starter Edition");
else if (osversionex.wSuiteMask & VER_SUITE_PERSONAL) else if (osversion.wSuiteMask & VER_SUITE_PERSONAL)
osname = "XP Home Edition"; strcat (osname, " Home Edition");
else else
osname = "XP Professional"; strcat (osname, " Professional");
} }
else if (osversion.dwMinorVersion == 2) else if (osversion.dwMinorVersion == 2)
{ {
if (!more_info) strcpy (osname, "2003 Server");
osname = "2003 Server"; if (GetSystemMetrics (SM_SERVERR2))
else if (osversionex.wSuiteMask & VER_SUITE_BLADE) strcat (osname, " R2");
osname = "2003 Web Server"; if (osversion.wSuiteMask & VER_SUITE_BLADE)
else if (osversionex.wSuiteMask & VER_SUITE_DATACENTER) strcat (osname, " Web Edition");
osname = "2003 Datacenter Server"; else if (osversion.wSuiteMask & VER_SUITE_DATACENTER)
else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE) strcat (osname, " Datacenter Edition");
osname = "2003 Enterprise Server"; 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 else
osname = "2003 Server"; {
strcat (osname, " Server");
if (osversion.wSuiteMask & VER_SUITE_ENTERPRISE)
strcat (osname, " Enterprise Edition");
}
} }
} }
else else
osname = "NT"; strcpy (osname, "NT");
break; break;
default: default:
osname = "??"; strcpy (osname, "??");
break; break;
} }
printf ("Windows %s Ver %lu.%lu Build %lu %s\n", osname, printf ("Windows %s Ver %lu.%lu Build %lu %s\n", osname,
@ -1280,7 +1338,9 @@ dump_sysinfo ()
osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ? osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ?
osversion.szCSDVersion : ""); 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)) BOOL (WINAPI *wow64_func) (HANDLE, PBOOL) = (BOOL (WINAPI *) (HANDLE, PBOOL))
GetProcAddress (k32, "IsWow64Process"); GetProcAddress (k32, "IsWow64Process");