You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/win/uname.c

264 lines
7.4 KiB

/*
This file is part of the KDE libraries
Copyright (C) 2003-2007 Jaroslaw Staniek <js@iidea.pl>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <windows.h>
#include <sys/utsname.h>
#include <stdio.h>
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
#ifndef SM_SERVERR2
# define SM_SERVERR2 89
#endif
int kde_gethostname(char *__name, size_t __len);
/**
MS Windows implementation of uname().
E.g. on Windows 2000
<code>
utsname n;
printf("%s, %s, %s, %s, %s\n", n.sysname, n.release, n.version, n.machine, n.nodename);
</code>
it will print something like:
<code>
Microsoft Windows, 5.0 (2000 Professional), Dec 16 2004, i686, MYHOSTNAME
</code>
Note that utsname.version is just a compile time of kdewin32 library (__DATE__).
*/
KDEWIN32_EXPORT int uname(struct utsname *name)
{
OSVERSIONINFOEX versioninfo;
SYSTEM_INFO sysinfo;
PGNSI pGNSI;
unsigned int proctype;
char valid_processor_level;
char *ostype = 0;
char *osproduct = 0;
char tmpnodename[MAX_COMPUTERNAME_LENGTH+2];
size_t tmpnodenamelen = MAX_COMPUTERNAME_LENGTH+1;
BOOL osVersionInfoEx;
if (!name)
return -1;
ZeroMemory(&sysinfo, sizeof(SYSTEM_INFO));
ZeroMemory(&versioninfo, sizeof(OSVERSIONINFOEX));
/* Try calling GetVersionEx using the OSVERSIONINFOEX,
if that fails, try using the OSVERSIONINFO. */
versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if ( !(osVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &versioninfo)) ) {
versioninfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &versioninfo) )
return -1;
}
valid_processor_level = versioninfo.dwPlatformId == VER_PLATFORM_WIN32_NT
|| (versioninfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && versioninfo.dwMinorVersion >= 10 /*>= win98*/);
/* Use GetNativeSystemInfo if supported or GetSystemInfo otherwise */
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
if (NULL != pGNSI)
pGNSI(&sysinfo);
else
GetSystemInfo(&sysinfo);
/* CPU type */
switch (sysinfo.wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_INTEL:
if (valid_processor_level) {
if (sysinfo.wProcessorLevel<3)
proctype = 3;
else if (sysinfo.wProcessorLevel > 9) /*Pentium 4?*/
proctype = 6;
else /*typical*/
proctype = sysinfo.wProcessorLevel;
}
else {
if (sysinfo.dwProcessorType == PROCESSOR_INTEL_386
|| sysinfo.dwProcessorType == PROCESSOR_INTEL_486)
proctype = sysinfo.dwProcessorType / 100;
else
proctype = PROCESSOR_INTEL_PENTIUM / 100;
}
sprintf (name->machine, "i%d86", proctype);
break;
case PROCESSOR_ARCHITECTURE_ALPHA:
strcpy (name->machine, "alpha");
break;
case PROCESSOR_ARCHITECTURE_MIPS:
strcpy (name->machine, "mips");
break;
default:
strcpy (name->machine, "unknown");
break;
}
strncpy(name->sysname, "Microsoft Windows", 19);
/* OS Type */
switch (versioninfo.dwPlatformId) {
case VER_PLATFORM_WIN32_NT:
switch (versioninfo.dwMajorVersion) {
case 3:
case 4:
ostype = "NT";
break;
case 5:
switch (versioninfo.dwMinorVersion) {
case 0:
ostype = "2000";
break;
case 1:
ostype = "XP";
break;
case 2:
if( GetSystemMetrics(SM_SERVERR2) )
ostype = "Server 2003 \"R2\"";
else if( versioninfo.wProductType == VER_NT_WORKSTATION
&& sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
ostype = "XP Professional x64 Edition";
else
ostype = "Server 2003";
break;
}
break;
case 6:
switch (versioninfo.dwMinorVersion) {
case 0:
switch (versioninfo.wProductType) {
case VER_NT_WORKSTATION:
ostype = "Vista";
break;
default:
ostype = "Server \"Longhorn\"";
break;
}
default:
break;
}
break;
default:
break;
}
break;
case VER_PLATFORM_WIN32_WINDOWS:
switch (versioninfo.dwMinorVersion) {
case 0:
ostype = "95";
break;
case 10:
ostype = "98";
break;
case 90:
ostype = "Me";
break;
default:
break;
}
break;
default:
break;
}
/* Test for specific product on Windows NT 4.0 SP6 and later */
if (osVersionInfoEx) {
/* Workstation type */
if ( versioninfo.wProductType == VER_NT_WORKSTATION
&& sysinfo.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
{
if( versioninfo.dwMajorVersion == 4 )
osproduct = "Workstation 4.0";
else if( versioninfo.wSuiteMask & VER_SUITE_PERSONAL )
osproduct = "Home Edition";
else
osproduct = "Professional";
}
/* Server type */
else if ( versioninfo.wProductType == VER_NT_SERVER
|| versioninfo.wProductType == VER_NT_DOMAIN_CONTROLLER )
{
if (versioninfo.dwMajorVersion == 5 && versioninfo.dwMinorVersion == 2) {
if ( sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
if( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
osproduct = "Datacenter Edition for Itanium-based Systems";
else if( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
osproduct = "Enterprise Edition for Itanium-based Systems";
}
else if ( sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ) {
if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
osproduct = "Datacenter x64 Edition";
else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
osproduct = "Enterprise x64 Edition";
else
osproduct = "Standard x64 Edition";
}
else {
if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
osproduct = "Datacenter Edition";
else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
osproduct = "Enterprise Edition";
else if ( versioninfo.wSuiteMask & VER_SUITE_BLADE )
osproduct = "Web Edition";
else
osproduct = "Standard Edition";
}
}
else if ( versioninfo.dwMajorVersion == 5 && versioninfo.dwMinorVersion == 0) {
if ( versioninfo.wSuiteMask & VER_SUITE_DATACENTER )
osproduct = "Datacenter Server";
else if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
osproduct = "Advanced Server";
else
osproduct = "Server";
}
else { /* NT 4.0 */
if ( versioninfo.wSuiteMask & VER_SUITE_ENTERPRISE )
osproduct = "Server 4.0, Enterprise Edition";
else
osproduct = "Server 4.0";
}
} /* \server type */
} /* \product */
if (0==kde_gethostname(tmpnodename, tmpnodenamelen))
strncpy(name->nodename, tmpnodename, 19);
else
name->nodename[0]=0;
strncpy(name->version, __DATE__, 19); /** @todo ok? */
if (osproduct)
sprintf(name->release, "%d.%d (%s %s)", versioninfo.dwMajorVersion,
versioninfo.dwMinorVersion, ostype, osproduct);
else if (ostype)
sprintf(name->release, "%d.%d (%s)", versioninfo.dwMajorVersion,
versioninfo.dwMinorVersion, ostype);
else
sprintf(name->release, "%d.%d", versioninfo.dwMajorVersion,
versioninfo.dwMinorVersion);
return 0;
}