250 lines
5.1 KiB
C
250 lines
5.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
migwin95.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains the syssetup hooks for win9x->Nt5.0 migration. Most functions
|
||
|
call out to the w95upgnt.dll where the real work is done.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Jaime Sasson 30-Aug-1995
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
29-Ian-1998 calinn Added RemoveFiles_x86
|
||
|
24-Jul-1997 marcw Minor bug cleanup.
|
||
|
03-Oct-1996 jimschm Changed over to use migration DLLs
|
||
|
22-Jan-1997 jimschm Added Win95MigrationFileRemoval
|
||
|
28-Feb-1997 jimschm Added SourceDir to MIGRATE fn
|
||
|
3-Apr-1997 jimschm Added PreWin9xMigration
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "setupp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#define S_UNDO_INF L"SF_UNDO.INF"
|
||
|
#define S_UNDO_PROFILESPATH L"PROFILESPATH"
|
||
|
#define S_UNDO_MOVEDFILES L"MOVEDFILES"
|
||
|
|
||
|
typedef BOOL (WINAPI *MIGRATE) (HWND WizardParentWnd, LPCWSTR UnattendFile, LPCWSTR SourceDir);
|
||
|
typedef BOOL (WINAPI *FILEREMOVAL) (void);
|
||
|
|
||
|
static HANDLE g_Win95UpgNTLib;
|
||
|
|
||
|
BOOL
|
||
|
SpCreateSpoolerKey (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HKEY SpoolerKey;
|
||
|
LONG rc;
|
||
|
DWORD DontCare;
|
||
|
static DWORD NinetyFive = 95;
|
||
|
|
||
|
//
|
||
|
// For spooler: write an upgrade flag that will automatically be removed
|
||
|
//
|
||
|
|
||
|
rc = RegCreateKeyEx (
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
WINNT_WIN95UPG_SPOOLER,
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
KEY_WRITE,
|
||
|
NULL,
|
||
|
&SpoolerKey,
|
||
|
&DontCare
|
||
|
);
|
||
|
|
||
|
if (rc != ERROR_SUCCESS) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
rc = RegSetValueEx (
|
||
|
SpoolerKey,
|
||
|
WINNT_WIN95UPG_UPGRADE_VAL,
|
||
|
0,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE) &NinetyFive,
|
||
|
sizeof (NinetyFive)
|
||
|
);
|
||
|
|
||
|
RegCloseKey (SpoolerKey);
|
||
|
|
||
|
return rc == ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
PreWin9xMigration(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
BOOL b;
|
||
|
|
||
|
BEGIN_SECTION(TEXT("PreWin9xMigration"));
|
||
|
|
||
|
b = SpCreateSpoolerKey();
|
||
|
if(!b){
|
||
|
SetupDebugPrint(TEXT("SpCreateSpoolerKey failed"));
|
||
|
}
|
||
|
|
||
|
END_SECTION(TEXT("PreWin9xMigration"));
|
||
|
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
MigrateWin95Settings(
|
||
|
IN HWND hwndWizardParent,
|
||
|
IN LPCWSTR UnattendFile
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Loads w95upgnt.dll and calls W95UpgNt_Migrate. This function
|
||
|
transfers all Win9x settings to the new NT installation, and
|
||
|
is completely restartable.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
hwndWizardParent Handle to the wizard window, used for (rare) UI
|
||
|
UnattendFile The full Win32 path to the unattend file, to be
|
||
|
opened via Setup APIs
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Returns TRUE if the module was successful, or FALSE otherwise.
|
||
|
GetLastError() holds a Win32 error code if not successful.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
MIGRATE Migrate;
|
||
|
BOOL b = FALSE;
|
||
|
WCHAR buffer[2048];
|
||
|
|
||
|
g_Win95UpgNTLib = NULL;
|
||
|
|
||
|
//
|
||
|
// See if there is a replacement path for the w95upgnt.dll.
|
||
|
//
|
||
|
GetPrivateProfileStringW (
|
||
|
WINNT_WIN95UPG_95_DIR_W,
|
||
|
WINNT_WIN95UPG_NTKEY_W,
|
||
|
L"",
|
||
|
buffer,
|
||
|
sizeof(buffer)/sizeof(WCHAR),
|
||
|
UnattendFile
|
||
|
);
|
||
|
|
||
|
if (*buffer) {
|
||
|
|
||
|
//
|
||
|
// We have a replacement dll to load.
|
||
|
//
|
||
|
g_Win95UpgNTLib = LoadLibrary (buffer);
|
||
|
}
|
||
|
|
||
|
if (!g_Win95UpgNTLib) {
|
||
|
|
||
|
//
|
||
|
// Either there was not a replacement, or loading that replacement failed.
|
||
|
//
|
||
|
|
||
|
g_Win95UpgNTLib = LoadLibrary (L"w95upgnt.dll");
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
if (!g_Win95UpgNTLib) {
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
Migrate = (MIGRATE) GetProcAddress (g_Win95UpgNTLib, "W95UpgNt_Migrate");
|
||
|
if (Migrate) {
|
||
|
b = Migrate (hwndWizardParent, UnattendFile, SourcePath);
|
||
|
}
|
||
|
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
Win95MigrationFileRemoval(
|
||
|
void
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Loads w95upgnt.dll and calls W95UpgNt_FileRemoval. This function
|
||
|
deletes all Win9x-specific files and removes temporary files including
|
||
|
all migration DLLs. It is NOT restartable.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
none
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Returns TRUE if the module was successful, or FALSE otherwise.
|
||
|
GetLastError() holds a Win32 error code if not successful.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
FILEREMOVAL FileRemoval;
|
||
|
BOOL b = FALSE;
|
||
|
|
||
|
FileRemoval = (FILEREMOVAL) GetProcAddress (g_Win95UpgNTLib, "W95UpgNt_FileRemoval");
|
||
|
if (FileRemoval)
|
||
|
b = FileRemoval();
|
||
|
|
||
|
FreeLibrary (g_Win95UpgNTLib);
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
#define SIF_REMOVEFILESX86 L"RemoveFiles.x86"
|
||
|
|
||
|
BOOL
|
||
|
RemoveFiles_X86 (
|
||
|
IN HINF InfHandle
|
||
|
)
|
||
|
{
|
||
|
WCHAR fullPath[MAX_PATH],fileName[MAX_PATH];
|
||
|
INFCONTEXT lineContext;
|
||
|
|
||
|
if (InfHandle == INVALID_HANDLE_VALUE) {
|
||
|
return TRUE;
|
||
|
}
|
||
|
if (SetupFindFirstLine (
|
||
|
InfHandle,
|
||
|
SIF_REMOVEFILESX86,
|
||
|
NULL,
|
||
|
&lineContext
|
||
|
)) {
|
||
|
do {
|
||
|
if ((SetupGetStringField (&lineContext, 1, fileName, MAX_PATH, NULL)) &&
|
||
|
(GetWindowsDirectory (fullPath, MAX_PATH)) &&
|
||
|
(pSetupConcatenatePaths (fullPath, fileName, MAX_PATH, NULL)) &&
|
||
|
(SetFileAttributes (fullPath, FILE_ATTRIBUTE_NORMAL))
|
||
|
) {
|
||
|
DeleteFile (fullPath);
|
||
|
}
|
||
|
}
|
||
|
while (SetupFindNextLine (&lineContext, &lineContext));
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|