|
|
//++
//
// 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; }
|