Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

274 lines
8.5 KiB

//++
//
// Copyright (C) Microsoft Corporation, 1987 - 1999
//
// Module Name:
//
// machine.c
//
// Abstract:
//
// Test to ensure that a workstation has network (IP) connectivity to
// the outside.
//
// Author:
//
// 15-Dec-1997 (cliffv)
// Anilth - 4-20-1998
//
// Environment:
//
// User mode only.
// Contains NT-specific code.
//
// Revision History:
//
//--
//
// Common include files.
//
#include "precomp.h"
#include "strings.h"
HRESULT GetHotfixInfo(NETDIAG_RESULT *pResults, HKEY hkeyLocalMachine);
/*!--------------------------------------------------------------------------
GetMachineSpecificInfo
Get the OS info for the specified machine.
Author: KennT
---------------------------------------------------------------------------*/
HRESULT GetMachineSpecificInfo(IN NETDIAG_PARAMS *pParams,
IN OUT NETDIAG_RESULT *pResults)
{
HKEY hkey = HKEY_LOCAL_MACHINE;
HKEY hkeyBuildNumber = NULL;
HKEY hkeyNTType;
DWORD dwErr;
DWORD dwType, dwLen;
DWORD dwMaxLen = 0;
HRESULT hr = hrOK;
TCHAR szBuffer[256];
CheckErr( RegOpenKeyEx( hkey,
c_szRegKeyWindowsNTCurrentVersion,
0,
KEY_READ,
&hkeyBuildNumber) );
RegQueryInfoKey(hkeyBuildNumber,
NULL, // lpclass
NULL, // lpcbClass
NULL, // lpReserved
NULL, // lpcSubkeys
NULL, // lpcbMaxSubkeyLen
NULL, // lpcbMaxClassLen
NULL, // lpcValues
NULL, // lpcbMaxValueNameLen
&dwMaxLen, // lpcbMaxValueLen
NULL, // lpSecurity
NULL); // last write time
pResults->Global.pszCurrentVersion = Malloc((dwMaxLen+1) * sizeof(TCHAR));
if (pResults->Global.pszCurrentVersion == NULL)
CheckHr( E_OUTOFMEMORY );
pResults->Global.pszCurrentBuildNumber = Malloc((dwMaxLen+1) * sizeof(TCHAR));
if (pResults->Global.pszCurrentBuildNumber == NULL)
CheckHr( E_OUTOFMEMORY );
pResults->Global.pszCurrentType = Malloc((dwMaxLen+1) * sizeof(TCHAR));
if (pResults->Global.pszCurrentType == NULL)
CheckHr( E_OUTOFMEMORY );
dwLen = dwMaxLen;
CheckErr( RegQueryValueEx(hkeyBuildNumber,
c_szRegCurrentType,
(LPDWORD) NULL,
&dwType,
(LPBYTE) pResults->Global.pszCurrentType,
&dwLen) );
dwLen = dwMaxLen;
CheckErr( RegQueryValueEx(hkeyBuildNumber,
c_szRegCurrentVersion,
(LPDWORD) NULL,
&dwType,
(LPBYTE) pResults->Global.pszCurrentVersion,
&dwLen) );
dwLen = dwMaxLen;
dwErr = RegQueryValueEx( hkeyBuildNumber,
c_szRegCurrentBuildNumber,
(LPDWORD) NULL,
&dwType,
(LPBYTE) pResults->Global.pszCurrentBuildNumber,
&dwLen);
if (dwErr != ERROR_SUCCESS) {
dwLen = dwMaxLen;
dwErr = RegQueryValueEx( hkeyBuildNumber,
c_szRegCurrentBuild,
(LPDWORD) NULL,
&dwType,
(LPBYTE) pResults->Global.pszCurrentBuildNumber,
& dwLen);
}
GetEnvironmentVariable(_T("PROCESSOR_IDENTIFIER"),
szBuffer,
DimensionOf(szBuffer));
pResults->Global.pszProcessorInfo = StrDup(szBuffer);
CheckErr( RegOpenKeyEx( hkey,
c_szRegKeyControlProductOptions,
0,
KEY_READ,
&hkeyNTType) );
dwLen = DimensionOf(szBuffer);
dwErr = RegQueryValueEx( hkeyNTType,
_T("ProductType"),
(LPDWORD) NULL,
&dwType,
(LPBYTE) szBuffer,
& dwLen);
if (dwErr == ERROR_SUCCESS)
{
if (StriCmp(szBuffer, _T("WinNT")) == 0)
{
pResults->Global.pszServerType = LoadAndAllocString(IDS_GLOBAL_PROFESSIONAL);
}
else
{
pResults->Global.pszServerType = LoadAndAllocString(IDS_GLOBAL_SERVER);
}
}
// get the hotfix information
GetHotfixInfo(pResults, hkey);
hr = HResultFromWin32(dwErr);
Error:
if ( hkeyNTType != NULL )
(VOID) RegCloseKey(hkeyNTType);
if ( hkeyBuildNumber != NULL )
(VOID) RegCloseKey(hkeyBuildNumber);
if (FAILED(hr))
{
//IDS_GLOBAL_NO_MACHINE_INFO "[FATAL] Failed to get system information of this machine.\n"
PrintMessage(pParams, IDS_GLOBAL_NO_MACHINE_INFO);
}
return hr;
}
/*!--------------------------------------------------------------------------
GetHotfixInfo
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT GetHotfixInfo(NETDIAG_RESULT *pResults, HKEY hkeyLocalMachine)
{
HRESULT hr = hrOK;
HKEY hkeyHotFix = NULL;
HKEY hkeyMainHotFix = NULL;
TCHAR szBuffer[MAX_PATH];
DWORD cchBuffer = MAX_PATH;
DWORD i = 0;
DWORD cSubKeys = 0;
DWORD dwType, dwLen, dwInstalled;
// Open the hotfix registry key
CheckErr( RegOpenKeyEx( hkeyLocalMachine,
c_szRegKeyHotFix,
0,
KEY_READ,
&hkeyMainHotFix) );
// Get the list of summary information
RegQueryInfoKey(hkeyMainHotFix,
NULL, // lpclass
NULL, // lpcbClass
NULL, // lpReserved
&cSubKeys, // lpcSubkeys
NULL, // lpcbMaxSubkeyLen
NULL, // lpcbMaxClassLen
NULL, // lpcValues
NULL, // lpcbMaxValueNameLen
NULL, // lpcbMaxValueLen
NULL, // lpSecurity
NULL); // last write time
assert(pResults->Global.pHotFixes == NULL);
pResults->Global.pHotFixes = Malloc(sizeof(HotFixInfo)*cSubKeys);
if (pResults->Global.pHotFixes == NULL)
CheckHr(E_OUTOFMEMORY);
ZeroMemory(pResults->Global.pHotFixes, sizeof(HotFixInfo)*cSubKeys);
// Enumerate the keys under this to get the list of hotfixes
while ( RegEnumKeyEx( hkeyMainHotFix,
i,
szBuffer,
&cchBuffer,
NULL,
NULL,
NULL,
NULL) == ERROR_SUCCESS)
{
// Now add an entry for each key
pResults->Global.pHotFixes[i].fInstalled = FALSE;
pResults->Global.pHotFixes[i].pszName = StrDup(szBuffer);
// Open up the key and get the installed value
assert(hkeyHotFix == NULL);
CheckErr( RegOpenKeyEx( hkeyMainHotFix,
szBuffer,
0,
KEY_READ,
&hkeyHotFix) );
// Now get the value
dwType = REG_DWORD;
dwInstalled = FALSE;
dwLen = sizeof(DWORD);
if (RegQueryValueEx(hkeyHotFix,
c_szRegInstalled,
(LPDWORD) NULL,
&dwType,
(LPBYTE) &dwInstalled,
&dwLen) == ERROR_SUCCESS)
{
if (dwType == REG_DWORD)
pResults->Global.pHotFixes[i].fInstalled = dwInstalled;
}
if (hkeyHotFix)
RegCloseKey(hkeyHotFix);
hkeyHotFix = NULL;
i ++;
pResults->Global.cHotFixes++;
cchBuffer = MAX_PATH;
}
Error:
if (hkeyHotFix)
RegCloseKey(hkeyHotFix);
if (hkeyMainHotFix)
RegCloseKey(hkeyMainHotFix);
return hr;
}