kopia lustrzana https://github.com/jamescoxon/dl-fldigi
324 wiersze
10 KiB
C
324 wiersze
10 KiB
C
/* Adapted from libgw32c-0.4 */
|
|
|
|
/*
|
|
Platform SDK: Windows System Information
|
|
|
|
See: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/sysinfo_5r76.asp
|
|
|
|
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
#define BUFSIZE 80
|
|
|
|
#define VIDSIZE 13
|
|
static const char * vid_cyrix = "CyrixInstead";
|
|
static const char * vid_centaur = "CentaurHauls";
|
|
static const char * vid_rise = "RiseRiseRise";
|
|
static const char * vid_intel = "GenuineIntel";
|
|
static const char * vid_amd = "AuthenticAMD";
|
|
static const char * vid_tmx86 = "GenuineTMx86";
|
|
static const char * vid_geode = "Geode by NSC";
|
|
static const char * vid_umc = "UMC UMC UMC ";
|
|
static const char * vid_amd2 = "AMD ISBETTER";
|
|
static const char * vid_amd3 = "DEI ";
|
|
static const char * vid_amd4 = "NexGenerationAMD";
|
|
static const char * vid_nexgen = "NexGenDriven";
|
|
|
|
#define cpuid(op,a,b,c,d)\
|
|
__asm__("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (op));
|
|
|
|
static void GetVendorID (char *vid)
|
|
{
|
|
unsigned long MaxEax, ebx, ecx, edx, zerobyte;
|
|
|
|
cpuid (0, MaxEax, ebx, ecx, edx);
|
|
memcpy (vid, &ebx, 4);
|
|
memcpy (vid+4, &edx, 4);
|
|
memcpy (vid+8, &ecx, 4);
|
|
zerobyte = 0;
|
|
memcpy (vid+12, &zerobyte, 1);
|
|
}
|
|
|
|
BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName)
|
|
{
|
|
SYSTEM_INFO sysinf;
|
|
int family;
|
|
char VendorId [VIDSIZE+2];
|
|
|
|
ZeroMemory(&sysinf, sizeof(SYSTEM_INFO));
|
|
GetSystemInfo(&sysinf);
|
|
family = sysinf.wProcessorLevel;
|
|
|
|
switch (sysinf.wProcessorArchitecture) {
|
|
case PROCESSOR_ARCHITECTURE_UNKNOWN:
|
|
strcpy(MachineName, "unknown");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_INTEL:
|
|
strcpy(MachineName, "ix86");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_MIPS:
|
|
strcpy(MachineName, "mips");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_ALPHA:
|
|
strcpy(MachineName, "alpha");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_PPC:
|
|
strcpy(MachineName, "ppc");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_IA64:
|
|
strcpy(MachineName, "IA64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
|
|
strcpy(MachineName, "IA32 on Win64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
strcpy(MachineName, "amd64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_SHX:
|
|
strcpy(MachineName, "sh");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_ARM:
|
|
strcpy(MachineName, "arm");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_ALPHA64:
|
|
strcpy(MachineName, "alpha64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_MSIL:
|
|
strcpy(MachineName, "msil");
|
|
break;
|
|
default:
|
|
strcpy(MachineName, "unknown");
|
|
break;
|
|
}
|
|
|
|
if (sysinf.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
|
|
switch(family) {
|
|
case 3:
|
|
strcpy(MachineName, "i386");
|
|
break;
|
|
case 4:
|
|
strcpy(MachineName, "i486");
|
|
break;
|
|
case 5:
|
|
strcpy(MachineName, "i586");
|
|
break;
|
|
case 6:
|
|
strcpy(MachineName, "i686");
|
|
break;
|
|
case 7:
|
|
strcpy(MachineName, "i786");
|
|
break;
|
|
case 15:
|
|
strcpy(MachineName, "i786");
|
|
break;
|
|
default:
|
|
strcpy(MachineName, "ix86");
|
|
}
|
|
|
|
GetVendorID(VendorId);
|
|
|
|
if (!strcmp(VendorId, vid_cyrix))
|
|
strcpy(ProcessorName, "Cyrix");
|
|
else if (!strcmp(VendorId, vid_centaur))
|
|
strcpy(ProcessorName, "Centaur");
|
|
else if (!strcmp(VendorId, vid_rise))
|
|
strcpy(ProcessorName, "Rise");
|
|
else if (!strcmp(VendorId, vid_intel))
|
|
strcpy(ProcessorName, "Intel");
|
|
else if (!strcmp(VendorId, vid_amd))
|
|
strcpy(ProcessorName, "AMD");
|
|
else if (!strcmp(VendorId, vid_tmx86))
|
|
strcpy(ProcessorName, "Transmeta");
|
|
else if (!strcmp(VendorId, vid_geode))
|
|
strcpy(ProcessorName, "Geode");
|
|
else if (!strcmp(VendorId, vid_umc))
|
|
strcpy(ProcessorName, "UMC");
|
|
else if (!strcmp(VendorId, vid_amd2))
|
|
strcpy(ProcessorName, "AMD");
|
|
else if (!strcmp(VendorId, vid_amd3))
|
|
strcpy(ProcessorName, "AMD");
|
|
else if (!strcmp(VendorId, vid_amd4))
|
|
strcpy(ProcessorName, "AMD");
|
|
else if (!strcmp(VendorId, vid_nexgen))
|
|
strcpy(ProcessorName, "NexGen");
|
|
else
|
|
strcpy(ProcessorName, "Unknown");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
Platform SDK: Windows System Information
|
|
|
|
Adapted from:
|
|
http://msdn.microsoft.com/library/en-us/sysinfo/base/getting_the_system_version.asp
|
|
http://www.codeproject.com/system/winvertable.asp
|
|
|
|
Getting the System Version
|
|
|
|
The following example uses the GetVersionEx function to display the
|
|
version of the currently running operating system.
|
|
|
|
Relying on version information is not the best way to test for a feature.
|
|
Instead, refer to the documentation for the feature of interest.
|
|
For more information on common techniques for feature detection, see
|
|
Operating System Version.
|
|
|
|
If you must require a particular operating system, be sure to use it
|
|
as a minimum supported version, rather than design the test for the
|
|
one operating system. This way, your detection code will continue to
|
|
work on future versions of Windows.
|
|
*/
|
|
|
|
#undef BUFSIZE
|
|
#define BUFSIZE 255
|
|
|
|
BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version)
|
|
{
|
|
OSVERSIONINFOEX osvi;
|
|
BOOL bOsVersionInfoEx;
|
|
DWORD BuildNumber;
|
|
|
|
// 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 ((LPOSVERSIONINFO) &osvi)) ) {
|
|
// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
|
|
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
|
if (! GetVersionEx ( (LPOSVERSIONINFO) &osvi) )
|
|
return FALSE;
|
|
}
|
|
|
|
BuildNumber = osvi.dwBuildNumber & 0xFFFF;
|
|
switch (osvi.dwPlatformId) {
|
|
// Tests for Windows NT product family.
|
|
case VER_PLATFORM_WIN32_NT:
|
|
// Test for the product.
|
|
if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 )
|
|
strcpy(OsName, "Microsoft Windows NT 3.51");
|
|
else if ( osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 )
|
|
strcpy(OsName, "Microsoft Windows NT 4.0");
|
|
else if ( osvi.dwMajorVersion <= 4 && osvi.dwMinorVersion == 0 )
|
|
strcpy(OsName, "Microsoft Windows NT");
|
|
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
|
|
strcpy(OsName, "Microsoft Windows Server 2003 family, ");
|
|
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
|
|
strcpy(OsName, "Microsoft Windows XP");
|
|
else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
|
|
strcpy(OsName, "Microsoft Windows 2000");
|
|
|
|
|
|
if( bOsVersionInfoEx ) { // Use information from GetVersionEx.
|
|
// Test for the workstation type.
|
|
if ( osvi.wProductType == VER_NT_WORKSTATION ) {
|
|
if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
|
|
strcat(OsName, " Home Edition" );
|
|
else
|
|
strcat(OsName, " Professional" );
|
|
}
|
|
// Test for the server type.
|
|
else if ( osvi.wProductType == VER_NT_SERVER) {
|
|
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
|
|
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
|
|
strcat(OsName, " Datacenter Edition" );
|
|
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
|
if( osvi.dwMajorVersion == 4 )
|
|
strcat(OsName, " Advanced Server" );
|
|
else
|
|
strcat(OsName, " Enterprise Edition" );
|
|
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
|
|
strcat(OsName, " Web Edition" );
|
|
else
|
|
strcat(OsName, " Standard Edition" );
|
|
}
|
|
else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) {
|
|
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
|
|
strcat(OsName, " Datacenter Server" );
|
|
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
|
strcat(OsName, " Advanced Server" );
|
|
else
|
|
strcat(OsName, " Server" );
|
|
}
|
|
else // Windows NT 4.0 {
|
|
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
|
strcat(OsName, "Server 4.0, Enterprise Edition ");
|
|
else
|
|
strcat(OsName, "Server 4.0 " );
|
|
}
|
|
}
|
|
else { // Use the registry on early versions of Windows NT.
|
|
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 )
|
|
strcat(OsName, " Professional" );
|
|
if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
|
|
strcat(OsName, " Server" );
|
|
if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
|
|
strcat(OsName, " Advanced Server" );
|
|
}
|
|
// Display version, service pack (if any), and build number.
|
|
strcat (OsName, " ");
|
|
strcat (OsName, osvi.szCSDVersion);
|
|
break;
|
|
// Test for the Windows 95 product family.
|
|
case VER_PLATFORM_WIN32_WINDOWS:
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) {
|
|
strcpy(OsName, "Microsoft Windows 95");
|
|
if (BuildNumber > 950 && BuildNumber <= 1080)
|
|
strcat(OsName, " SP1");
|
|
else if (BuildNumber > 1080)
|
|
strcat(OsName, " OSR2");
|
|
/*
|
|
if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
|
|
strcat(OsName, "OSR2 " );
|
|
*/
|
|
}
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) {
|
|
strcpy(OsName, "Microsoft Windows 98");
|
|
if (BuildNumber > 1998 && BuildNumber < 2183)
|
|
strcat(OsName, " SP1");
|
|
else if (BuildNumber >= 2183)
|
|
strcat(OsName, " SE");
|
|
/*
|
|
if ( osvi.szCSDVersion[1] == 'A' )
|
|
strcat(OsName, "SE " );
|
|
*/
|
|
}
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) {
|
|
strcpy(OsName, "Microsoft Windows Millennium Edition ");
|
|
}
|
|
break;
|
|
}
|
|
sprintf(Release, "%lu.%lu.%lu", osvi.dwPlatformId,
|
|
osvi.dwMajorVersion,
|
|
osvi.dwMinorVersion);
|
|
sprintf(Version, "%lu",
|
|
osvi.dwBuildNumber & 0xFFFF);
|
|
return TRUE;
|
|
}
|