276 lines
7.3 KiB
C
276 lines
7.3 KiB
C
|
//Copyright (c) 1998 - 1999 Microsoft Corporation
|
||
|
/******************************************************************************
|
||
|
*
|
||
|
* MIGRATE.C
|
||
|
*
|
||
|
* Migrate Windows 3.1 ini files, groups and reg.dat to NT registry
|
||
|
*
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <winbasep.h>
|
||
|
#include <winuserp.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <malloc.h>
|
||
|
#include <winsta.h>
|
||
|
#include <utilsub.h>
|
||
|
|
||
|
#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);
|
||
|
}
|
||
|
|