/*++ 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: --*/ #include "pch.h" VOID DumpValue ( PCTSTR ValName, PBYTE Val, UINT ValSize, DWORD Type ); VOID HelpAndExit ( VOID ) { printf ("Command line syntax:\n\n" "regdmp95 [-u:userpath] [-b]\n\n" " Specifies path to Win95 %%windir%%\n" " 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")); } }