windows-nt/Source/XPSP1/NT/termsrv/admtools/migrate/migrate.c
2020-09-26 16:20:57 +08:00

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