windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/tools/regdump/regdump.c
2020-09-26 16:20:57 +08:00

250 lines
4.8 KiB
C

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