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.8 KiB
274 lines
8.8 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;
|
|
}
|