296 lines
6.2 KiB
C
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"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|