windows-nt/Source/XPSP1/NT/windows/winstate/v1/loadstate/loadstate.cxx
2020-09-26 16:20:57 +08:00

251 lines
6.5 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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