|
|
/*++
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; }
|