windows-nt/Source/XPSP1/NT/admin/pchealth/sr/nttest/srdiag2/getreg.cxx
2020-09-26 16:20:57 +08:00

286 lines
7.3 KiB
C++

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