//-------------------------------------------------------------- // // File: loadstate // // Contents: Load a machine state. // //--------------------------------------------------------------- #include "loadhead.cxx" #pragma hdrstop #include #include #include #include //--------------------------------------------------------------- // 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; }