windows-nt/Source/XPSP1/NT/base/ntsetup/syssetup/i386/migwin95.c

250 lines
5.1 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}