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

296 lines
6.2 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"
"regdmp95 <win95path> <root> [-u:userpath] [-b]\n\n"
"<win95path> Specifies path to Win95 %%windir%%\n"
"<root> Specifies root key to enumerate\n"
"-u Specifies optional path to user.dat (excluding file name)\n"
"-b Force values to be displayed as binary\n"
);
exit(0);
}
BOOL
WINAPI
Win95Reg_Entry (
IN HINSTANCE hinstDLL,
IN DWORD dwReason,
IN LPVOID lpv
);
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;
}
if (!Win95Reg_Entry (g_hInst, Reason, NULL)) {
_ftprintf (stderr, TEXT("Win95Reg_Entry error!\n"));
return 254;
}
return 0;
}
INT
__cdecl
_tmain (
INT argc,
TCHAR *argv[]
)
{
PCTSTR Path = NULL, Root = NULL;
PCTSTR UserPath = NULL;
INT i;
BOOL EnumFlag = TRUE;
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'):
AllBinary = TRUE;
break;
case TEXT('u'):
if (UserPath) {
HelpAndExit();
}
if (argv[i][2] == TEXT(':')) {
UserPath = &argv[i][3];
} else {
i++;
if (i == argc) {
HelpAndExit();
}
UserPath = argv[i];
}
break;
default:
HelpAndExit();
}
} else if (!Path) {
Path = argv[i];
} else if (!Root) {
Root = argv[i];
} else {
HelpAndExit();
}
}
if (!Root) {
HelpAndExit();
}
//
// Init migutil and win95reg
//
g_hHeap = GetProcessHeap();
g_hInst = GetModuleHandle (NULL);
pCallMains (DLL_PROCESS_ATTACH);
//
// Map in the Win95 registry
//
if (Win95RegInit (Path, TRUE) != ERROR_SUCCESS) {
_ftprintf (stderr, TEXT("Can't map in Win98 registry at %s\n"), Path);
EnumFlag = FALSE;
} else {
if (UserPath) {
if (Win95RegSetCurrentUser (NULL, UserPath, NULL) != ERROR_SUCCESS) {
_ftprintf (stderr, TEXT("Can't map in Win95 user hive path %s\n"), UserPath);
EnumFlag = FALSE;
}
}
}
if (EnumFlag) {
if (EnumFirstRegKeyInTree95 (&e, Root)) {
do {
_tprintf (TEXT("%s\n"), e.FullKeyName);
//
// Enumerate all values
//
if (EnumFirstRegValue95 (&ev, e.CurrentKey->KeyHandle)) {
do {
Data = GetRegValueData95 (ev.KeyHandle, ev.ValueName);
if (Data) {
DumpValue (
ev.ValueName,
Data,
ev.DataSize,
AllBinary ? REG_BINARY : ev.Type
);
MemFree (g_hHeap, 0, Data);
}
} while (EnumNextRegValue95 (&ev));
}
} while (EnumNextRegKeyInTree95 (&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"));
}
}