You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
5.0 KiB
249 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
enumtree.c
|
|
|
|
Abstract:
|
|
|
|
Performs a test of the file enumeration code.
|
|
|
|
Author:
|
|
|
|
Jim Schmidt (jimschm) 14-Jan-1998
|
|
|
|
Revision History:
|
|
|
|
<alias> <date> <comments>
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
|
|
VOID
|
|
DumpValue (
|
|
PCTSTR ValName,
|
|
PBYTE Val,
|
|
UINT ValSize,
|
|
DWORD Type
|
|
);
|
|
|
|
|
|
VOID
|
|
HelpAndExit (
|
|
VOID
|
|
)
|
|
{
|
|
printf ("Command line syntax:\n\n"
|
|
"regdump <root> [-b]\n\n"
|
|
"<root> Specifies root key to enumerate, such as HKCU\\Control Panel\n"
|
|
"-b Forces keys to be dumped as binary values\n"
|
|
);
|
|
|
|
exit(0);
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
MigUtil_Entry (
|
|
HINSTANCE hinstDLL,
|
|
DWORD fdwReason,
|
|
LPVOID lpvReserved
|
|
);
|
|
|
|
HANDLE g_hHeap;
|
|
HINSTANCE g_hInst;
|
|
|
|
|
|
INT
|
|
pCallMains (
|
|
DWORD Reason
|
|
)
|
|
{
|
|
if (!MigUtil_Entry (g_hInst, Reason, NULL)) {
|
|
_ftprintf (stderr, TEXT("MigUtil_Entry error!\n"));
|
|
return 254;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
INT
|
|
__cdecl
|
|
_tmain (
|
|
INT argc,
|
|
TCHAR *argv[]
|
|
)
|
|
{
|
|
PCTSTR Root = NULL;
|
|
INT i;
|
|
REGTREE_ENUM e;
|
|
REGVALUE_ENUM ev;
|
|
PBYTE Data;
|
|
BOOL AllBinary = FALSE;
|
|
|
|
for (i = 1 ; i < argc ; i++) {
|
|
if (argv[i][0] == TEXT('-') || argv[i][0] == TEXT('/')) {
|
|
switch (tolower (argv[i][1])) {
|
|
case TEXT('b'):
|
|
if (AllBinary) {
|
|
HelpAndExit();
|
|
}
|
|
|
|
AllBinary = TRUE;
|
|
break;
|
|
|
|
default:
|
|
HelpAndExit();
|
|
}
|
|
} else if (!Root) {
|
|
Root = argv[i];
|
|
} else {
|
|
HelpAndExit();
|
|
}
|
|
}
|
|
|
|
if (!Root) {
|
|
HelpAndExit();
|
|
}
|
|
|
|
//
|
|
// Init migutil
|
|
//
|
|
|
|
g_hHeap = GetProcessHeap();
|
|
g_hInst = GetModuleHandle (NULL);
|
|
|
|
pCallMains (DLL_PROCESS_ATTACH);
|
|
|
|
//
|
|
// Enumerate via reg wrappers
|
|
//
|
|
|
|
if (EnumFirstRegKeyInTree (&e, Root)) {
|
|
|
|
do {
|
|
|
|
_tprintf (TEXT("%s\n"), e.FullKeyName);
|
|
|
|
//
|
|
// Enumerate all values
|
|
//
|
|
|
|
if (EnumFirstRegValue (&ev, e.CurrentKey->KeyHandle)) {
|
|
do {
|
|
Data = GetRegValueData (ev.KeyHandle, ev.ValueName);
|
|
if (Data) {
|
|
DumpValue (
|
|
ev.ValueName,
|
|
Data,
|
|
ev.DataSize,
|
|
AllBinary ? REG_BINARY : ev.Type
|
|
);
|
|
|
|
MemFree (g_hHeap, 0, Data);
|
|
}
|
|
} while (EnumNextRegValue (&ev));
|
|
}
|
|
|
|
} while (EnumNextRegKeyInTree (&e));
|
|
|
|
} else {
|
|
_ftprintf (stderr, TEXT("%s not found\n"), Root);
|
|
}
|
|
|
|
//
|
|
// Terminate libs and exit
|
|
//
|
|
|
|
pCallMains (DLL_PROCESS_DETACH);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
VOID
|
|
DumpValue (
|
|
PCTSTR ValName,
|
|
PBYTE Val,
|
|
UINT ValSize,
|
|
DWORD Type
|
|
)
|
|
{
|
|
PBYTE Array;
|
|
UINT j, k, l;
|
|
PCTSTR p;
|
|
|
|
if (!ValName[0]) {
|
|
if (!ValSize) {
|
|
return;
|
|
}
|
|
ValName = TEXT("[Default Value]");
|
|
}
|
|
|
|
|
|
if (Type == REG_DWORD) {
|
|
_tprintf (TEXT(" REG_DWORD %s=%u (0%Xh)\n"), ValName, *((DWORD *) Val), *((DWORD *) Val));
|
|
} else if (Type == REG_SZ) {
|
|
_tprintf (TEXT(" REG_SZ %s=%s\n"), ValName, Val);
|
|
} else if (Type == REG_EXPAND_SZ) {
|
|
_tprintf (TEXT(" REG_EXPAND_SZ %s=%s\n"), ValName, Val);
|
|
} else if (Type == REG_MULTI_SZ) {
|
|
_tprintf (TEXT(" REG_MULTI_SZ %s:\n"), ValName);
|
|
p = (PCTSTR) Val;
|
|
while (*p) {
|
|
_tprintf (TEXT(" %s\n"), p);
|
|
p = GetEndOfString (p) + 1;
|
|
}
|
|
|
|
_tprintf (TEXT("\n"));
|
|
} else if (Type == REG_LINK) {
|
|
_tprintf (TEXT(" REG_LINK %s=%s\n"), ValName, Val);
|
|
} else {
|
|
if (Type == REG_NONE) {
|
|
_tprintf (TEXT(" REG_NONE %s"), ValName);
|
|
} else if (Type == REG_BINARY) {
|
|
_tprintf (TEXT(" REG_NONE %s"), ValName);
|
|
} else {
|
|
_tprintf (TEXT(" Unknown reg type %s"), ValName);
|
|
}
|
|
|
|
_tprintf (TEXT(" (%u byte%s)\n"), ValSize, ValSize == 1 ? "" : "s");
|
|
|
|
Array = Val;
|
|
|
|
for (j = 0 ; j < ValSize ; j += 16) {
|
|
_tprintf(TEXT(" %04X "), j);
|
|
|
|
l = min (j + 16, ValSize);
|
|
for (k = j ; k < l ; k++) {
|
|
_tprintf (TEXT("%02X "), Array[k]);
|
|
}
|
|
|
|
for ( ; k < j + 16 ; k++) {
|
|
_tprintf (TEXT(" "));
|
|
}
|
|
|
|
for (k = j ; k < l ; k++) {
|
|
_tprintf (TEXT("%c"), isprint(Array[k]) ? Array[k] : TEXT('.'));
|
|
}
|
|
|
|
_tprintf (TEXT("\n"));
|
|
}
|
|
|
|
_tprintf (TEXT("\n"));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|