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

383 lines
9.9 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
memdbren.c
Abstract:
Implements a stub tool that is designed to run with NT-side
upgrade code.
Author:
<full name> (<alias>) <date>
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
VOID
pFixUpMemDb2 (
VOID
);
BOOL
Init (
VOID
)
{
HINSTANCE hInstance;
DWORD dwReason;
PVOID lpReserved;
//
// Simulate DllMain
//
hInstance = GetModuleHandle (NULL);
dwReason = DLL_PROCESS_ATTACH;
lpReserved = NULL;
//
// Initialize DLL globals
//
if (!FirstInitRoutine (hInstance)) {
return FALSE;
}
//
// Initialize all libraries
//
if (!InitLibs (hInstance, dwReason, lpReserved)) {
return FALSE;
}
//
// Final initialization
//
if (!FinalInitRoutine ()) {
return FALSE;
}
return TRUE;
}
VOID
Terminate (
VOID
)
{
HINSTANCE hInstance;
DWORD dwReason;
PVOID lpReserved;
//
// Simulate DllMain
//
hInstance = GetModuleHandle (NULL);
dwReason = DLL_PROCESS_DETACH;
lpReserved = NULL;
//
// Call the cleanup routine that requires library APIs
//
FirstCleanupRoutine();
//
// Clean up all libraries
//
TerminateLibs (hInstance, dwReason, lpReserved);
//
// Do any remaining clean up
//
FinalCleanupRoutine();
}
INT
__cdecl
wmain (
INT argc,
WCHAR *argv[]
)
{
TREE_ENUM te;
DWORD Value, Flags;
DWORD Offset;
TCHAR Node[MEMDB_MAX];
FILEOP_ENUM e;
FILEOP_PROP_ENUM eOpProp;
PTSTR NewDest;
TCHAR node[MEMDB_MAX];
if (!Init()) {
wprintf (L"Unable to initialize!\n");
return 255;
}
CopyFile (TEXT("c:\\public\\ntsetup.bak"), TEXT("c:\\public\\ntsetup.dat"), FALSE);
MemDbLoad (TEXT("c:\\public\\ntsetup.dat"));
MemDbSave (TEXT("c:\\public\\ntsetup.dat"));
pFixUpMemDb2();
if (EnumFirstPathInOperation (&e, OPERATION_SHELL_FOLDER)) {
do {
wprintf (L"Operation %u\n", e.Sequencer);
if (EnumFirstFileOpProperty (&eOpProp, e.Sequencer, OPERATION_SHELL_FOLDER)) {
do {
wprintf (L" %s: %s\n", eOpProp.PropertyName, eOpProp.Property);
} while (EnumNextFileOpProperty (&eOpProp));
}
} while (EnumNextPathInOperation (&e));
}
MemDbSave (TEXT("c:\\public\\ntsetup.new"));
MemDbValidateDatabase();
Terminate();
return 0;
}
PCTSTR
GetProfilePathForUser2 (
PCTSTR User
)
{
static TCHAR Path[MAX_TCHAR_PATH];
wsprintf (Path, TEXT("c:\\Documents and Settings\\%s"), User);
return Path;
}
VOID
pFixUpDynamicPaths2 (
PCTSTR Category
)
{
MEMDB_ENUM e;
TCHAR Pattern[MEMDB_MAX];
PTSTR p;
GROWBUFFER Roots = GROWBUF_INIT;
MULTISZ_ENUM e2;
TCHAR NewRoot[MEMDB_MAX];
TCHAR AllProfilePath[MAX_TCHAR_PATH];
PCTSTR ProfilePath;
DWORD Size;
PTSTR UserName;
HKEY sfKey = NULL;
PCTSTR sfPath = NULL;
PTSTR NtLocation;
PCTSTR tempExpand;
BOOL regFolder;
//
// Collect all the roots that need to be renamed
//
StringCopy (Pattern, Category);
p = AppendWack (Pattern);
StringCopy (p, TEXT("*"));
if (MemDbEnumFirstValue (&e, Pattern, MEMDB_THIS_LEVEL_ONLY, MEMDB_ALL_BUT_PROXY)) {
do {
if ((_tcsnextc (e.szName) == TEXT('>')) ||
(_tcsnextc (e.szName) == TEXT('<'))
) {
StringCopy (p, e.szName);
MultiSzAppend (&Roots, Pattern);
}
} while (MemDbEnumNextValue (&e));
}
//
// Now change each root
//
if (EnumFirstMultiSz (&e2, (PCTSTR) Roots.Buf)) {
do {
//
// Compute NewRoot
//
StringCopy (NewRoot, e2.CurrentString);
p = _tcschr (NewRoot, TEXT('<'));
if (p) {
UserName = _tcschr (p, TEXT('>'));
MYASSERT (UserName);
StringCopyAB (Pattern, _tcsinc (p), UserName);
UserName = _tcsinc (UserName);
regFolder = TRUE;
if (StringIMatch (Pattern, TEXT("Profiles"))) {
regFolder = FALSE;
}
if (StringIMatch (Pattern, TEXT("Common Profiles"))) {
regFolder = FALSE;
}
if (StringIMatch (UserName, S_DOT_ALLUSERS)) {
Size = MAX_TCHAR_PATH;
if (regFolder) {
if (!GetAllUsersProfileDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WHOOPS, "Cannot get All Users profile path."));
continue;
}
sfKey = OpenRegKeyStr (S_USHELL_FOLDERS_KEY_SYSTEM);
} else {
if (!GetProfilesDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WHOOPS, "Cannot get All Users profile path."));
continue;
}
}
}
else if (StringIMatch (UserName, S_DEFAULT_USER)) {
Size = MAX_TCHAR_PATH;
if (regFolder) {
if (!GetDefaultUserProfileDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WHOOPS, "Cannot get Default User profile path."));
continue;
}
sfKey = OpenRegKey (HKEY_CURRENT_USER, S_USHELL_FOLDERS_KEY_USER);
} else {
if (!GetProfilesDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WHOOPS, "Cannot get All Users profile path."));
continue;
}
}
}
else {
ProfilePath = GetProfilePathForUser2 (UserName);
if (!ProfilePath) {
DEBUGMSG ((DBG_WHOOPS, "Cannot get profile path for user:%s", UserName));
continue;
}
StringCopy (AllProfilePath, ProfilePath);
if (regFolder) {
sfKey = OpenRegKey (HKEY_CURRENT_USER, S_USHELL_FOLDERS_KEY_USER);
}
}
if (regFolder) {
if (!sfKey) {
DEBUGMSG ((DBG_ERROR, "Could not open Shell folders key."));
continue;
}
sfPath = GetRegValueString (sfKey, Pattern);
CloseRegKey (sfKey);
if (!sfPath) {
DEBUGMSG ((DBG_WHOOPS, "Could not get Shell Folder path for: %s", Pattern));
continue;
}
tempExpand = StringSearchAndReplace (
sfPath,
S_USERPROFILE_ENV,
AllProfilePath
);
if (!tempExpand) {
tempExpand = DuplicatePathString (sfPath, 0);
}
} else {
tempExpand = DuplicatePathString (AllProfilePath, 0);
}
NtLocation = ExpandEnvironmentText (tempExpand);
StringCopy (p, NtLocation);
MemDbMoveTree (e2.CurrentString, NewRoot);
FreeText (NtLocation);
FreePathString (tempExpand);
if (regFolder) {
MemFree (g_hHeap, 0, sfPath);
}
}
else {
p = _tcschr (NewRoot, TEXT('>'));
MYASSERT (p);
if (StringIMatch (_tcsinc (p), S_DOT_ALLUSERS)) {
Size = MAX_TCHAR_PATH;
if (!GetAllUsersProfileDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WARNING, "Dynamic path for %s could not be resolved", e2.CurrentString));
}
else {
StringCopy (p, AllProfilePath);
MemDbMoveTree (e2.CurrentString, NewRoot);
}
} else if (StringIMatch (_tcsinc (p), S_DEFAULT_USER)) {
Size = MAX_TCHAR_PATH;
if (!GetDefaultUserProfileDirectory (AllProfilePath, &Size)) {
DEBUGMSG ((DBG_WARNING, "Dynamic path for %s could not be resolved", e2.CurrentString));
}
else {
StringCopy (p, AllProfilePath);
MemDbMoveTree (e2.CurrentString, NewRoot);
}
} else {
ProfilePath = GetProfilePathForUser2 (_tcsinc (p));
if (ProfilePath) {
StringCopy (p, ProfilePath);
MemDbMoveTree (e2.CurrentString, NewRoot);
}
else {
DEBUGMSG ((DBG_WARNING, "Dynamic path for %s could not be resolved", e2.CurrentString));
}
}
}
} while (EnumNextMultiSz (&e2));
}
FreeGrowBuffer (&Roots);
}
VOID
pFixUpMemDb2 (
VOID
)
{
pFixUpDynamicPaths2 (MEMDB_CATEGORY_PATHROOT);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_DATA);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_USERFILEMOVE_DEST);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_SHELLFOLDERS_DEST);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_SHELLFOLDERS_SRC);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_LINKEDIT_TARGET);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_LINKEDIT_WORKDIR);
pFixUpDynamicPaths2 (MEMDB_CATEGORY_LINKEDIT_ICONPATH);
}