172 lines
4.9 KiB
C++
172 lines
4.9 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
}
|