|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: GetReg.cxx
//
// Contents: Routines to get the registry, and dump the contents into
// a text file.
//
//
// Objects:
//
// Coupling:
//
// Notes:
//
// History: 9/21/00 SHeffner Created
//
// 03-May-2001 WeiyouC Rewritten
//
//----------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Common Includes
//
//----------------------------------------------------------------------------
#include "SrHeader.hxx"
//+---------------------------------------------------------------------------
//
// Function Prototypes
//
//----------------------------------------------------------------------------
BOOL GetSRRegistry(LPTSTR ptszLogFile, LPTSTR ptszRegPath, BOOL fRecurse);
//+---------------------------------------------------------------------------
//
// Global variables
//
//----------------------------------------------------------------------------
//
// A list of readable string names for the registery keys
//
LPTSTR tszRegStrings[] = {TEXT("REG_NONE"), TEXT("REG_SZ"), TEXT("REG_EXPAND_SZ"), TEXT("REG_BINARY"), TEXT("REG_DWORD or REG_DWORD_LITTLE_ENDIAN"), TEXT("REG_DWORD_BIG_ENDIAN"), TEXT("REG_LINK"), TEXT("REG_MULTI_SZ"), TEXT("REG_RESOURCE_LIST"), TEXT("REG_FULL_RESOURCE_DESCRIPTOR"), TEXT("REG_RESOURCE_REQUIREMENTS_LIST"), TEXT("REG_QWORD or REG_QWORD_LITTLE_ENDIAN") };
//
// List of the Registry keys that we are grabbing.
// The first param is the Path from HKLM, the Second Param
// is either FALSE for not recursing, or TRUE if you want to
// recurse all of the sub keys.
//
struct _SR_REG_STRUCTURE_ { LPTSTR ptszRegPath; BOOL fRecurse; } SRRegKeys [] = { {TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion"), FALSE}, {TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore"), TRUE}, {TEXT("System\\CurrentControlSet\\Services\\SR"), TRUE}, {TEXT("System\\CurrentControlSet\\Services\\SRService"), TRUE}, {TEXT("Software\\Policies\\Microsoft\\Windows NT\\SystemRestore"), TRUE}, {TEXT(""), FALSE} };
//+---------------------------------------------------------------------------
//
// Function: GetSRRegistry
//
// Synopsis: Routine will recursivly call this routine to enumerate the keys
// and values for the registry
//
// Arguments: [ptszLogFile] -- log file name
// [ptszRegPath] -- registery path
// [fRecurse] -- flag indicates if I should recurse into sub paths
//
// Returns: TRUE if successful
//
// History: 9/21/00 SHeffner Created
//
// 03-May-2001 WeiyouC Rewitten
//
//----------------------------------------------------------------------------
BOOL GetSRRegistry(LPTSTR ptszLogFile, LPTSTR ptszRegPath, BOOL fRecurse) { DWORD dwIndex = 0; DWORD dwValueSize = MAX_PATH +1; DWORD dwDataSize = MAX_PATH +1; DWORD dwType = 0; long lResult = 0;; FILE* fpLog = NULL; LPTSTR ptszString = NULL; HKEY hKey; TCHAR tszKey[MAX_PATH +1]; TCHAR tszValue[MAX_PATH +1]; TCHAR tszNewRegPath[MAX_PATH +1]; //
// Open the Log file for append
//
fpLog = _tfopen(ptszLogFile, TEXT("a")); if (NULL == fpLog) { goto ErrReturn; }
//
// Log current path, and then open the registry hive,
// and start enumerating the Values.
//
fprintf(fpLog, "\n[%S]\n", ptszRegPath); lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ptszRegPath, 0, KEY_READ, &hKey); if (ERROR_SUCCESS != lResult) { goto ErrReturn; }
lResult = RegEnumValue(hKey, dwIndex, tszKey, &dwDataSize, 0, &dwType, (unsigned char *) tszValue, &dwValueSize); while (ERROR_SUCCESS == lResult ) { ptszString = tszRegStrings[dwType];
//
// If it is type REG_DWORD or REG_DWORD_LITTLE_ENDIAN, then we
// do the special type casting. If not then we just pass it through
// as a string
//
if ((REG_DWORD == dwType) || (REG_DWORD_LITTLE_ENDIAN == dwType)) { fprintf(fpLog, "\"%S\"=%S:%lu\n", tszKey, ptszString, (DWORD &) tszValue); } else { fprintf(fpLog, "\"%S\"=%S:%S\n", tszKey, ptszString, tszValue); }
//
// Update local variables for next iteration.
//
dwDataSize = dwValueSize = MAX_PATH +1; dwIndex ++; lResult = RegEnumValue(hKey, dwIndex, tszKey, &dwDataSize, 0, &dwType, (unsigned char *) tszValue, &dwValueSize); }
//
// Close out the file, for next recursion loop.
//
fclose(fpLog);
//
// Now lets find all of the Key's under this key,
// and start a another enumeration for each one found
//
if (fRecurse) { dwIndex = 0; dwDataSize = MAX_PATH +1; lResult = RegEnumKey(hKey, dwIndex, tszKey, dwDataSize); while (ERROR_SUCCESS == lResult) { //
// Build the path, and then call this function again.
//
_tcscpy(tszNewRegPath, ptszRegPath); _tcscat(tszNewRegPath, TEXT("\\")); _tcscat(tszNewRegPath, tszKey); GetSRRegistry(ptszLogFile, tszNewRegPath, fRecurse);
//
// Now do next run through.
//
dwDataSize = MAX_PATH + 1; dwIndex ++; lResult = RegEnumKey(hKey, dwIndex, tszKey, dwDataSize); } }
ErrReturn: if (NULL != fpLog) { fclose(fpLog); }
RegCloseKey(hKey); return TRUE; }
//+---------------------------------------------------------------------------
//
// Function: GetSRRegInfo
//
// Synopsis: Get SR registery settings and dump it to the log file
//
// Arguments: [ptszLogFile] -- log file name
//
// Returns: HRESULT
//
// History: 9/21/00 SHeffner Created
//
// 03-May-2001 WeiyouC Rewitten
//
//----------------------------------------------------------------------------
HRESULT GetSRRegInfo(LPTSTR ptszLogFile) { HRESULT hr = S_OK; int i = 0; BOOL fOK = FALSE;
DH_VDATEPTRIN(ptszLogFile, TCHAR); while (NULL != *(SRRegKeys[i].ptszRegPath)) { fOK = GetSRRegistry(ptszLogFile, SRRegKeys[i].ptszRegPath, SRRegKeys[i].fRecurse); DH_ABORTIF(!fOK, E_FAIL, TEXT("GetSRRegistry")); i++; }
ErrReturn: return hr; }
|