//Copyright (c) 1998 - 1999 Microsoft Corporation /****************************************************************************** * * MIGRATE.C * * Migrate Windows 3.1 ini files, groups and reg.dat to NT registry * * *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "migrate.h" #include "printfoa.h" USHORT fIni = FALSE; USHORT fGroup = FALSE; USHORT fReg = FALSE; USHORT fHelp = FALSE; USHORT fDebug = FALSE; WCHAR IniPath[_MAX_PATH+1]; WCHAR FullPath[_MAX_PATH+1]; int FileCount; TOKMAP ptm[] = { {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, _MAX_PATH, IniPath}, {L"/ini", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fIni}, {L"/group", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fGroup}, {L"/regdata", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fReg}, {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fHelp}, #if DBG {L"/debug", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fDebug}, #endif {0, 0, 0, 0, 0} }; BOOL WINAPI Win31MigrationStatusCallback( PWSTR, PVOID ); BOOL InitSystemFontInfo( VOID ); void Usage( BOOLEAN ); /******************************************************************************* * * main * ******************************************************************************/ int __cdecl main(INT argc, CHAR **argv) { WCHAR *CmdLine; WCHAR **argvW; int i, rc, Root; BOOL Result; /* * We can't use argv[] because its always ANSI, regardless of UNICODE */ CmdLine = GetCommandLineW(); /* * convert from oem char set to ansi */ OEM2ANSIW(CmdLine, wcslen(CmdLine)); /* * Massage the new command line to look like an argv[] type * because ParseCommandLine() depends on this format */ argvW = (WCHAR **)malloc( sizeof(WCHAR *) * (argc+1) ); if(argvW == NULL) { PutStdErr( ERROR_NOT_ENOUGH_MEMORY, 0 ); return(FAILURE); } argvW[0] = wcstok(CmdLine, L" "); for(i=1; i < argc; i++){ argvW[i] = wcstok(0, L" "); } argvW[argc] = NULL; /* * parse the cmd line without parsing the program name (argc-1, argv+1) */ rc = ParseCommandLine(argc-1, argvW+1, ptm, PCL_FLAG_NO_CLEAR_MEMORY); /* * Check for error from ParseCommandLine */ if ( fHelp || rc ) { if ( fHelp || (rc & PARSE_FLAG_NO_PARMS) ) { Usage(FALSE); return(SUCCESS); } else { Usage(TRUE); return(FAILURE); } } /* * If path parameter was not specified, then default to current directory */ if ( !(ptm[0].tmFlag & TMFLAG_PRESENT) ) GetCurrentDirectoryW( sizeof(IniPath), IniPath ); /* * Get full pathname and set INIDRIVE/INIPATH variables */ GetFullPathNameW( IniPath, sizeof(FullPath), FullPath, NULL ); Root = 2; if ( FullPath[0] == '\\' && FullPath[1] == '\\' ) { for ( i = 0; i < 2; Root++ ) if ( FullPath[Root] == '\\' ) i++; Root--; } FullPath[Root] = L'\0'; SetEnvironmentVariableW( L"INIDRIVE", FullPath ); FullPath[Root] = '\\'; SetEnvironmentVariableW( L"INIPATH", &FullPath[Root] ); if ( fIni ) { // printf( "Migrating .INI files from %S\n", FullPath ); Message(IDS_MESSAGE_INI, FullPath); FileCount = 0; Result = SynchronizeWindows31FilesAndWindowsNTRegistry( Win31LogonEvent, WIN31_MIGRATE_INIFILES, Win31MigrationStatusCallback, NULL ); if ( !Result && FileCount ) { // printf( "An error occured during .INI file migration\n" ); ErrorPrintf(IDS_ERROR_INI); } } if ( fGroup ) { // printf( "Migrating .GRP files from %S\n", FullPath ); Message(IDS_MESSAGE_GRP, FullPath); FileCount = 0; Result = SynchronizeWindows31FilesAndWindowsNTRegistry( Win31LogonEvent, WIN31_MIGRATE_GROUPS, Win31MigrationStatusCallback, NULL ); if ( !Result && FileCount ) { // printf( "An error occured during .GRP file migration\n" ); ErrorPrintf(IDS_ERROR_GRP); } } if ( fReg ) { // printf( "Migrating %S\\REG.DAT file\n", FullPath ); Message(IDS_MESSAGE_REG, FullPath); FileCount = 0; Result = SynchronizeWindows31FilesAndWindowsNTRegistry( Win31SystemStartEvent, WIN31_MIGRATE_REGDAT, Win31MigrationStatusCallback, NULL ); if ( !Result && FileCount ) { // printf( "An error occured during REG.DAT file migration\n" ); ErrorPrintf(IDS_ERROR_REG); } #if 0 InitSystemFontInfo(); #endif } return(SUCCESS); } /* main() */ BOOL WINAPI Win31MigrationStatusCallback( IN PWSTR Status, IN PVOID CallbackParameter ) { FileCount++; // printf( " Processing %S\n", Status ); Message(IDS_MESSAGE_PROCESS, Status); return( TRUE ); } BOOL InitSystemFontInfo( VOID ) { TCHAR *FontNames, *FontName; TCHAR FontPath[ MAX_PATH ]; ULONG cb = 63 * 1024; FontNames = malloc( cb ); if (FontNames == NULL) { return FALSE; } if (GetProfileString( TEXT("Fonts"), NULL, TEXT(""), FontNames, cb )) { FontName = FontNames; while (*FontName) { if (GetProfileString( TEXT("Fonts"), FontName, TEXT(""), FontPath, sizeof( FontPath ) )) { switch (AddFontResource( FontPath )) { case 0: KdPrint(("WINLOGON: Unable to add new font path: %ws\n", FontPath )); break; case 1: KdPrint(("WINLOGON: Found new font path: %ws\n", FontPath )); break; default: KdPrint(("WINLOGON: Found existing font path: %ws\n", FontPath )); RemoveFontResource( FontPath ); break; } } while (*FontName++) ; } } else { KdPrint(("WINLOGON: Unable to read font info from win.ini - %u\n", GetLastError())); } free( FontNames ); return TRUE; } /******************************************************************************* * * Usage * * Output the usage message for this utility. * * ENTRY: * bError (input) * TRUE if the 'invalid parameter(s)' message should preceed the usage * message and the output go to stderr; FALSE for no such error * string and output goes to stdout. * * EXIT: * * ******************************************************************************/ void Usage( BOOLEAN bError ) { if ( bError ) { ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS); } ErrorPrintf(IDS_USAGE1); ErrorPrintf(IDS_USAGE2); ErrorPrintf(IDS_USAGE3); ErrorPrintf(IDS_USAGE4); ErrorPrintf(IDS_USAGE5); ErrorPrintf(IDS_USAGE6); ErrorPrintf(IDS_USAGE7); ErrorPrintf(IDS_USAGE8); }