251 lines
6.5 KiB
C++
251 lines
6.5 KiB
C++
|
//--------------------------------------------------------------
|
|||
|
//
|
|||
|
// File: loadstate
|
|||
|
//
|
|||
|
// Contents: Load a machine state.
|
|||
|
//
|
|||
|
//---------------------------------------------------------------
|
|||
|
|
|||
|
#include "loadhead.cxx"
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
#include <common.hxx>
|
|||
|
#include <objerror.h>
|
|||
|
#include <loadstate.hxx>
|
|||
|
#include <bothchar.hxx>
|
|||
|
|
|||
|
//---------------------------------------------------------------
|
|||
|
// Constants.
|
|||
|
|
|||
|
const char MIGRATEINF[] = "\\migration.inf";
|
|||
|
|
|||
|
//---------------------------------------------------------------
|
|||
|
// Types.
|
|||
|
|
|||
|
//---------------------------------------------------------------
|
|||
|
// Macros
|
|||
|
|
|||
|
//---------------------------------------------------------------
|
|||
|
// Globals.
|
|||
|
|
|||
|
DWORD SourceVersion = 0;
|
|||
|
TCHAR szLogFile[MAX_PATH+1];
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//---------------------------------------------------------------
|
|||
|
DWORD GetSourceVersion()
|
|||
|
{
|
|||
|
DWORD dwResult = ERROR_SUCCESS;
|
|||
|
BOOL fSuccess;
|
|||
|
INFCONTEXT ic;
|
|||
|
DWORD dwRealLen;
|
|||
|
TCHAR *ptsVar = NULL;
|
|||
|
|
|||
|
// Find the section.
|
|||
|
fSuccess = SetupFindFirstLine( InputInf, SOURCE_SECTION, NULL, &ic );
|
|||
|
LOG_ASSERT_GLE( fSuccess, dwResult );
|
|||
|
|
|||
|
// Find the version.
|
|||
|
do
|
|||
|
{
|
|||
|
// Get the correct length
|
|||
|
fSuccess = SetupGetStringField( &ic, 0, NULL, 0, &dwRealLen );
|
|||
|
LOG_ASSERT_GLE( fSuccess, dwResult );
|
|||
|
|
|||
|
// Presumably we have the correct length now...
|
|||
|
ptsVar = (TCHAR *) malloc(dwRealLen * sizeof(TCHAR));
|
|||
|
LOG_ASSERT_EXPR( ptsVar != NULL, IDS_NOT_ENOUGH_MEMORY, dwResult,
|
|||
|
ERROR_NOT_ENOUGH_MEMORY );
|
|||
|
|
|||
|
fSuccess = SetupGetStringField( &ic, 0, ptsVar, dwRealLen, NULL);
|
|||
|
LOG_ASSERT_EXPR(fSuccess, IDS_GETSTRINGFIELD_ERROR,
|
|||
|
dwResult, SPAPI_E_SECTION_NAME_TOO_LONG);
|
|||
|
|
|||
|
// Save the value if it is the one we are looking for.
|
|||
|
if (_tcsicmp( ptsVar, VERSION ) == 0)
|
|||
|
{
|
|||
|
fSuccess = SetupGetIntField( &ic, 1, (int *) &SourceVersion );
|
|||
|
LOG_ASSERT_EXPR( fSuccess, IDS_INF_ERROR, dwResult, SPAPI_E_GENERAL_SYNTAX );
|
|||
|
break;
|
|||
|
}
|
|||
|
free( ptsVar );
|
|||
|
ptsVar = NULL;
|
|||
|
|
|||
|
// Advance to the next line.
|
|||
|
fSuccess = SetupFindNextLine( &ic, &ic );
|
|||
|
|
|||
|
} while( fSuccess);
|
|||
|
|
|||
|
// If the version wasn't found, return an error.
|
|||
|
LOG_ASSERT_EXPR( SourceVersion != 0, IDS_INF_ERROR, dwResult, SPAPI_E_GENERAL_SYNTAX );
|
|||
|
|
|||
|
cleanup:
|
|||
|
if (ptsVar != NULL)
|
|||
|
free( ptsVar );
|
|||
|
return dwResult;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***************************************************************************
|
|||
|
|
|||
|
main
|
|||
|
|
|||
|
Load machine state from migration.inf.
|
|||
|
|
|||
|
***************************************************************************/
|
|||
|
|
|||
|
int _cdecl main(int argc, char *argv[])
|
|||
|
{
|
|||
|
DWORD dwResult;
|
|||
|
TCHAR *ptsHiveName = NULL;
|
|||
|
DWORD dwLen;
|
|||
|
char *pszMigrate;
|
|||
|
DWORD dwReturnToDos = ERROR_SUCCESS;
|
|||
|
|
|||
|
dwResult = CoInitialize(NULL);
|
|||
|
if (FAILED(dwResult))
|
|||
|
goto cleanup;
|
|||
|
|
|||
|
dwResult = OpenFiles();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Parse the parameters.
|
|||
|
dwResult = ParseParams( argc, argv, FALSE, szLogFile );
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Determine the operating system.
|
|||
|
if (FALSE == TestMode)
|
|||
|
{
|
|||
|
LOG_ASSERT_EXPR( (GetVersion() & 0xffff) == 5, IDS_OS5, dwResult,
|
|||
|
ERROR_BAD_ENVIRONMENT );
|
|||
|
}
|
|||
|
else if ((GetVersion() & 0xffff) != 5)
|
|||
|
Win32PrintfResource( LogFile, IDS_OS5_WARNING );
|
|||
|
|
|||
|
// Append migration.inf.
|
|||
|
dwLen = strlen(MigrationPath) + sizeof(MIGRATEINF) + 2;
|
|||
|
pszMigrate = (char *) _alloca( dwLen );
|
|||
|
strcpy( pszMigrate, MigrationPath );
|
|||
|
strcat( pszMigrate, MIGRATEINF );
|
|||
|
dwResult = OpenInf( pszMigrate );
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Read the source OS version.
|
|||
|
dwResult = GetSourceVersion();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Compute the temp directory.
|
|||
|
dwResult = ComputeTemp();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Copy the user registry.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Loading User settings \r\n");
|
|||
|
dwResult = LoadUser( &DomainName, &UserName, &ptsHiveName );
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Copy system settings.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Loading System settings\r\n");
|
|||
|
dwResult = LoadSystem(argc, argv);
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Create the user profile.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Creating User Profile for %s, domain %s, hive %s\r\n", UserName, DomainName, ptsHiveName);
|
|||
|
dwResult = CreateUserProfileFromName( DomainName, UserName, ptsHiveName );
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Copy files.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Loading files\r\n");
|
|||
|
dwResult = LoadFiles();
|
|||
|
if (dwResult == ERROR_FILENAME_EXCED_RANGE)
|
|||
|
{
|
|||
|
dwReturnToDos = dwResult;
|
|||
|
}
|
|||
|
else if (dwResult != ERROR_SUCCESS)
|
|||
|
{
|
|||
|
goto cleanup;
|
|||
|
}
|
|||
|
|
|||
|
// Process the extentions.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Processing Extensions\r\n");
|
|||
|
dwResult = ProcessExtensions();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
//Fix registry entries with filenames in them
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Fixing special filenames\r\n");
|
|||
|
dwResult = FixSpecial();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
// Process the executable extentions.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Processing Exec Extenstions\r\n");
|
|||
|
dwResult = ProcessExecExtensions();
|
|||
|
if (dwResult != ERROR_SUCCESS) goto cleanup;
|
|||
|
|
|||
|
cleanup:
|
|||
|
// Clean up user stuff and ignore failures.
|
|||
|
if (DebugOutput)
|
|||
|
Win32Printf(LogFile, "Load complete. Cleaning up.\r\n");
|
|||
|
|
|||
|
CleanupUser();
|
|||
|
|
|||
|
// Close any open files and ignore failures.
|
|||
|
CloseFiles();
|
|||
|
|
|||
|
// Erase the temp directory and ignore failures.
|
|||
|
EraseTemp();
|
|||
|
|
|||
|
// Delete loadstate key in registry if success
|
|||
|
if (ERROR_SUCCESS == dwResult)
|
|||
|
{
|
|||
|
HKEY hKey;
|
|||
|
RegOpenKeyEx( HKEY_CURRENT_USER,
|
|||
|
TEXT("Software\\Microsoft\\Windows\\CurrentVersion"),
|
|||
|
0, KEY_WRITE, &hKey );
|
|||
|
RegDeleteKey(hKey, TEXT("Loadstate"));
|
|||
|
RegCloseKey(hKey);
|
|||
|
}
|
|||
|
|
|||
|
// Free strings.
|
|||
|
if (DomainName != NULL)
|
|||
|
free( DomainName );
|
|||
|
if (UserName != NULL)
|
|||
|
free( UserName );
|
|||
|
if (ptsHiveName != NULL )
|
|||
|
free( ptsHiveName );
|
|||
|
if (UserPath != NULL)
|
|||
|
free (UserPath);
|
|||
|
|
|||
|
CoUninitialize();
|
|||
|
|
|||
|
if (dwResult == ERROR_SUCCESS)
|
|||
|
{
|
|||
|
dwResult = dwReturnToDos;
|
|||
|
}
|
|||
|
|
|||
|
// Print a message.
|
|||
|
if (Console != INVALID_HANDLE_VALUE)
|
|||
|
if (dwResult == ERROR_SUCCESS)
|
|||
|
Win32PrintfResource( Console, IDS_COMPLETE_OK );
|
|||
|
else
|
|||
|
Win32PrintfResource( Console, IDS_COMPLETE_ERROR, szLogFile );
|
|||
|
|
|||
|
if (Verbose)
|
|||
|
{
|
|||
|
printf( "Returning 0x%x to DOS.\r\n", dwResult );
|
|||
|
}
|
|||
|
return dwResult;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|