2005-01-20 23:22:22 +00:00
|
|
|
// Berkeley Open Infrastructure for Network Computing
|
|
|
|
// http://boinc.berkeley.edu
|
|
|
|
// Copyright (C) 2005 University of California
|
2002-06-06 18:50:12 +00:00
|
|
|
//
|
2005-01-20 23:22:22 +00:00
|
|
|
// This is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
|
|
// License as published by the Free Software Foundation;
|
|
|
|
// either version 2.1 of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This software 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 Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// To view the GNU Lesser General Public License visit
|
|
|
|
// http://www.gnu.org/copyleft/lesser.html
|
|
|
|
// or write to the Free Software Foundation, Inc.,
|
|
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
2002-06-06 18:50:12 +00:00
|
|
|
|
2004-06-16 23:29:48 +00:00
|
|
|
#include "boinc_win.h"
|
|
|
|
|
2002-06-06 18:50:12 +00:00
|
|
|
#include "client_types.h"
|
2003-06-19 18:19:35 +00:00
|
|
|
#include "filesys.h"
|
2003-03-10 19:05:25 +00:00
|
|
|
#include "util.h"
|
2005-01-07 07:32:23 +00:00
|
|
|
#include "client_msgs.h"
|
2004-06-16 19:21:11 +00:00
|
|
|
#include "hostinfo_network.h"
|
|
|
|
#include "hostinfo.h"
|
2002-06-06 18:50:12 +00:00
|
|
|
|
2004-12-18 20:52:14 +00:00
|
|
|
HINSTANCE g_hIdleDetectionDll;
|
2004-06-29 23:31:51 +00:00
|
|
|
|
2005-11-07 11:12:51 +00:00
|
|
|
// Memory Status Structure for Win2K and WinXP based systems.
|
|
|
|
typedef struct _MYMEMORYSTATUSEX {
|
|
|
|
DWORD dwLength;
|
|
|
|
DWORD dwMemoryLoad;
|
|
|
|
DWORDLONG ullTotalPhys;
|
|
|
|
DWORDLONG ullAvailPhys;
|
|
|
|
DWORDLONG ullTotalPageFile;
|
|
|
|
DWORDLONG ullAvailPageFile;
|
|
|
|
DWORDLONG ullTotalVirtual;
|
|
|
|
DWORDLONG ullAvailVirtual;
|
|
|
|
DWORDLONG ullAvailExtendedVirtual;
|
|
|
|
} MYMEMORYSTATUSEX, *LPMYMEMORYSTATUSEX;
|
|
|
|
|
|
|
|
typedef BOOL (WINAPI *MYGLOBALMEMORYSTATUSEX)(LPMYMEMORYSTATUSEX lpBuffer);
|
|
|
|
|
|
|
|
|
2002-12-09 23:52:17 +00:00
|
|
|
// Returns the number of seconds difference from UTC
|
|
|
|
//
|
|
|
|
int get_timezone(void) {
|
|
|
|
TIME_ZONE_INFORMATION tzi;
|
|
|
|
ZeroMemory(&tzi, sizeof(TIME_ZONE_INFORMATION));
|
|
|
|
GetTimeZoneInformation(&tzi);
|
2004-05-28 05:53:24 +00:00
|
|
|
return -(tzi.Bias * 60);
|
2002-12-09 23:52:17 +00:00
|
|
|
}
|
|
|
|
|
2002-07-15 23:21:20 +00:00
|
|
|
// Gets windows specific host information (not complete)
|
|
|
|
//
|
2004-03-31 19:53:31 +00:00
|
|
|
int HOST_INFO::get_host_info() {
|
2004-03-02 09:46:18 +00:00
|
|
|
|
2004-05-05 00:41:32 +00:00
|
|
|
ZeroMemory(os_name, sizeof(os_name));
|
|
|
|
ZeroMemory(os_version, sizeof(os_version));
|
|
|
|
|
2004-03-02 09:46:18 +00:00
|
|
|
// This code snip-it was copied straight out of the MSDN Platform SDK
|
|
|
|
// Getting the System Version example and modified to dump the output
|
2004-03-31 19:53:31 +00:00
|
|
|
// into os_name.
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
GetVersionEx ( (OSVERSIONINFO *) &osvi );
|
2002-06-06 18:50:12 +00:00
|
|
|
}
|
|
|
|
|
2004-05-05 00:41:32 +00:00
|
|
|
|
2004-03-02 09:46:18 +00:00
|
|
|
switch (osvi.dwPlatformId)
|
|
|
|
{
|
|
|
|
case VER_PLATFORM_WIN32_NT:
|
|
|
|
|
2004-03-11 21:23:44 +00:00
|
|
|
if ( osvi.dwMajorVersion >= 6 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy(os_name, "Microsoft Windows Longhorn" );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy(os_name, "Microsoft Windows 2003" );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy(os_name, "Microsoft Windows XP" );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy(os_name, "Microsoft Windows 2000" );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
if ( osvi.dwMajorVersion <= 4 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy(os_name, "Microsoft Windows NT" );
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VER_PLATFORM_WIN32_WINDOWS:
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
|
|
|
|
strcpy(os_name, "Microsoft Windows 95" );
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
|
|
|
|
strcpy( os_name, "Microsoft Windows 98" );
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
|
|
|
|
strcpy( os_name, "Microsoft Windows Millennium" );
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VER_PLATFORM_WIN32s:
|
|
|
|
|
|
|
|
strcpy( os_name, "Microsoft Win32s" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
char szVersion[128];
|
|
|
|
char szSKU[128];
|
|
|
|
char szServicePack[128];
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory( szVersion, sizeof(szVersion) );
|
|
|
|
ZeroMemory( szSKU, sizeof(szSKU) );
|
|
|
|
ZeroMemory( szServicePack, sizeof(szServicePack) );
|
|
|
|
|
|
|
|
|
|
|
|
snprintf( szVersion, sizeof(szVersion), ", (%.2u.%.2u.%.4u.%.2u)",
|
|
|
|
osvi.dwMajorVersion, osvi.dwMinorVersion, (osvi.dwBuildNumber & 0xFFFF), 0 );
|
|
|
|
|
|
|
|
|
|
|
|
switch (osvi.dwPlatformId)
|
|
|
|
{
|
|
|
|
// Test for the Windows NT product family.
|
|
|
|
case VER_PLATFORM_WIN32_NT:
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
// 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 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Workstation Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Home Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Professional Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Test for the server type.
|
|
|
|
else if ( (osvi.wProductType == VER_NT_SERVER) || (osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) )
|
|
|
|
{
|
2004-05-05 00:41:32 +00:00
|
|
|
if( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
|
2004-03-02 09:46:18 +00:00
|
|
|
{
|
|
|
|
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Datacenter Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Enterprise Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Web Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Standard Server Edition" );
|
|
|
|
}
|
|
|
|
else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
|
|
|
|
{
|
|
|
|
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
|
|
|
|
strcpy( szSKU, "Datacenter Server Edition" );
|
|
|
|
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
|
|
|
strcpy( szSKU, "Enterprise Server Edition" );
|
|
|
|
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
|
|
|
|
strcpy( szSKU, "Web Server Edition" );
|
|
|
|
else
|
|
|
|
strcpy( szSKU, "Standard Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
|
|
|
|
{
|
|
|
|
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Datacenter Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Advanced Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Standard Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
else // Windows NT 4.0
|
|
|
|
{
|
|
|
|
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Enterprise Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
else
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else // Test for specific product on Windows NT 4.0 SP5 and earlier
|
|
|
|
{
|
|
|
|
HKEY hKey;
|
|
|
|
char szProductType[80];
|
|
|
|
DWORD dwBufLen=sizeof(szProductType);
|
|
|
|
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 > 80) )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
RegCloseKey( hKey );
|
|
|
|
|
|
|
|
if ( lstrcmpi( "WINNT", szProductType) == 0 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Workstation Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szSKU, "Advanced Server Edition" );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Display service pack (if any) and build number.
|
|
|
|
|
2004-03-10 00:55:28 +00:00
|
|
|
if( osvi.dwMajorVersion == 4 && lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
|
2004-03-02 09:46:18 +00:00
|
|
|
{
|
|
|
|
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 )
|
2004-03-10 00:55:28 +00:00
|
|
|
{
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szServicePack, ", " );
|
|
|
|
strcat( szServicePack, "Service Pack 6a" );
|
2004-03-10 00:55:28 +00:00
|
|
|
}
|
2004-03-02 09:46:18 +00:00
|
|
|
else // Windows NT 4.0 prior to SP6a
|
|
|
|
{
|
|
|
|
if ( strlen(osvi.szCSDVersion) > 0 )
|
|
|
|
{
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szServicePack, ", " );
|
|
|
|
strcat( szServicePack, osvi.szCSDVersion );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RegCloseKey( hKey );
|
|
|
|
}
|
|
|
|
else // Windows NT 3.51 and earlier or Windows 2000 and later
|
|
|
|
{
|
|
|
|
if ( strlen(osvi.szCSDVersion) > 0 )
|
|
|
|
{
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szServicePack, ", " );
|
|
|
|
strcat( szServicePack, osvi.szCSDVersion );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
// Test for the Windows 95 product family.
|
|
|
|
case VER_PLATFORM_WIN32_WINDOWS:
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
|
|
|
|
{
|
|
|
|
if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szServicePack, "OSR2" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
|
|
|
|
{
|
|
|
|
if ( osvi.szCSDVersion[1] == 'A' )
|
2004-05-05 00:41:32 +00:00
|
|
|
strcpy( szServicePack, "SE" );
|
2004-03-02 09:46:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2004-05-05 00:41:32 +00:00
|
|
|
snprintf( os_version, sizeof(os_version), "%s%s%s",
|
|
|
|
szSKU, szServicePack, szVersion );
|
2004-03-02 09:46:18 +00:00
|
|
|
|
2002-06-06 18:50:12 +00:00
|
|
|
|
2004-12-16 22:43:31 +00:00
|
|
|
// Detect the number of CPUs
|
2002-06-06 18:50:12 +00:00
|
|
|
SYSTEM_INFO SystemInfo;
|
|
|
|
memset( &SystemInfo, NULL, sizeof( SystemInfo ) );
|
|
|
|
::GetSystemInfo( &SystemInfo );
|
2002-10-02 22:05:19 +00:00
|
|
|
|
2004-03-31 19:53:31 +00:00
|
|
|
p_ncpus = SystemInfo.dwNumberOfProcessors;
|
2002-10-02 22:05:19 +00:00
|
|
|
|
2004-12-16 22:43:31 +00:00
|
|
|
// Detect the filesystem information
|
2004-03-31 19:53:31 +00:00
|
|
|
get_filesystem_info(d_total, d_free);
|
2003-01-29 23:10:46 +00:00
|
|
|
|
|
|
|
// Open the WinSock dll so we can get host info
|
|
|
|
WORD wVersionRequested;
|
|
|
|
WSADATA wsdata;
|
|
|
|
wVersionRequested = MAKEWORD(1, 1);
|
|
|
|
WSAStartup(wVersionRequested, &wsdata);
|
|
|
|
|
|
|
|
// Get host name/ip info
|
2004-06-17 17:00:14 +00:00
|
|
|
get_local_network_info(
|
|
|
|
domain_name, sizeof(domain_name), ip_addr, sizeof(ip_addr)
|
|
|
|
);
|
2002-06-06 18:50:12 +00:00
|
|
|
|
2003-01-29 23:10:46 +00:00
|
|
|
// Close the WinSock dll
|
|
|
|
WSACleanup();
|
|
|
|
|
2004-03-31 19:53:31 +00:00
|
|
|
timezone = get_timezone();
|
2002-12-09 23:52:17 +00:00
|
|
|
|
2005-11-07 11:12:51 +00:00
|
|
|
// Detect the amount of memory the system has with the new API, if it doesn't
|
|
|
|
// exist, then use the older API.
|
|
|
|
HMODULE hKernel32;
|
|
|
|
MYGLOBALMEMORYSTATUSEX myGlobalMemoryStatusEx;
|
|
|
|
hKernel32 = LoadLibrary("kernel32.dll");
|
|
|
|
if (hKernel32) {
|
|
|
|
myGlobalMemoryStatusEx = (MYGLOBALMEMORYSTATUSEX) GetProcAddress(hKernel32, "GlobalMemoryStatusEx");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hKernel32 && myGlobalMemoryStatusEx) {
|
|
|
|
MYMEMORYSTATUSEX mStatusEx;
|
|
|
|
ZeroMemory(&mStatusEx, sizeof(MYMEMORYSTATUSEX));
|
|
|
|
mStatusEx.dwLength = sizeof(MYMEMORYSTATUSEX);
|
|
|
|
(*myGlobalMemoryStatusEx)(&mStatusEx);
|
|
|
|
m_nbytes = (double)mStatusEx.ullTotalPhys;
|
|
|
|
m_swap = (double)mStatusEx.ullTotalPageFile;
|
|
|
|
} else {
|
|
|
|
MEMORYSTATUS mStatus;
|
|
|
|
ZeroMemory(&mStatus, sizeof(MEMORYSTATUS));
|
|
|
|
mStatus.dwLength = sizeof(MEMORYSTATUS);
|
|
|
|
GlobalMemoryStatus(&mStatus);
|
|
|
|
m_nbytes = (double)mStatus.dwTotalPhys;
|
|
|
|
m_swap = (double)mStatus.dwTotalPageFile;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hKernel32) {
|
|
|
|
FreeLibrary(hKernel32);
|
|
|
|
}
|
2002-12-09 23:52:17 +00:00
|
|
|
|
2004-12-16 22:43:31 +00:00
|
|
|
// gets processor vendor name and model name from registry, works for intel
|
2004-12-17 00:00:59 +00:00
|
|
|
char vendorName[256], processorName[256], identifierName[256];
|
2002-12-09 23:52:17 +00:00
|
|
|
HKEY hKey;
|
|
|
|
LONG retval;
|
2003-04-02 19:59:13 +00:00
|
|
|
DWORD nameSize, procSpeed;
|
2004-12-17 00:00:59 +00:00
|
|
|
bool gotIdent = false, gotProcName = false, gotMHz = false, gotVendIdent = false;
|
2003-04-02 19:59:13 +00:00
|
|
|
|
2002-12-09 23:52:17 +00:00
|
|
|
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);
|
|
|
|
if(retval == ERROR_SUCCESS) {
|
2004-12-17 00:00:59 +00:00
|
|
|
// Win9x and WinNT store different information in these field.
|
|
|
|
// NT Examples:
|
|
|
|
// ProcessorNameString: Intel(R) Xeon(TM) CPU 3.06GHz
|
|
|
|
// Identifier: x86 Family 15 Model 2 Stepping 7
|
|
|
|
// VendorIdentifier: GenuineIntel
|
|
|
|
// ~MHz: 3056
|
|
|
|
// 9X Examples:
|
|
|
|
// ProcessorNameString: <Not Defined>
|
|
|
|
// Identifier: Pentium(r) Processor
|
|
|
|
// ~MHz: <Not Defined>
|
|
|
|
// VendorIdentifier: GenuineIntel
|
|
|
|
|
|
|
|
// Look in various places for processor information, add'l
|
2003-04-02 19:59:13 +00:00
|
|
|
// entries suggested by mark mcclure
|
2002-12-09 23:52:17 +00:00
|
|
|
nameSize = sizeof(vendorName);
|
|
|
|
retval = RegQueryValueEx(hKey, "VendorIdentifier", NULL, NULL, (LPBYTE)vendorName, &nameSize);
|
2003-04-02 19:59:13 +00:00
|
|
|
if (retval == ERROR_SUCCESS) gotVendIdent = true;
|
|
|
|
|
2004-12-17 00:00:59 +00:00
|
|
|
nameSize = sizeof(identifierName);
|
|
|
|
retval = RegQueryValueEx(hKey, "Identifier", NULL, NULL, (LPBYTE)identifierName, &nameSize);
|
|
|
|
if (retval == ERROR_SUCCESS) gotIdent = true;
|
|
|
|
|
|
|
|
nameSize = sizeof(processorName);
|
|
|
|
retval = RegQueryValueEx(hKey, "ProcessorNameString", NULL, NULL, (LPBYTE)processorName, &nameSize);
|
|
|
|
if (retval == ERROR_SUCCESS) gotProcName = true;
|
|
|
|
|
2003-04-02 19:59:13 +00:00
|
|
|
nameSize = sizeof(DWORD);
|
|
|
|
retval = RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&procSpeed, &nameSize);
|
|
|
|
if (retval == ERROR_SUCCESS) gotMHz = true;
|
2002-12-09 23:52:17 +00:00
|
|
|
}
|
2004-12-16 22:43:31 +00:00
|
|
|
|
2006-01-05 07:28:12 +00:00
|
|
|
if (gotVendIdent) strlcpy( p_vendor, vendorName, sizeof(p_vendor) );
|
|
|
|
else strlcpy( p_vendor, "Unknown", sizeof(p_vendor) );
|
2004-12-16 22:43:31 +00:00
|
|
|
|
|
|
|
if (gotProcName) {
|
2006-01-05 07:28:12 +00:00
|
|
|
strlcpy( p_model, processorName, sizeof(p_model) );
|
2004-12-17 00:00:59 +00:00
|
|
|
} else if (gotIdent && gotMHz) {
|
|
|
|
sprintf( p_model, "%s %dMHz", identifierName, procSpeed );
|
2004-12-16 22:43:31 +00:00
|
|
|
} else if (gotVendIdent && gotMHz) {
|
|
|
|
sprintf( p_model, "%s %dMHz", vendorName, procSpeed );
|
2004-12-17 00:00:59 +00:00
|
|
|
} else if (gotIdent) {
|
2006-01-05 07:28:12 +00:00
|
|
|
strlcpy( p_model, identifierName, sizeof(p_model) );
|
2004-12-16 22:43:31 +00:00
|
|
|
} else if (gotVendIdent) {
|
2006-01-05 07:28:12 +00:00
|
|
|
strlcpy( p_model, vendorName, sizeof(p_model) );
|
2004-12-16 22:43:31 +00:00
|
|
|
} else {
|
2006-01-05 07:28:12 +00:00
|
|
|
strlcpy( p_model, "Unknown", sizeof(p_model) );
|
2004-12-16 22:43:31 +00:00
|
|
|
}
|
2003-04-02 19:59:13 +00:00
|
|
|
|
2002-12-09 23:52:17 +00:00
|
|
|
RegCloseKey(hKey);
|
2005-01-20 18:50:49 +00:00
|
|
|
|
|
|
|
if (!strlen(host_cpid)) {
|
|
|
|
generate_host_cpid();
|
|
|
|
}
|
2002-06-06 18:50:12 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2002-10-06 01:12:54 +00:00
|
|
|
|
2004-03-31 19:53:31 +00:00
|
|
|
bool HOST_INFO::host_is_running_on_batteries() {
|
2002-12-09 23:52:17 +00:00
|
|
|
SYSTEM_POWER_STATUS pStatus;
|
|
|
|
ZeroMemory(&pStatus, sizeof(SYSTEM_POWER_STATUS));
|
2003-02-25 00:19:50 +00:00
|
|
|
if (!GetSystemPowerStatus(&pStatus)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2005-01-27 20:02:41 +00:00
|
|
|
// Sometimes the system reports the ACLineStatus as an
|
|
|
|
// undocumented value, so lets check to see if the
|
|
|
|
// battery is charging or missing and make that part
|
|
|
|
// of the decision.
|
|
|
|
bool bIsOnBatteryPower = (pStatus.ACLineStatus != 1);
|
2005-01-27 20:04:58 +00:00
|
|
|
bool bIsBatteryCharging = ((pStatus.BatteryFlag & 8) == 8);
|
|
|
|
bool bIsBatteryMissing = ((pStatus.BatteryFlag & 128) == 128);
|
2005-01-27 20:02:41 +00:00
|
|
|
|
|
|
|
return (bIsOnBatteryPower && !bIsBatteryCharging && !bIsBatteryMissing);
|
2002-12-05 22:50:21 +00:00
|
|
|
}
|
2004-06-29 19:54:50 +00:00
|
|
|
|
|
|
|
bool HOST_INFO::users_idle(bool check_all_logins, double idle_time_to_run) {
|
2004-12-18 20:52:14 +00:00
|
|
|
typedef DWORD (CALLBACK* GetFn)();
|
2005-01-07 07:32:23 +00:00
|
|
|
static GetFn fn = (GetFn)GetProcAddress(g_hIdleDetectionDll, "IdleTrackerGetIdleTickCount");
|
2004-12-18 20:52:14 +00:00
|
|
|
|
|
|
|
if (g_hIdleDetectionDll) {
|
2004-06-29 19:54:50 +00:00
|
|
|
if (fn) {
|
2005-01-21 06:16:29 +00:00
|
|
|
double seconds_idle = fn() / 1000;
|
|
|
|
double seconds_time_to_run = 60 * idle_time_to_run;
|
|
|
|
return seconds_idle > seconds_time_to_run;
|
2004-06-29 19:54:50 +00:00
|
|
|
}
|
|
|
|
}
|
2004-12-18 20:52:14 +00:00
|
|
|
|
2004-06-29 19:54:50 +00:00
|
|
|
return false;
|
|
|
|
}
|
2004-12-08 00:40:19 +00:00
|
|
|
|
2005-01-02 18:29:53 +00:00
|
|
|
const char *BOINC_RCSID_37fbd07edd = "$Id$";
|