windows-nt/Source/XPSP1/NT/admin/pchealth/sr/nttest/srdiag/getreg.cpp

172 lines
4.9 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: GetReg.cpp
//
// Contents: Routines to get the registry, and dump the contents into
// a text file.
//
//
// Objects:
//
// Coupling:
//
// Notes:
//
// History: 9/21/00 SHeffner Created
//
//----------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Common Includes
//
//----------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
//+---------------------------------------------------------------------------
//
// Function Proto types
//
//----------------------------------------------------------------------------
void RegType(DWORD dwType, WCHAR *szString);
//+---------------------------------------------------------------------------
//
// Function: GetSRRegistry
//
// Synopsis: Routine will recursivly call this routine to enumerate the keys and values for the registry
//
// Arguments: [szFileName] -- Simple ANSI string to log file
// [szPath] -- Simple ANSI string to the path to start at the registry
// [bRecurse] -- Bool to indicate if I should recurse into sub paths
//
// Returns: true if successful
//
// History: 9/21/00 SHeffner Created
//
//
//----------------------------------------------------------------------------
bool GetSRRegistry(char *szFileName, WCHAR *szPath, bool bRecurse)
{
WCHAR szKeyString[_MAX_PATH +1], szValueString[_MAX_PATH +1], szString[_MAX_PATH +1];
DWORD dwIndex=0, dwValueSize, dwDataSize, dwType;
long lResult;
HKEY mHkey;
FILE *fStream;
// Open the Log file for append
fStream = fopen(szFileName, "a");
//Initialize local variables before processing path
dwIndex =0;
dwDataSize = dwValueSize = _MAX_PATH +1;
//log current path, and then open the registry hive, and start enumerating the Values.
fprintf(fStream, "\n[%S]\n", szPath);
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szPath, 0, KEY_READ, &mHkey);
lResult = RegEnumValue(mHkey, dwIndex, szKeyString, &dwDataSize, 0, &dwType, (unsigned char *)szValueString, &dwValueSize);
while( ERROR_SUCCESS == lResult ) {
RegType(dwType, szString);
//BUGBUG.. If it is type 4, then we do the special type casting,
// if not then we just pass it through as a string
if (4 == dwType)
fprintf(fStream, "\"%S\"=%S:%lu\n", szKeyString, szString, (DWORD &) szValueString);
else
fprintf(fStream, "\"%S\"=%S:%S\n", szKeyString, szString, (unsigned char *) szValueString);
//Update local variables for next iteration.
dwDataSize = dwValueSize = _MAX_PATH +1;
dwIndex ++;
lResult = RegEnumValue(mHkey, dwIndex, szKeyString, &dwDataSize, 0, &dwType, (unsigned char *)szValueString, &dwValueSize);
}
//Close out the file, for next recursion loop.
fclose(fStream);
//Now lets find all of the Key's under this key, and kick off a another enumeration for each one found
if ( true == bRecurse ) {
dwIndex = 0;
dwDataSize = _MAX_PATH +1;
lResult = RegEnumKey(mHkey, dwIndex, szKeyString, dwDataSize);
while( ERROR_SUCCESS == lResult) {
//Build the path, and then call this function again.
wcscpy(szString, szPath);
wcscat(szString, TEXT("\\"));
wcscat(szString, szKeyString);
GetSRRegistry(szFileName, szString, bRecurse);
//Now do next run through.
dwDataSize = _MAX_PATH +1;
dwIndex ++;
lResult = RegEnumKey(mHkey, dwIndex, szKeyString, dwDataSize);
}
}
//Close key, and return back.
RegCloseKey(mHkey);
return true;
}
//+---------------------------------------------------------------------------
//
// Function: RegType
//
// Synopsis: Routine returns in the string pass in, the description of registry key it is
//
// Arguments: [dwType] -- DWord Type
// [szString] -- Simple ANSI string receive a string description
//
// Returns: void
//
// History: 9/21/00 SHeffner Created
//
//----------------------------------------------------------------------------
void RegType(DWORD dwType, WCHAR *szString)
{
switch(dwType) {
case REG_BINARY:
wcscpy(szString, TEXT("REG_BINARY"));
break;
case REG_DWORD:
wcscpy(szString, TEXT("REG_DWORD"));
break;
case REG_DWORD_BIG_ENDIAN:
wcscpy(szString, TEXT("REG_DWORD_BIG_ENDIAN"));
break;
case REG_EXPAND_SZ:
wcscpy(szString, TEXT("REG_EXPAND_SZ"));
break;
case REG_LINK:
wcscpy(szString, TEXT("REG_LINK"));
break;
case REG_MULTI_SZ:
wcscpy(szString, TEXT("REG_MULTI_SZ"));
break;
case REG_NONE:
wcscpy(szString, TEXT("REG_NONE"));
break;
case REG_QWORD:
wcscpy(szString, TEXT("REG_QWORD"));
break;
case REG_RESOURCE_LIST:
wcscpy(szString, TEXT("REG_RESOURCE_LIST"));
break;
case REG_SZ:
wcscpy(szString, TEXT("REG_SZ"));
break;
default:
wcscpy(szString, TEXT("UnKnown"));
break;
}
}