7341 lines
184 KiB
C
7341 lines
184 KiB
C
/******************************************************************************
|
|
|
|
Copyright(c) Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
BootCfg.cpp
|
|
|
|
Abstract:
|
|
|
|
This file is intended to have the functionality for
|
|
configuring, displaying, changing and deleting boot.ini
|
|
settings for the local host or a remote system.
|
|
|
|
Author:
|
|
|
|
J.S.Vasu 17/1/2001
|
|
|
|
Revision History:
|
|
|
|
J.S.Vasu 17/1/2001 Localisation,function headers
|
|
|
|
SanthoshM.B 10/2/2001 Added 64 bit functionality Code.
|
|
|
|
J.S.Vasu 15/2/2001 Added the functionality of 32 bit and 64 bit acc to the DCR's.
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
// Include files
|
|
|
|
#include "pch.h"
|
|
#include "resource.h"
|
|
#include "BootCfg.h"
|
|
#include "BootCfg64.h"
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine description : Main function which calls all the other main functions depending on
|
|
// the option specified by the user.
|
|
//
|
|
// Arguments:
|
|
// [in] argc : argument count specified at the command prompt.
|
|
// [in] argv : arguments specified at the command prompt.
|
|
//
|
|
// Return Value : DWORD
|
|
// 0 : If the utility successfully performs the specified operation.
|
|
// 1 : If the utility is unsuccessful in performing the specified operation.
|
|
// ***************************************************************************
|
|
|
|
// Main function of the program
|
|
DWORD _cdecl _tmain( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
// Declaring the main option switches as boolean values
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bCopy = FALSE ;
|
|
BOOL bChange = FALSE ;
|
|
BOOL bQuery = FALSE ;
|
|
BOOL bDelete = FALSE ;
|
|
BOOL bRawString = FALSE ;
|
|
BOOL bResult = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
DWORD dwExitcode = ERROR_SUCCESS;
|
|
BOOL bProcess = FALSE ;
|
|
BOOL bTimeOut = FALSE ;
|
|
BOOL bDefault = FALSE ;
|
|
BOOL bDebug = FALSE ;
|
|
BOOL bEms = FALSE ;
|
|
BOOL bAddSw = FALSE ;
|
|
BOOL bRmSw = FALSE ;
|
|
BOOL bDbg1394 = FALSE ;
|
|
BOOL bMirror = FALSE ;
|
|
|
|
TCHAR szServer[MAX_RES_STRING] = NULL_STRING ;
|
|
DWORD dwRetVal = 0 ;
|
|
|
|
|
|
#ifdef _WIN64
|
|
dwExitcode = InitializeEFI();
|
|
#endif
|
|
|
|
|
|
if(argc == 1)
|
|
{
|
|
dwExitcode = QueryBootIniSettings( argc, argv );
|
|
return dwExitcode;
|
|
}
|
|
|
|
|
|
// Call the preProcessOptions function to find out the option selected by the user
|
|
dwExitcode = preProcessOptions( argc, argv, &bUsage, &bCopy, &bQuery, &bDelete,&bRawString,&bDefault,&bTimeOut,&bDebug,&bEms,&bAddSw,&bRmSw,&bDbg1394,&bMirror);
|
|
|
|
if(dwExitcode == EXIT_FAILURE)
|
|
{
|
|
ReleaseGlobals();
|
|
return dwExitcode;
|
|
|
|
}
|
|
|
|
|
|
/*#ifdef _WIN64
|
|
dwExitcode = InitializeEFI();
|
|
#endif
|
|
*/
|
|
|
|
if(bUsage && bTimeOut)
|
|
{
|
|
#ifndef _WIN64
|
|
|
|
//check the remote systemtype and display error
|
|
//if it is a 64 bit
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayTimeOutUsage_X86() ;
|
|
}
|
|
else
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
#else
|
|
displayTimeOutUsage_IA64();
|
|
#endif
|
|
ReleaseGlobals();
|
|
return EXIT_SUCCESS ;
|
|
|
|
}
|
|
|
|
if(bUsage && bDefault)
|
|
{
|
|
#ifndef _WIN64
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayChangeOSUsage_X86();
|
|
}
|
|
else
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
#else
|
|
displayDefaultEntryUsage_IA64();
|
|
#endif
|
|
ReleaseGlobals();
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
|
|
// If BootIni.exe /?
|
|
if( ( bUsage ==TRUE)&& ( bCopy==FALSE )&& (bQuery==FALSE)&&(bDelete==FALSE)&&(bRawString ==FALSE)
|
|
&&(bDefault==FALSE)&&(bTimeOut==FALSE) && (bDebug==FALSE)&& (bEms==FALSE)&&(bAddSw==FALSE)
|
|
&&(bRmSw==FALSE)&&( bDbg1394==FALSE )&&(bMirror== FALSE) )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = displayMainUsage_X86();
|
|
#else
|
|
displayMainUsage_IA64();
|
|
return EXIT_SUCCESS ;
|
|
#endif
|
|
}
|
|
|
|
if(bRawString)
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = AppendRawString(argc,argv);
|
|
#else
|
|
dwExitcode = RawStringOsOptions_IA64(argc,argv);
|
|
#endif
|
|
ReleaseGlobals();
|
|
return dwExitcode;
|
|
|
|
}
|
|
|
|
// If BootIni.exe -copy option is selected
|
|
if( bCopy )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = CopyBootIniSettings( argc, argv );
|
|
#else
|
|
dwExitcode = CopyBootIniSettings_IA64( argc, argv);
|
|
#endif
|
|
}
|
|
|
|
// If BootIni.exe -delete option is selected
|
|
if( bDelete )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = DeleteBootIniSettings( argc, argv );
|
|
#else
|
|
dwExitcode = DeleteBootIniSettings_IA64( argc, argv );
|
|
#endif
|
|
|
|
}
|
|
|
|
// If BootIni.exe -query option is selected
|
|
if( bQuery )
|
|
{
|
|
dwExitcode = QueryBootIniSettings( argc, argv );
|
|
}
|
|
|
|
if(bTimeOut)
|
|
{
|
|
|
|
#ifndef _WIN64
|
|
dwExitcode = ChangeTimeOut(argc,argv);
|
|
#else
|
|
dwExitcode = ChangeTimeOut_IA64(argc,argv);
|
|
#endif
|
|
|
|
}
|
|
|
|
if(bDefault)
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = ChangeDefaultOs(argc,argv);
|
|
#else
|
|
dwExitcode = ChangeDefaultBootEntry_IA64(argc,argv);
|
|
#endif
|
|
}
|
|
|
|
|
|
if(bDebug )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = ProcessDebugSwitch( argc, argv );
|
|
#else
|
|
dwExitcode = ProcessDebugSwitch_IA64(argc,argv);
|
|
#endif
|
|
}
|
|
|
|
if(bEms )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = ProcessEmsSwitch( argc, argv );
|
|
#else
|
|
dwExitcode = ProcessEmsSwitch_IA64(argc,argv);
|
|
#endif
|
|
}
|
|
|
|
if(bAddSw )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = ProcessAddSwSwitch( argc, argv );
|
|
#else
|
|
dwExitcode = ProcessAddSwSwitch_IA64(argc,argv);
|
|
#endif
|
|
}
|
|
|
|
if(bRmSw )
|
|
{
|
|
#ifndef _WIN64
|
|
dwExitcode = ProcessRmSwSwitch( argc, argv );
|
|
#else
|
|
dwExitcode = ProcessRmSwSwitch_IA64( argc, argv );
|
|
#endif
|
|
}
|
|
|
|
if (bDbg1394 )
|
|
{
|
|
|
|
#ifndef _WIN64
|
|
dwExitcode = ProcessDbg1394Switch(argc,argv);
|
|
#else
|
|
dwExitcode = ProcessDbg1394Switch_IA64(argc,argv);
|
|
#endif
|
|
}
|
|
|
|
if(bMirror)
|
|
{
|
|
#ifdef _WIN64
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX));
|
|
//dwExitcode = ProcessMirrorSwitch_IA64(argc,argv);
|
|
#else
|
|
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX));
|
|
#endif
|
|
}
|
|
|
|
// exit with the appropriate return value if there is no problem
|
|
ReleaseGlobals();
|
|
return dwExitcode;
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
//
|
|
// Routine Description : Function used to process the main options
|
|
//
|
|
// Arguments:
|
|
// [ in ] argc : Number of command line arguments
|
|
// [ in ] argv : Array containing command line arguments
|
|
// [ out ] pbUsage : Pointer to boolean variable which will indicate
|
|
// whether usage option is specified by the user.
|
|
// [ out ] pbCopy : Pointer to boolean variable which will indicate
|
|
// whether copy option is specified by the user.
|
|
// [ out ] pbQuery : Pointer to boolean variable which will indicate
|
|
// whether query option is specified by the user.
|
|
// [ out ] pbChange : Pointer to boolean variable which will indicate
|
|
// whether change option is specified by the user.
|
|
// [ out ] pbDelete : Pointer to boolean variable which will indicate
|
|
// whether delete option is specified by the user.
|
|
// [ out ] pbRawString : Pointer to the boolean indicating whether raw option
|
|
// is specified by the user.
|
|
// [ out ] pbDefault : Pointer to the boolean indicating whether default option
|
|
// is specified by the user.
|
|
// [ out ] pbTimeOut : Pointer to the boolean indicating whether timeout option
|
|
// is specified by the user.
|
|
// [ out ] pbDebug : Pointer to the boolean indicating whether debug option
|
|
// is specified by the user.
|
|
// [ out ] pbEms : Pointer to the boolean indicating whether ems option
|
|
// is specified by the user.
|
|
// [ out ] pbAddSw : Pointer to the boolean indicating whether Addsw option
|
|
// is specified by the user.
|
|
// [ out ] pbRmSw : Pointer to the boolean indicating whether rmsw option
|
|
// is specified by the user.
|
|
// [ out ] pbDbg1394 : Pointer to the boolean indicating whether dbg1394 option
|
|
// is specified by the user.
|
|
// [ out ] pbMirror : Pointer to the boolean indicating whether mirror option
|
|
// is specified by the user.
|
|
//
|
|
// Return Type : Bool
|
|
// A Bool value indicating EXIT_SUCCESS on success else
|
|
// EXIT_FAILURE on failure
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD preProcessOptions( DWORD argc, LPCTSTR argv[],
|
|
PBOOL pbUsage,
|
|
PBOOL pbCopy,
|
|
PBOOL pbQuery,
|
|
PBOOL pbDelete,
|
|
PBOOL pbRawString,
|
|
PBOOL pbDefault,
|
|
PBOOL pbTimeOut,
|
|
PBOOL pbDebug,
|
|
PBOOL pbEms,
|
|
PBOOL pbAddSw,
|
|
PBOOL pbRmSw,
|
|
PBOOL pbDbg1394 ,
|
|
PBOOL pbMirror
|
|
)
|
|
{
|
|
// Initialise a boolean variable bOthers to find out whether switches other
|
|
// than the main swithces are selected by the user
|
|
BOOL bOthers = FALSE;
|
|
|
|
DWORD dwCount = 0;
|
|
DWORD dwi = 0;
|
|
|
|
BOOL bMainUsage = FALSE ;
|
|
|
|
TCHAR szServer[MAX_RES_STRING] = NULL_STRING ;
|
|
DWORD dwRetVal = 0;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
// Populate the TCMDPARSER structure and pass the structure to the DoParseParam
|
|
// function. DoParseParam function populates the corresponding variables depending
|
|
// upon the command line input.
|
|
|
|
TCMDPARSER cmdOptions[] = {
|
|
{ CMDOPTION_COPY, 0, 1, 0, pbCopy, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_QUERY, 0, 1, 0, pbQuery, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_DELETE, 0, 1, 0, pbDelete, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, pbUsage, NULL_STRING, NULL, NULL },
|
|
{ CMDOTHEROPTIONS, CP_DEFAULT, 0, 0, &bOthers, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_RAW, 0,1, 0, pbRawString, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_DEFAULTOS, 0,1,0,pbDefault,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_TIMEOUT, 0,1,0,pbTimeOut,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_DEBUG, 0,1,0,pbDebug,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_EMS, 0,1,0,pbEms,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_ADDSW, 0,1,0,pbAddSw,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_RMSW, 0,1,0,pbRmSw,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_DBG1394, 0,1,0,pbDbg1394,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_MIRROR, 0,1,0,pbMirror,NULL_STRING,NULL,NULL}
|
|
};
|
|
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// If there is an error while parsing, display "Invalid Syntax"
|
|
// If more than one main option is selected, then display error message
|
|
// If usage is specified for sub-options
|
|
// If none of the options are specified
|
|
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
DISPLAY_MESSAGE(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//checking if the user has entered more than 1 option.
|
|
|
|
if (*pbCopy)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if (*pbQuery)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if (*pbDelete)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if (*pbRawString)
|
|
{
|
|
dwCount++ ;
|
|
|
|
// Check if any of the other valid switches have been
|
|
// given as an input to the raw string
|
|
if( *pbTimeOut || *pbDebug || *pbAddSw
|
|
||*pbRmSw || *pbDbg1394 || *pbEms
|
|
||*pbDelete || *pbCopy || *pbQuery
|
|
||*pbDefault || *pbMirror)
|
|
{
|
|
// Check wether the usage switch has been entered
|
|
if( *pbUsage )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAIN_USAGE));
|
|
return ( EXIT_FAILURE );
|
|
}
|
|
|
|
// Check if the other option is specified after the
|
|
// 'raw' option
|
|
for( dwi = 0; dwi < argc; dwi++ )
|
|
{
|
|
if( lstrcmpi( argv[ dwi ], _T("-raw") ) == 0
|
|
|| lstrcmpi( argv[ dwi ], _T("/raw") ) == 0 )
|
|
{
|
|
if( (dwi+1) == argc )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAIN_USAGE));
|
|
return ( EXIT_FAILURE );
|
|
}
|
|
else if( _tcschr( argv[ dwi + 1 ], _T( '\"' ) ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAIN_USAGE));
|
|
return ( EXIT_FAILURE );
|
|
}
|
|
}
|
|
}
|
|
|
|
dwCount--;
|
|
}
|
|
}
|
|
|
|
if (*pbDefault)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if (*pbTimeOut)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if (*pbDebug)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if(*pbAddSw)
|
|
{
|
|
dwCount++ ;
|
|
|
|
}
|
|
|
|
if(*pbRmSw)
|
|
{
|
|
dwCount++ ;
|
|
|
|
}
|
|
|
|
if(*pbDbg1394)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if(*pbEms)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
if(*pbMirror)
|
|
{
|
|
dwCount++ ;
|
|
}
|
|
|
|
//display an error message if the user enters more than 1 main option
|
|
if( ( ( dwCount > 1 ) ) ||
|
|
//display an error message if the user enters 1 main option along with other junk
|
|
( (*pbUsage) && bOthers ) ||
|
|
//display an error message if the user does not enter any main option
|
|
( !(*pbCopy) && !(*pbQuery) && !(*pbDelete) && !(*pbUsage) && !(*pbRawString)&& !(*pbDefault)&&!(*pbTimeOut)&&!(*pbDebug)&& !( *pbEms)&& !(*pbAddSw)&& !(*pbRmSw)&& !(*pbDbg1394)&& !(*pbMirror) ) )
|
|
{
|
|
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAIN_USAGE));
|
|
return ( EXIT_FAILURE );
|
|
}
|
|
|
|
|
|
return ( EXIT_SUCCESS );
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This routine is to make another OS instance copy for which you
|
|
can add switches.
|
|
|
|
Arguments:
|
|
[in] : argc Number of command line arguments
|
|
[in] : argv Array containing command line arguments
|
|
|
|
|
|
Return Value :
|
|
DWORD
|
|
******************************************************************************/
|
|
|
|
|
|
DWORD CopyBootIniSettings( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
// Declaring the main option switch and the usage switch as
|
|
// boolean values and initialising them
|
|
BOOL bCopy = FALSE ;
|
|
BOOL bUsage = FALSE;
|
|
|
|
// size of the buffer and the key buffer storing the keys
|
|
// Length of the buffer will be incremented dynamically based on
|
|
// the number of keys present in the boot.ini file. First the length
|
|
// is initialised to 100 TCHAR bytes.
|
|
|
|
LPTSTR szBuf = NULL_STRING ;
|
|
|
|
// File pointer pointing to the boot.ini file
|
|
FILE *stream = NULL;
|
|
|
|
// dynamic array containing all the keys of the boot.ini file
|
|
TARRAY arr = NULL;
|
|
|
|
// The key for which a new OS instance is to be built
|
|
TCHAR key[MAX_RES_STRING] = NULL_STRING;
|
|
|
|
BOOL bRes = FALSE ;
|
|
|
|
// Variable storing the path of boot.ini file
|
|
LPTSTR szPath = NULL_STRING ;
|
|
|
|
TCHAR szTmpPath[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
// Variable which stores the new key-value pair
|
|
TCHAR newInstance[500] = NULL_STRING ;
|
|
|
|
// Variable to keep track the OS entry specified by the user
|
|
DWORD dwDefault = 0;
|
|
|
|
// It contains the return length of GetPrivateProfileSection API
|
|
DWORD dwReturnLen = 0;
|
|
|
|
// Number of keys present in the boot.ini file
|
|
DWORD dwNumKeys = 0;
|
|
|
|
BOOL bNeedPwd =FALSE;
|
|
|
|
DWORD dwId = 0;
|
|
|
|
TCHAR szMesgBuffer[MAX_RES_STRING] = NULL_STRING;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING256 szDescription = NULL_STRING;
|
|
|
|
BOOL bFlag = FALSE ;
|
|
|
|
BOOL bMemFlag = FALSE ;
|
|
|
|
DWORD dwLength = MAX_STRING_LENGTH1 ;
|
|
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
STRING256 szCopyStr = NULL_STRING ;
|
|
|
|
LPCTSTR szToken1 = NULL ;
|
|
|
|
|
|
// Builiding the TCMDPARSER structure
|
|
|
|
TCMDPARSER cmdOptions[] = {
|
|
{ CMDOPTION_COPY, CP_MAIN_OPTION, 1, 0, &bCopy, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_DESCRIPTION, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szDescription, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 0, 0, &bUsage, 0, 0 },
|
|
{ SWITCH_ID, CP_TYPE_UNUMERIC | CP_VALUE_MANDATORY | CP_MANDATORY, 1, 0, &dwDefault, NULL_STRING, NULL, NULL }
|
|
};
|
|
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
szBuf = ( LPTSTR ) malloc( dwLength*sizeof( TCHAR ) );
|
|
if(szBuf == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFEFREE(szBuf);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Variable storing the path of boot.ini file
|
|
szPath = (TCHAR*)malloc(MAX_RES_STRING* sizeof(TCHAR));
|
|
if(szPath == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying copy usage if user specified -? with -copy option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
displayCopyUsage_X86();
|
|
return (EXIT_SUCCESS);
|
|
}
|
|
else
|
|
{
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
//display an error message saying that Friendly name
|
|
// must be restricted ot 67 characters.
|
|
if(lstrlen(szDescription) >= 67)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_FRIENDLY_NAME));
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//display error message if the user enters password without entering username
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
// for prompting the password if the user enters
|
|
// * after -p option.
|
|
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if( (cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
// Getting the keys of the Operating system section in the boot.ini file
|
|
arr = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
lstrcpy(szTmpPath,szPath);
|
|
|
|
// Getting the total number of keys in the operating systems section
|
|
dwNumKeys = DynArrayGetCount(arr);
|
|
|
|
if((dwNumKeys >= MAX_BOOTID_VAL) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAX_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Displaying error message if the number of keys is less than the OS entry
|
|
// line number specified by the user
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwNumKeys ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Getting the key of the OS entry specified by the user
|
|
if(arr != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL ;
|
|
pwsz = DynArrayItemAsString( arr, dwDefault - 1 ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
_tcscpy( key,pwsz);
|
|
}
|
|
else
|
|
{
|
|
resetFileAttrib(szPath);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
resetFileAttrib(szPath);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Copying the key to a newInstance variable which will hold the new key-value pair.
|
|
lstrcpy(newInstance, key);
|
|
szToken = _tcstok(newInstance,TOKEN_EQUAL);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Building the newInstance.
|
|
lstrcat(newInstance, TOKEN_EQUAL );
|
|
lstrcat(newInstance, TOKEN_SINGLEQUOTE);
|
|
|
|
// Copying the description specified by the user as the value of the new key.
|
|
lstrcat(newInstance, szDescription);
|
|
lstrcat(newInstance, TOKEN_SINGLEQUOTE);
|
|
|
|
//
|
|
//concatenating the star so that the boundschecker does not
|
|
//give invalid argument exception
|
|
//
|
|
|
|
lstrcat(key,TOKEN_STAR);
|
|
szToken = _tcstok(key,TOKEN_FWDSLASH1);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// get the Os Load options into the szToken1 string.
|
|
szToken1 = _tcstok(NULL,TOKEN_STAR);
|
|
lstrcpy(szCopyStr,szToken1);
|
|
|
|
lstrcat(newInstance,TOKEN_EMPTYSPACE);
|
|
lstrcat(newInstance,TOKEN_FWDSLASH1) ;
|
|
lstrcat(newInstance,szCopyStr);
|
|
newInstance[lstrlen(newInstance) + 1] = _T('\0');
|
|
|
|
// Reallocating the buffer length depending on the return value and of the
|
|
// GetPrivateProfileSection API. Its return a value 2 less than the buffer size
|
|
// if the buffer size is not enough to hold all the key-value pairs.
|
|
while( 1 )
|
|
{
|
|
dwReturnLen = GetPrivateProfileSection(OS_FIELD, szBuf, dwLength, szTmpPath);
|
|
|
|
// If buffer length is sufficient break
|
|
if ( dwLength - 2 != dwReturnLen )
|
|
break;
|
|
|
|
// Increasing the buffer length and reallocate the size
|
|
dwLength += 100;
|
|
szBuf = ( LPTSTR ) realloc( szBuf, dwLength * sizeof( TCHAR ) );
|
|
if (szBuf == NULL)
|
|
{
|
|
bMemFlag = TRUE ;
|
|
break ;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//display error message if there is no enough memory
|
|
if (bMemFlag == TRUE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
resetFileAttrib(szTmpPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
// Adding the new key-value pair
|
|
lstrcat(szBuf + dwReturnLen, newInstance);
|
|
|
|
// Appending the null character at the end
|
|
*(szBuf + dwReturnLen + 1 + lstrlen(newInstance)) = '\0';
|
|
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
if( WritePrivateProfileSection(OS_FIELD, szBuf, szTmpPath) != 0 )
|
|
{
|
|
_stprintf(szMesgBuffer,GetResString(IDS_COPY_SUCCESS),dwDefault);
|
|
DISPLAY_MESSAGE(stdout,szMesgBuffer);
|
|
bRes = resetFileAttrib(szPath);
|
|
bRes = resetFileAttrib(szTmpPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return(bRes);
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_COPY_OS));
|
|
resetFileAttrib(szPath);
|
|
resetFileAttrib(szTmpPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Closing the opened boot.ini file handl
|
|
SAFECLOSE(stream);
|
|
bRes = resetFileAttrib(szPath);
|
|
bRes = resetFileAttrib(szTmpPath);
|
|
SAFEFREE(szBuf);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This routine is to delete an OS entry from the Operating systems
|
|
section of Boot.ini file in the specified machine.
|
|
|
|
Arguments:
|
|
[in] : argc Number of command line arguments
|
|
[in] : argv Array containing command line arguments
|
|
|
|
|
|
Return Value :
|
|
DWORD
|
|
******************************************************************************/
|
|
DWORD DeleteBootIniSettings( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
// Declaring the main option switch and the usage switch as
|
|
// boolean values and initialsing them
|
|
BOOL bDelete = FALSE ;
|
|
BOOL bUsage = FALSE;
|
|
|
|
BOOL bRes = FALSE ;
|
|
|
|
// dwDefault variable stores the OS entry specified by the user
|
|
DWORD dwDefault = 0;
|
|
|
|
// Variables containing the count of key-value pairs
|
|
DWORD dwInitialCount = 0;
|
|
|
|
// Variable which will store the final key-value pairs
|
|
LPTSTR szFinalStr = NULL_STRING;
|
|
|
|
// array storing all the keys of the operating systems section
|
|
TARRAY arrKeyValue;
|
|
|
|
// Variable storing the path of boot.ini file
|
|
LPTSTR szPath = NULL_STRING ;
|
|
|
|
// File pointer to the boot.ini file
|
|
FILE *stream = NULL;
|
|
|
|
BOOL bNeedPwd = FALSE ;
|
|
|
|
BOOL bFlag = FALSE ;
|
|
|
|
TCHAR szMesgBuffer[MAX_RES_STRING] = NULL_STRING;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szDescription = NULL_STRING;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
// Builiding the TCMDPARSER structure
|
|
|
|
TCMDPARSER cmdOptions[] = {
|
|
{ CMDOPTION_DELETE, CP_MAIN_OPTION, 1, 0, &bDelete, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 0, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY | CP_MANDATORY, 1, 0, &dwDefault, NULL_STRING, NULL, NULL }
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
szFinalStr =(TCHAR*)malloc(MAX_STRING_LENGTH1 *sizeof(TCHAR));
|
|
if(szFinalStr == NULL )
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Variable storing the path of boot.ini file
|
|
szPath = (TCHAR*)malloc(MAX_RES_STRING * sizeof(TCHAR));
|
|
if(szPath == NULL)
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
// Parsing the delete option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying delete usage if user specified -? with -delete option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayDeleteUsage_X86();
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_SUCCESS);
|
|
}else
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if( (cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// Searching the path of the boot.ini file in the specified system
|
|
// In general the boot.ini file resides in c:\.
|
|
// Search Path function can be used to trace out the path of boot.ini file
|
|
// SearchPath( "\\", "boottest.ini", ".ini", 80, (LPTSTR)filepath, (LPTSTR*)&filepart );
|
|
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
else
|
|
{
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
}
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
}
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag );
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Getting all the key-value pairs of the operating system into a dynamic
|
|
// array for manipulation.
|
|
arrKeyValue = getKeyValueOfINISection( szPath, OS_FIELD);
|
|
if(arrKeyValue == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Getting the total no: of key-value pairs in the operating system section.
|
|
dwInitialCount = DynArrayGetCount(arrKeyValue);
|
|
|
|
// Checking whether the given OS entry is valid or not. If the OS entry given
|
|
// is greater than the number of keys present, then display an error message
|
|
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwInitialCount ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// If only one OS entry is present and if the user tries to delete the OS entry, then
|
|
// display an error message
|
|
if( DynArrayGetCount(arrKeyValue) == 1)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ONLY_ONE_OS));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Remove the OS entry specified by the user from the dynamic array
|
|
|
|
DynArrayRemove(arrKeyValue, dwDefault - 1);
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
|
|
if (stringFromDynamicArray1( arrKeyValue,szFinalStr ) == EXIT_FAILURE)
|
|
{
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
_stprintf(szMesgBuffer,GetResString(IDS_DEL_SUCCESS),dwDefault);
|
|
DISPLAY_MESSAGE(stdout,szMesgBuffer);
|
|
bRes = resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DELETE_OS));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Closing the boot.ini stream
|
|
SAFECLOSE(stream);
|
|
bRes = resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFEFREE(szPath);
|
|
DestroyDynamicArray(&arrKeyValue);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This routine is to display the current boot.ini file settings for
|
|
the specified system.
|
|
|
|
Arguments:
|
|
[in] : argc Number of command line arguments
|
|
[in] : argv Array containing command line arguments
|
|
|
|
|
|
Return Value :
|
|
DWORD
|
|
******************************************************************************/
|
|
|
|
DWORD QueryBootIniSettings( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
// File pointer pointing to the boot.ini file
|
|
FILE *stream = NULL;
|
|
|
|
// Declaring the main option switch and the usage switch as
|
|
// boolean values and initialsing them
|
|
BOOL bQuery = FALSE ;
|
|
BOOL bUsage = FALSE;
|
|
BOOL bExitVal = TRUE;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bVerbose = TRUE ;
|
|
|
|
TCOLUMNS ResultHeader[ MAX_COLUMNS ];
|
|
|
|
TARRAY arrResults = NULL ;
|
|
TARRAY arrKeyValuePairs = NULL;
|
|
TARRAY arrBootLoader = NULL;
|
|
DWORD dwFormatType = 0;
|
|
BOOL bHeader = TRUE ;
|
|
DWORD dwLength = 0 ;
|
|
DWORD dwCnt = 0;
|
|
TCHAR szValue[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szFriendlyName[MAX_CMD_LENGTH] = TOKEN_NA ;
|
|
|
|
TCHAR szBootOptions[MAX_RES_STRING] = TOKEN_NA ;
|
|
TCHAR szBootEntry[MAX_RES_STRING] = TOKEN_NA ;
|
|
TCHAR szArcPath[MAX_RES_STRING] = TOKEN_NA ;
|
|
TCHAR szTmpString[MAX_RES_STRING] = TOKEN_NA ;
|
|
PTCHAR psztok = NULL ;
|
|
DWORD dwRow = 0;
|
|
DWORD dwCount = 0;
|
|
BOOL bRes = FALSE ;
|
|
BOOL bFlag = FALSE ;
|
|
|
|
DWORD dwIndex = 0 ;
|
|
|
|
DWORD dwLength1 = 0 ;
|
|
DWORD dwFinalLength = 0 ;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
LPCWSTR szKeyName[MAX_RES_STRING] ;
|
|
|
|
|
|
TCHAR szResults[MAX_RES_STRING][MAX_RES_STRING] ;
|
|
TCHAR szDisplay[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
DWORD dwSectionFlag = 0 ;
|
|
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal= 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
BOOL bTokenFlag = FALSE ;
|
|
BOOL bPasswdFlag = FALSE ;
|
|
|
|
|
|
// Builiding the TCMDPARSER structure
|
|
TCMDPARSER cmdOptions[] = {
|
|
{ CMDOPTION_QUERY, CP_MAIN_OPTION, 1, 0, &bQuery, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 0, 0, &bUsage, NULL_STRING, NULL, NULL }
|
|
|
|
|
|
};
|
|
|
|
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing all the switches specified with -query option
|
|
if ( ! DoParseParam( argc, argv,SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
|
|
// Displaying query usage if user specified -? with -query option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayQueryUsage();
|
|
return (EXIT_SUCCESS);
|
|
}
|
|
else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef _WIN64
|
|
bExitVal = QueryBootIniSettings_IA64();
|
|
return bExitVal;
|
|
#endif
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
//set the default format as list
|
|
dwFormatType = SR_FORMAT_LIST;
|
|
|
|
//forms the header for the OS options
|
|
FormHeader(bHeader,ResultHeader,bVerbose);
|
|
|
|
|
|
//create dynamic array to hold the results for the BootOptions
|
|
arrResults = CreateDynamicArray();
|
|
|
|
//create dynamic array to hold the results for the BootLoader section
|
|
arrBootLoader = CreateDynamicArray();
|
|
|
|
if(arrResults == NULL || arrBootLoader == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
if (arrResults!=NULL)
|
|
DestroyDynamicArray(&arrResults);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//to store entries corresponding to Operating Systems sections
|
|
arrKeyValuePairs = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
|
|
//to store entries corresponding to BootLoader section
|
|
arrBootLoader = getKeysOfINISection(szPath,BOOTLOADERSECTION);
|
|
|
|
if( (arrBootLoader == NULL)||(arrKeyValuePairs == NULL))
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
dwCount = DynArrayGetCount(arrBootLoader);
|
|
|
|
|
|
//to display the Header Column
|
|
DISPLAY_MESSAGE(stdout,TOKEN_NEXTLINE);
|
|
DISPLAY_MESSAGE(stdout,BOOT_HEADER);
|
|
DISPLAY_MESSAGE(stdout,DASHES_BOOTOS);
|
|
|
|
// this loop is for calculating the maximum width of the the keys which will be displayed.
|
|
for(dwIndex=0;dwIndex < dwCount;dwIndex++)
|
|
{
|
|
szKeyName[dwIndex] = DynArrayItemAsString(arrBootLoader,dwIndex);
|
|
|
|
//the value correspondin to the key is obtained.
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,szKeyName[dwIndex],szResults[dwIndex]);
|
|
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
dwLength1 = lstrlen(szKeyName[dwIndex]);
|
|
|
|
if (dwLength1 > dwFinalLength)
|
|
{
|
|
dwFinalLength = dwLength1;
|
|
}
|
|
}
|
|
|
|
|
|
// display the results of the bootloader section.
|
|
for(dwIndex=0;dwIndex < dwCount;dwIndex++)
|
|
{
|
|
dwLength1 = dwFinalLength - lstrlen(szKeyName[dwIndex]) + 1;
|
|
DISPLAY_MESSAGE(stdout,szKeyName[dwIndex]);
|
|
_tcscpy(szDisplay,TOKEN_COLONSYMBOL);
|
|
_tcsncat(szDisplay,TOKEN_50SPACES,dwLength1);
|
|
DISPLAY_MESSAGE(stdout,szDisplay);
|
|
DISPLAY_MESSAGE(stdout,szResults[dwIndex]);
|
|
DISPLAY_MESSAGE(stdout,TOKEN_NEXTLINE);
|
|
|
|
|
|
}
|
|
|
|
DISPLAY_MESSAGE(stdout,TOKEN_NEXTLINE);
|
|
|
|
psztok = NULL ;
|
|
//getting the count of the number of boot entries
|
|
dwLength = DynArrayGetCount(arrKeyValuePairs);
|
|
|
|
for(dwCnt=0;dwCnt < dwLength;dwCnt++ )
|
|
{
|
|
dwRow = DynArrayAppendRow(arrResults,MAX_COLUMNS) ;
|
|
lstrcpy(szFriendlyName,NULL_STRING);
|
|
lstrcpy(szBootOptions,NULL_STRING);
|
|
lstrcpy(szTmpString,NULL_STRING);
|
|
if(arrKeyValuePairs != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arrKeyValuePairs,dwCnt );
|
|
if(pwsz != NULL)
|
|
{
|
|
lstrcpy(szValue,pwsz);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
DestroyDynamicArray(&arrKeyValuePairs);
|
|
DestroyDynamicArray(&arrResults);
|
|
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
psztok = _tcstok(szValue,TOKEN_EQUAL);
|
|
if(psztok != NULL)
|
|
{
|
|
lstrcpy(szArcPath,psztok);
|
|
psztok = _tcstok(NULL,TOKEN_FWDSLASH1 );
|
|
|
|
if(psztok != NULL)
|
|
{
|
|
lstrcpy(szFriendlyName,psztok);
|
|
lstrcat(szValue,TOKEN_STAR);
|
|
psztok = _tcstok(NULL,TOKEN_STAR);
|
|
if(psztok != NULL)
|
|
{
|
|
lstrcpy(szTmpString,psztok);
|
|
}
|
|
else
|
|
{
|
|
bTokenFlag = TRUE ;
|
|
}
|
|
|
|
}else
|
|
{
|
|
bTokenFlag = TRUE ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
bTokenFlag = TRUE ;
|
|
}
|
|
|
|
|
|
|
|
_ltow(dwCnt+1,szBootEntry,10);
|
|
DynArraySetString2( arrResults,dwRow ,COL0,szBootEntry,0 );
|
|
if(lstrlen(szFriendlyName)==0)
|
|
{
|
|
lstrcpy(szFriendlyName,TOKEN_NA);
|
|
}
|
|
DynArraySetString2( arrResults,dwRow ,COL1,szFriendlyName,0 );
|
|
DynArraySetString2(arrResults,dwRow,COL2,szArcPath,0);
|
|
|
|
if(lstrlen(szTmpString) != 0)
|
|
{
|
|
lstrcat(szBootOptions,TOKEN_FWDSLASH1);
|
|
lstrcat(szBootOptions,szTmpString);
|
|
}
|
|
else
|
|
{
|
|
lstrcpy(szBootOptions,TOKEN_NA);
|
|
}
|
|
DynArraySetString2( arrResults,dwRow ,COL3,szBootOptions,0 );
|
|
|
|
}
|
|
|
|
DISPLAY_MESSAGE(stdout,OS_HEADER);
|
|
DISPLAY_MESSAGE(stdout,DASHES_OS);
|
|
|
|
ShowResults(MAX_COLUMNS, ResultHeader, dwFormatType,arrResults ) ;
|
|
|
|
// Closing the boot.ini stream and destroying the dynamic arrays.
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootLoader);
|
|
DestroyDynamicArray(&arrKeyValuePairs);
|
|
SAFECLOSE(stream);
|
|
bRes = resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
}
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function gets all the keys present in the specified section of
|
|
an .ini file and then returns the dynamic array containing all the
|
|
keys
|
|
|
|
Arguments:
|
|
[in] sziniFile : Name of the ini file.
|
|
[in] szinisection : Name of the section in the boot.ini.
|
|
|
|
|
|
Return Value :
|
|
TARRAY ( pointer to the dynamic array )
|
|
******************************************************************************/
|
|
|
|
TARRAY getKeysOfINISection( LPTSTR sziniFile, LPTSTR sziniSection )
|
|
{
|
|
|
|
// Dynamic array which will hold all the keys
|
|
TARRAY arrKeys = NULL;
|
|
|
|
// Number of characters returned by the GetPrivateProfileString function
|
|
DWORD len = 0 ;
|
|
|
|
// Variables used in the loop
|
|
DWORD i = 0 ;
|
|
DWORD j = 0 ;
|
|
|
|
// Buffer which will be populated by the GetPrivateProfileString function
|
|
|
|
|
|
LPTSTR inBuf = NULL ;
|
|
DWORD dwLength = MAX_STRING_LENGTH1;
|
|
|
|
// Temporary variable which will contain the individual keys
|
|
|
|
LPTSTR szTemp = NULL ;
|
|
|
|
inBuf = (LPTSTR)malloc(dwLength*sizeof(TCHAR));
|
|
if(inBuf==NULL)
|
|
{
|
|
return NULL ;
|
|
}
|
|
|
|
szTemp = (LPTSTR)malloc(dwLength*sizeof(TCHAR));
|
|
if((szTemp == NULL))
|
|
{
|
|
SAFEFREE(inBuf);
|
|
return NULL ;
|
|
}
|
|
|
|
memset(inBuf,0,dwLength);
|
|
memset(szTemp,0,dwLength);
|
|
|
|
while(1)
|
|
{
|
|
// Getting all the keys from the boot.ini file
|
|
len = GetPrivateProfileString (sziniSection,
|
|
NULL,
|
|
ERROR_PROFILE_STRING,
|
|
inBuf,
|
|
dwLength,
|
|
sziniFile);
|
|
|
|
|
|
//if the size of the string is not sufficient then increment the size.
|
|
if(len == dwLength-2)
|
|
{
|
|
dwLength +=100 ;
|
|
inBuf = (LPTSTR)realloc(inBuf,dwLength*sizeof(TCHAR));
|
|
if(inBuf == NULL)
|
|
{
|
|
SAFEFREE(inBuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
|
|
szTemp = (LPTSTR)realloc(szTemp,dwLength*sizeof(TCHAR));
|
|
if(szTemp == NULL)
|
|
{
|
|
SAFEFREE(inBuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
}
|
|
else
|
|
break ;
|
|
}
|
|
|
|
// Creating a dynamic array by using the function in the DynArray.c module.
|
|
// This dynamic array will contain all the keys.
|
|
arrKeys = CreateDynamicArray();
|
|
if(arrKeys == NULL)
|
|
{
|
|
SAFEFREE(inBuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
|
|
// Looping through the characters returned by the above function
|
|
while(i<len)
|
|
{
|
|
|
|
// Each individual key will be got in arrTest array
|
|
szTemp[ j++ ] = inBuf[ i ];
|
|
if( inBuf[ i ] == TOKEN_DELIM )
|
|
{
|
|
// Setting j to 0 to start the next key.
|
|
j = 0;
|
|
|
|
// Appending each key to the dynamic array
|
|
DynArrayAppendString( arrKeys, szTemp, 0 );
|
|
if(lstrlen(szTemp)==0)
|
|
{
|
|
SAFEFREE(inBuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
}
|
|
|
|
// Incrementing loop variable
|
|
i++;
|
|
}
|
|
|
|
SAFEFREE(inBuf);
|
|
SAFEFREE(szTemp);
|
|
// returning the dynamic array containing all the keys
|
|
return arrKeys;
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function gets all the key-value pairs of the [operating systems]
|
|
section and returns a dynamic array containing all the key-value pairs
|
|
|
|
Arguments:
|
|
[in] sziniFile : Name of the ini file.
|
|
[in] szinisection : Name of the section in the boot.ini.
|
|
|
|
|
|
Return Value :
|
|
TARRAY ( pointer to the dynamic array )
|
|
******************************************************************************/
|
|
TARRAY getKeyValueOfINISection( LPTSTR iniFile, LPTSTR sziniSection )
|
|
{
|
|
|
|
// Dynamic array which will hold all the key-value pairs
|
|
TARRAY arrKeyValue = NULL;
|
|
|
|
// Number of characters returned by the GetPrivateProfileSection function
|
|
DWORD len = 0;
|
|
|
|
// Variables used in the loop
|
|
DWORD i = 0 ;
|
|
DWORD j = 0 ;
|
|
|
|
LPTSTR inbuf = NULL;
|
|
|
|
// Buffer which will be populated by the GetPrivateProfileSection function
|
|
|
|
|
|
// Temporary variable which will contain the individual keys
|
|
LPTSTR szTemp = NULL ;
|
|
|
|
DWORD dwLength = MAX_STRING_LENGTH1 ;
|
|
|
|
// Initialising loop variables
|
|
i = 0;
|
|
j = 0;
|
|
|
|
//return NULL if failed to allocate memory.
|
|
inbuf = (LPTSTR)malloc(dwLength*sizeof(TCHAR));
|
|
if(inbuf==NULL)
|
|
{
|
|
return NULL ;
|
|
}
|
|
|
|
//return NULL if failed to allocate memory
|
|
szTemp = (LPTSTR)malloc(dwLength*sizeof(TCHAR));
|
|
if(szTemp == NULL)
|
|
{
|
|
SAFEFREE(inbuf);
|
|
return NULL ;
|
|
}
|
|
|
|
memset(inbuf,0,dwLength);
|
|
|
|
while(1)
|
|
{
|
|
|
|
// Getting all the key-value pairs from the boot.ini file
|
|
len = GetPrivateProfileSection (sziniSection, inbuf,dwLength, iniFile);
|
|
|
|
if(len == dwLength -2)
|
|
{
|
|
dwLength +=100 ;
|
|
|
|
inbuf = (LPTSTR)realloc(inbuf,dwLength*sizeof(TCHAR));
|
|
szTemp = (LPTSTR)realloc(szTemp,dwLength*sizeof(TCHAR));
|
|
if((inbuf== NULL)||(szTemp==NULL))
|
|
{
|
|
SAFEFREE(inbuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
break ;
|
|
}
|
|
|
|
|
|
inbuf[lstrlen(inbuf)] = '\0';
|
|
|
|
// Creating a dynamic array by using the function in the DynArray.c module.
|
|
// This dynamic array will contain all the key-value pairs.
|
|
arrKeyValue = CreateDynamicArray();
|
|
if(arrKeyValue == NULL)
|
|
{
|
|
SAFEFREE(inbuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
|
|
// Looping through the characters returned by the above function
|
|
while(i<len)
|
|
{
|
|
// Each individual key will be got in arrTest array
|
|
szTemp[ j++ ] = inbuf[ i ];
|
|
if( inbuf[ i ] == TOKEN_DELIM)
|
|
{
|
|
szTemp[j+1] = '\0';
|
|
|
|
// Setting j to 0 to start the next key.
|
|
j = 0;
|
|
|
|
// Appending each key-value to the dynamic array
|
|
DynArrayAppendString( arrKeyValue, szTemp, 0 );
|
|
if(lstrlen(szTemp)==0)
|
|
{
|
|
SAFEFREE(inbuf);
|
|
SAFEFREE(szTemp);
|
|
return NULL ;
|
|
}
|
|
|
|
}
|
|
|
|
// Incrementing loop variable
|
|
i++;
|
|
}
|
|
|
|
// returning the dynamic array containing all the key-value pairs
|
|
SAFEFREE(inbuf);
|
|
SAFEFREE(szTemp);
|
|
return arrKeyValue;
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function deletes a key from an ini section of an ini file
|
|
|
|
Arguments:
|
|
[in] szKey : Name of the key which has to be deleted
|
|
from the given section present in the
|
|
given ini file
|
|
[in] sziniFile : Name of the ini file.
|
|
[in] szinisection : Name of the section in the boot.ini.
|
|
|
|
Return Value :
|
|
BOOL (TRUE if there is no error, else the value is FALSE)
|
|
******************************************************************************/
|
|
|
|
BOOL deleteKeyFromINISection( LPTSTR szKey, LPTSTR sziniFile, LPTSTR sziniSection )
|
|
{
|
|
// If the third parameter (default value) is NULL, the key pointed to by
|
|
// the key parameter is deleted from the specified section of the specified
|
|
// INI file
|
|
if( WritePrivateProfileString( sziniSection, szKey, NULL, sziniFile ) == 0 )
|
|
{
|
|
// If there is an error while writing then return false
|
|
return FALSE;
|
|
}
|
|
|
|
// If there is no error, then return true
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function removes a sub-string from a string
|
|
|
|
Arguments:
|
|
[in] szString : Main string
|
|
[in] szSubString : Sub-string
|
|
|
|
Return Value :
|
|
VOID
|
|
******************************************************************************/
|
|
|
|
VOID removeSubString( LPTSTR szString, LPCTSTR szSubString )
|
|
{
|
|
|
|
TCHAR szFinalStr[MAX_STRING_LENGTH1] = NULL_STRING ;
|
|
|
|
|
|
DWORD dwSize = 1;
|
|
TCHAR sep[] = TOKEN_EMPTYSPACE;
|
|
|
|
PTCHAR pszToken = NULL_STRING;
|
|
|
|
// Character space is used for tokenising
|
|
lstrcpy( sep, _T(" ") );
|
|
|
|
// Getting the first token
|
|
pszToken = _tcstok( szString, sep );
|
|
while( pszToken != NULL )
|
|
{
|
|
// If the token is equal to the sub-string, then the token
|
|
// is not added to the final string. The final string contains
|
|
// all the tokens except the sub-string specified.
|
|
if(lstrcmpi( pszToken, szSubString ) != 0 )
|
|
{
|
|
lstrcpy( szFinalStr + dwSize - 1, TOKEN_EMPTYSPACE);
|
|
lstrcpy( szFinalStr + dwSize, pszToken );
|
|
dwSize = dwSize + lstrlen(pszToken) + 1;
|
|
}
|
|
|
|
// Getting the next token
|
|
pszToken = _tcstok( NULL, sep );
|
|
}
|
|
|
|
lstrcpy(szString,szFinalStr);
|
|
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function establishes a connection to the specified system with
|
|
the given credentials.
|
|
Arguments:
|
|
[in] szServer : server name to coonect to
|
|
[in] szUser : User Name
|
|
[in] szPassword : password
|
|
[in] bNeedPwd : Boolean for asking the password.
|
|
[in] szPath : path of the ini file .
|
|
|
|
Return Value :
|
|
BOOL (EXIT_SUCCESS if there is no error, else the value is EXIT_FAILURE)
|
|
******************************************************************************/
|
|
|
|
BOOL openConnection( STRING256 szServer, STRING256 szUser,STRING256 szPassword,
|
|
STRING100 szPath,BOOL bNeedPwd,FILE *stream,PBOOL pbConnFlag)
|
|
{
|
|
|
|
|
|
|
|
// Declaring the file path string which will hold the path of boot.ini file
|
|
TCHAR filePath[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
// Loop variable
|
|
DWORD i = 0;
|
|
|
|
// Position of the character we are searching for
|
|
#ifndef _WIN64
|
|
DWORD dwPos = 0;
|
|
#else
|
|
__int64 dwPos = 0;
|
|
#endif
|
|
|
|
// Boolean variable which will keep trach whether boot.ini file is present in
|
|
// any drive of a system or not
|
|
BOOL bFound = FALSE;
|
|
|
|
DWORD dwRetVal = 0 ;
|
|
|
|
|
|
// All the possible drive letters in a system
|
|
// A and B are removed, since they are assigned for floppy disk drives.
|
|
TCHAR szDrives[] = { DRIVE_C, DRIVE_D, DRIVE_E, DRIVE_F, DRIVE_G, DRIVE_H, DRIVE_I, DRIVE_J,DRIVE_K, DRIVE_L,
|
|
DRIVE_M, DRIVE_N, DRIVE_O, DRIVE_P,DRIVE_Q,DRIVE_R,DRIVE_S,DRIVE_T,DRIVE_U,
|
|
DRIVE_V,DRIVE_W,DRIVE_X,DRIVE_Y,DRIVE_Z};
|
|
|
|
// Pointer to the first occurence of the character '$'
|
|
TCHAR *pdest = NULL;
|
|
|
|
BOOL bResult = FALSE;
|
|
INT nRetVal = 0;
|
|
*pbConnFlag = TRUE ;
|
|
|
|
if( lstrcmpi(szServer, NULL_STRING) != 0 )
|
|
{
|
|
|
|
//bResult = EstablishConnection(szServer,szUser,SIZE_OF_ARRAY(szUser),szPassword,SIZE_OF_ARRAY(szPassword),bNeedPwd);
|
|
bResult = EstablishConnection(szServer,szUser,256,szPassword,SIZE_OF_ARRAY(szPassword),bNeedPwd);
|
|
|
|
if (bResult == FALSE)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,ERROR_TAG );
|
|
DISPLAY_MESSAGE( stderr, GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
else
|
|
{
|
|
switch( GetLastError() )
|
|
{
|
|
case I_NO_CLOSE_CONNECTION:
|
|
*pbConnFlag = FALSE ;
|
|
break;
|
|
|
|
case E_LOCAL_CREDENTIALS:
|
|
case ERROR_SESSION_CREDENTIAL_CONFLICT:
|
|
{
|
|
*pbConnFlag = FALSE ;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Building the file path of boot.ini file
|
|
// File Path is in \\server\C$\boot.ini format.
|
|
// Right now assuming that boot.ini file is in C Drive
|
|
lstrcpy(filePath, TOKEN_BACKSLASH4);
|
|
lstrcat(filePath, szServer);
|
|
lstrcat(filePath, TOKEN_BACKSLASH2);
|
|
lstrcat(filePath, TOKEN_C_DOLLAR);
|
|
lstrcat(filePath, TOKEN_BACKSLASH2);
|
|
lstrcat(filePath, TOKEN_BOOTINI_PATH);
|
|
lstrcpy(szPath, filePath);
|
|
|
|
// Finding the drive containing the boot.ini file
|
|
// For remote computer the path will be in the format
|
|
// \\MACHINE\DRIVELETTER$\boot.ini
|
|
while( i < 25 )
|
|
{
|
|
pdest = _tcschr(filePath, TOKEN_DOLLAR);
|
|
if (pdest==NULL)
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
dwPos = pdest - filePath ;
|
|
filePath[dwPos - 1] = szDrives[i];
|
|
|
|
stream = _tfopen(filePath,READ_MODE);
|
|
|
|
// If the boot.ini is found
|
|
if( stream != NULL )
|
|
{
|
|
bFound = TRUE;
|
|
fclose(stream);
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
lstrcpy(filePath, TOKEN_PATH);
|
|
// Finding the drive containing the boot.ini file
|
|
// For local computer the path will be in the format
|
|
// DRIVELETTER:\boot.ini
|
|
while( i < 25 )
|
|
{
|
|
pdest = _tcschr(filePath,_T(':'));
|
|
if (pdest==NULL)
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
dwPos = pdest - filePath + 1;
|
|
filePath[dwPos - 2] = szDrives[i];
|
|
|
|
stream = _tfopen(filePath, READ_MODE);
|
|
|
|
// If the boot.ini is found
|
|
if(stream != NULL )
|
|
{
|
|
fclose(stream);
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
}
|
|
|
|
// If boot.ini is not found in any drives, then display error message
|
|
if( bFound == FALSE )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_BOOTINI));
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
nRetVal = _tchmod(filePath, _S_IREAD | _S_IWRITE);
|
|
// Changing the file permissions of the boot.ini file
|
|
if( nRetVal != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_READWRITE_BOOTINI));
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
else if (nRetVal == -1)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_FILE));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// Open the Boot.ini file with both read and write mode
|
|
// If there is no error in opening the file, then return success
|
|
// of the boot.ini file to the calling function
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches 64 bit Delete Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
void displayDeleteUsage_IA64()
|
|
{
|
|
DWORD dwIndex = ID_DEL_HELP_IA64_BEGIN;
|
|
for(;dwIndex <= ID_DEL_HELP_IA64_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches 32 bit Delete Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
void displayDeleteUsage_X86()
|
|
{
|
|
DWORD dwIndex = ID_DEL_HELP_BEGIN;
|
|
for(;dwIndex <= ID_DEL_HELP_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches 64 bit Copy Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayCopyUsage_IA64()
|
|
{
|
|
DWORD dwIndex = ID_COPY_HELP_IA64_BEGIN;
|
|
for(;dwIndex <=ID_COPY_HELP_IA64_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches 32 bit Copy Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayCopyUsage_X86()
|
|
{
|
|
DWORD dwIndex = ID_COPY_HELP_BEGIN;
|
|
for(;dwIndex <=ID_COPY_HELP_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches Query Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayQueryUsage()
|
|
{
|
|
#ifdef _WIN64
|
|
displayQueryUsage_IA64();
|
|
#else
|
|
displayQueryUsage_X86();
|
|
#endif
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches Query Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayQueryUsage_IA64()
|
|
{
|
|
DWORD dwIndex = ID_QUERY_HELP64_BEGIN ;
|
|
|
|
for(;dwIndex <= ID_QUERY_HELP64_END ;dwIndex++ )
|
|
{
|
|
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches Query Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayQueryUsage_X86()
|
|
{
|
|
DWORD dwIndex = ID_QUERY_HELP_BEGIN ;
|
|
|
|
for(;dwIndex <= ID_QUERY_HELP_END;dwIndex++ )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches Main Usage information from resource file and displays it
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
DWORD displayMainUsage_X86()
|
|
{
|
|
|
|
TCHAR szServer[MAX_RES_STRING] = NULL_STRING ;
|
|
DWORD dwRetVal = 0;
|
|
|
|
DWORD dwIndex = ID_MAIN_HELP_BEGIN1 ;
|
|
|
|
//display the error message if the target system is a 64 bit system or if error occured in
|
|
//retreiving the information
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
for(;dwIndex <= ID_MAIN_HELP_END1 ;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function fetches Usage information for the 64 bit system
|
|
//
|
|
// Arguments:
|
|
// None
|
|
//
|
|
// Return Value:
|
|
// void
|
|
// ***************************************************************************
|
|
VOID displayMainUsage_IA64()
|
|
{
|
|
DWORD dwIndex = ID_MAIN_HELP_IA64_BEGIN ;
|
|
|
|
for(;dwIndex <= ID_MAIN_HELP_IA64_END ;dwIndex++)
|
|
{
|
|
if( (dwIndex == IDS_MAIN_HELP23_IA64 ) || (dwIndex == IDS_MAIN_HELP24_IA64) || (dwIndex == IDS_MAIN_HELP38_IA64) )
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function resets the permissions with the original set of
|
|
permissions ( -readonly -hidden -system )
|
|
and then exits with the given exit code.
|
|
|
|
Arguments
|
|
[in] szFilePath : File Path of the boot.ini file
|
|
|
|
|
|
Return Value :
|
|
BOOL (EXIT_SUCCESS if there is no error, else the value is EXIT_FAILURE)
|
|
******************************************************************************/
|
|
|
|
BOOL resetFileAttrib( LPTSTR szFilePath )
|
|
{
|
|
if(szFilePath==NULL)
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
// Resetting the file permission of the boot.ini file to its original
|
|
// permission list( -r, -h, -s )
|
|
if( _tchmod(szFilePath, _S_IREAD != 0 ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_RESET_ERROR));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
Routine Description:
|
|
This function returns a string from a dynamic array .
|
|
|
|
Arguments
|
|
[in] arrKeyValuePairs : Dynamic array which contains all the
|
|
key-value pairs.
|
|
[out] szFiinalStr : String which is formed from all the key-value pairs
|
|
|
|
Return Value :
|
|
BOOL (EXIT_SUCCESS if there is no error, else the value is EXIT_FAILURE)
|
|
******************************************************************************/
|
|
|
|
BOOL stringFromDynamicArray1( TARRAY arrKeyValuePairs ,LPTSTR szFinalStr )
|
|
{
|
|
|
|
// Total number of elements in the array
|
|
DWORD dwKeyValueCount = 0;
|
|
|
|
// Variable used to keep track the current position while appending strings.
|
|
DWORD dwStrSize = 0;
|
|
|
|
|
|
// Loop variable
|
|
DWORD i = 0;
|
|
|
|
// Initialsing size and loop variables to 0
|
|
dwStrSize = 0;
|
|
i = 0;
|
|
|
|
if( (arrKeyValuePairs ==NULL)||(szFinalStr==NULL))
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// Getting the total number of key-value pairs
|
|
|
|
if(arrKeyValuePairs != NULL)
|
|
{
|
|
dwKeyValueCount = DynArrayGetCount(arrKeyValuePairs);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE) ;
|
|
}
|
|
|
|
// Looping through all the key-value pairs and building the final string
|
|
// containing all the key value pairs. This string has to be passed to
|
|
// WriteProfileSection
|
|
while( (i <= dwKeyValueCount - 1 )&& (arrKeyValuePairs != NULL) )
|
|
{
|
|
// Building the final string, by getting each key-value pair present in the
|
|
// dynamic array
|
|
if(arrKeyValuePairs != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arrKeyValuePairs, i ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
lstrcpy(szFinalStr + dwStrSize, pwsz );
|
|
dwStrSize = dwStrSize + lstrlen(pwsz) + 1;
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This function is used to build the header and also display the
|
|
// result in the required format as specified by the user.
|
|
//
|
|
// Arguments:
|
|
// [ in ] arrResults : argument(s) count specified at the command prompt
|
|
// [ in ] dwFormatType : format flags
|
|
// [ in ] bHeader : Boolean for specifying if the header is required or not.
|
|
//
|
|
// Return Value:
|
|
// none
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID FormHeader(BOOL bHeader,TCOLUMNS *ResultHeader,BOOL bVerbose)
|
|
{
|
|
|
|
|
|
//OS Entry
|
|
ResultHeader[COL0].dwWidth = COL_BOOTOPTION_WIDTH ;
|
|
ResultHeader[COL0].dwFlags = SR_TYPE_STRING;
|
|
ResultHeader[COL0].pFunction = NULL;
|
|
ResultHeader[COL0].pFunctionData = NULL;
|
|
lstrcpy( ResultHeader[COL0].szFormat, NULL_STRING );
|
|
lstrcpy( ResultHeader[COL0].szColumn,COL_BOOTOPTION );
|
|
|
|
|
|
ResultHeader[COL1].dwWidth = COL_FRIENDLYNAME_WIDTH;
|
|
ResultHeader[COL1].dwFlags = SR_TYPE_STRING;
|
|
ResultHeader[COL1].pFunction = NULL;
|
|
ResultHeader[COL1].pFunctionData = NULL;
|
|
lstrcpy( ResultHeader[COL1].szFormat, NULL_STRING );
|
|
lstrcpy( ResultHeader[COL1].szColumn,COL_FRIENDLYNAME );
|
|
|
|
|
|
ResultHeader[COL2].dwWidth = COL_ARC_WIDTH;
|
|
ResultHeader[COL2].dwFlags = SR_TYPE_STRING;
|
|
ResultHeader[COL2].pFunction = NULL;
|
|
ResultHeader[COL2].pFunctionData = NULL;
|
|
lstrcpy( ResultHeader[COL2].szFormat, NULL_STRING );
|
|
lstrcpy( ResultHeader[COL2].szColumn,COL_ARCPATH );
|
|
|
|
ResultHeader[COL3].dwWidth = COL_BOOTID_WIDTH;
|
|
ResultHeader[COL3].dwFlags = SR_TYPE_STRING;
|
|
ResultHeader[COL3].pFunction = NULL;
|
|
ResultHeader[COL3].pFunctionData = NULL;
|
|
lstrcpy( ResultHeader[COL3].szFormat, NULL_STRING );
|
|
lstrcpy( ResultHeader[COL3].szColumn,COL_BOOTID );
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to display the current boot.ini file settings for
|
|
// the specified system.
|
|
//
|
|
// Arguments:
|
|
// [ in ] argc : Number of command line arguments
|
|
// [ in ] argv : Array containing command line arguments
|
|
|
|
// Return Value:
|
|
// DWORD
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD AppendRawString( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bRaw = FALSE ;
|
|
|
|
DWORD dwId = 0;
|
|
DWORD dwDefault = 0;
|
|
|
|
TARRAY arr ;
|
|
|
|
TCHAR szkey[MAX_RES_STRING] = NULL_STRING;
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
STRING256 szRawString = NULL_STRING ;
|
|
|
|
DWORD dwNumKeys = 0;
|
|
BOOL bRes = FALSE ;
|
|
PTCHAR pToken = NULL ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bFlag = FALSE ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
BOOL bAppendFlag = FALSE ;
|
|
TCHAR szErrorMsg[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
// Building the TCMDPARSER structure
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_RAW, CP_MAIN_OPTION, 1, 0,&bRaw, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY | CP_MANDATORY, 1, 0, &dwDefault, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_DEFAULT, CP_DEFAULT | CP_TYPE_TEXT | CP_MANDATORY, 1, 0, &szRawString,NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_APPEND , 0, 1, 0, &bAppendFlag,NULL_STRING, NULL, NULL }
|
|
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
szFinalStr = (TCHAR*) malloc(MAX_STRING_LENGTH1* sizeof(TCHAR) );
|
|
if (szFinalStr== NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TAG));
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying query usage if user specified -? with -query option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayRawUsage_X86();
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_SUCCESS);
|
|
}
|
|
else
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
// error checking in case the
|
|
// raw string does not start with a "/" .
|
|
if(*szRawString != _T('/'))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_FWDSLASH));
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag );
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Getting the keys of the Operating system section in the boot.ini file
|
|
arr = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
|
|
if(arr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Getting the total number of keys in the operating systems section
|
|
dwNumKeys = DynArrayGetCount(arr);
|
|
|
|
//
|
|
if((dwNumKeys >= MAX_BOOTID_VAL)&&(dwDefault >= MAX_BOOTID_VAL ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAX_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Displaying error message if the number of keys is less than the OS entry
|
|
// line number specified by the user
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwNumKeys ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Getting the key of the OS entry specified by the user
|
|
if (arr != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arr, dwDefault - 1 ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
_tcscpy( szkey,pwsz);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if(bAppendFlag == FALSE)
|
|
{
|
|
pToken = _tcstok(szkey ,TOKEN_FWDSLASH1);
|
|
if(pToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
|
|
lstrcat(szkey , TOKEN_EMPTYSPACE);
|
|
CharLower(szRawString);
|
|
lstrcat(szkey ,szRawString);
|
|
|
|
if( _tcslen(szkey) >= MAX_RES_STRING)
|
|
{
|
|
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
DynArrayRemove(arr, dwDefault - 1 );
|
|
DynArrayInsertString(arr, dwDefault - 1, szkey, MAX_RES_STRING);
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
|
|
if (stringFromDynamicArray1( arr,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_ADD), dwDefault );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_ADD_SWITCHES));
|
|
DestroyDynamicArray(&arr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//reset the file attributes and free the memory and close the connection to the server.
|
|
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to display the current boot.ini file settings for
|
|
// the specified system.
|
|
//
|
|
// Arguments:
|
|
// none
|
|
// Return Value:
|
|
// VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayRawUsage_X86()
|
|
{
|
|
|
|
DWORD dwIndex = RAW_HELP_BEGIN;
|
|
for(;dwIndex <= RAW_HELP_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Display the help for the 64 bit raw option.
|
|
//
|
|
// Arguments:
|
|
// none
|
|
// Return Value:
|
|
// VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayRawUsage_IA64()
|
|
{
|
|
|
|
DWORD dwIndex = RAW_HELP_IA64_BEGIN;
|
|
for(;dwIndex <= RAW_HELP_IA64_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to change the timout of the boot.ini file settings for
|
|
// the specified system.
|
|
// Arguments:
|
|
// [in ] argc : Number of command line arguments
|
|
// [in ] argv : Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD ChangeTimeOut(DWORD argc,LPCTSTR argv[])
|
|
{
|
|
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
|
|
BOOL bNeedPwd = FALSE ;
|
|
TARRAY arrResults;
|
|
BOOL bRes= FALSE ;
|
|
DWORD dwCount = 0;
|
|
DWORD dwTimeOut = 0 ;
|
|
BOOL bFlag = 0 ;
|
|
TCHAR timeOutstr[STRING20] = NULL_STRING;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_TIMEOUT, CP_MAIN_OPTION | CP_TYPE_UNUMERIC | CP_VALUE_OPTIONAL|CP_VALUE_MANDATORY, 1, 0,&dwTimeOut,NULL_STRING, NULL, NULL},
|
|
{ SWITCH_SERVER,CP_TYPE_TEXT|CP_VALUE_MANDATORY,1,0,&szServer,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
if( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if( (cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
//display a warning message if it is a local system and set the server name to empty.
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
arrResults = CreateDynamicArray();
|
|
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
resetFileAttrib(szPath);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
dwCount = DynArrayGetCount(arrResults);
|
|
|
|
if(dwTimeOut > TIMEOUT_MAX)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_TIMEOUT_RANGE));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Converting the numeric value to string because the WritePrivateProfileString
|
|
// takes only string value as the value for a particular key
|
|
_itot( dwTimeOut, timeOutstr, 10 );
|
|
|
|
// Changing the timeout value
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION,TIMEOUT_SWITCH,
|
|
timeOutstr, szPath ) != 0 )
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_TIMEOUT_CHANGE));
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
// DISPLAY Error message and exit with Error code of 1.
|
|
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TIMEOUT));
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Display the help for the timeout option.
|
|
// Arguments:
|
|
// NONE.
|
|
// Return Value:
|
|
// VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
|
|
VOID displayTimeOutUsage_X86()
|
|
{
|
|
DWORD dwIndex = TIMEOUT_HELP_BEGIN;
|
|
|
|
|
|
for(;dwIndex <= TIMEOUT_HELP_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Display the help for the 64 BIT timeout option.
|
|
// Arguments:
|
|
// NONE.
|
|
// Return Value:
|
|
// VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayTimeOutUsage_IA64()
|
|
{
|
|
DWORD dwIndex = TIMEOUT_HELP_IA64_BEGIN;
|
|
|
|
|
|
for(;dwIndex <= TIMEOUT_HELP_IA64_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to change the Default OS boot.ini file settings for
|
|
// the specified system.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD ChangeDefaultOs(DWORD argc,LPCTSTR argv[])
|
|
{
|
|
|
|
STRING256 szServer = NULL_STRING ;
|
|
STRING256 szUser = NULL_STRING ;
|
|
STRING256 szPassword = NULL_STRING ;
|
|
|
|
DWORD dwId = 0;
|
|
BOOL bDefaultOs = FALSE ;
|
|
|
|
|
|
STRING100 szPath ;
|
|
FILE *stream = NULL;
|
|
BOOL bNeedPwd = FALSE ;
|
|
TARRAY arrResults ;
|
|
DWORD dwCount = 0;
|
|
BOOL bFlag = FALSE ;
|
|
PTCHAR psztok = NULL ;
|
|
|
|
TCHAR szTmp[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szTmpBootId[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szDefaultId[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
DWORD dwValue = 0 ;
|
|
BOOL bExitFlag = FALSE ;
|
|
LPCWSTR pwsz[MAX_RES_STRING] ;
|
|
LPCWSTR pwszBootId [MAX_RES_STRING] ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
BOOL bRes = FALSE;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_DEFAULTOS, CP_MAIN_OPTION, 1, 0,&bDefaultOs, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER,CP_TYPE_TEXT|CP_VALUE_MANDATORY,1,0,&szServer,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID,CP_TYPE_NUMERIC | CP_VALUE_MANDATORY| CP_MANDATORY, 1, 0, &dwId, NULL_STRING, NULL, NULL }
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
if( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if(dwId <= 0)
|
|
{
|
|
SetReason(GetResString( IDS_INVALID_OSID));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
arrResults = CreateDynamicArray();
|
|
//return failure if failed to allocate memory
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
arrResults = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
dwCount = DynArrayGetCount(arrResults);
|
|
if(dwId<=0 || dwId > dwCount )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_OSID));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if(arrResults !=NULL)
|
|
{
|
|
pwsz[0] = DynArrayItemAsString(arrResults, dwId - 1);
|
|
pwszBootId[0] = DynArrayItemAsString(arrResults, 0);
|
|
if( (pwsz != NULL) || (pwszBootId != NULL) )
|
|
{
|
|
lstrcpy(szTmp,pwsz[0]) ;
|
|
lstrcpy(szDefaultId,pwsz[0]);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
szFinalStr = (LPTSTR)malloc(MAX_STRING_LENGTH1*sizeof(TCHAR));
|
|
if(szFinalStr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//loop through all the Boot entries and
|
|
for(dwValue = dwId -1 ; dwValue > 0 ; dwValue-- )
|
|
{
|
|
pwszBootId[dwValue] = DynArrayItemAsString(arrResults,dwValue );
|
|
pwsz[dwValue] = DynArrayItemAsString(arrResults, dwValue - 1);
|
|
|
|
DynArrayRemove(arrResults, dwValue );
|
|
if (pwsz[dwValue] != NULL)
|
|
{
|
|
lstrcpy(szTmpBootId,pwsz[dwValue]) ;
|
|
}
|
|
else
|
|
{
|
|
bExitFlag = TRUE ;
|
|
break ;
|
|
}
|
|
DynArrayInsertString(arrResults, dwValue, szTmpBootId, MAX_RES_STRING);
|
|
}
|
|
|
|
if (bExitFlag == TRUE )
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
DynArrayRemove(arrResults, 0 );
|
|
DynArrayInsertString(arrResults, 0, szDefaultId, MAX_RES_STRING);
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
if(stringFromDynamicArray1( arrResults,szFinalStr) == EXIT_FAILURE )
|
|
{
|
|
bExitFlag = TRUE ;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( ( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) == 0 ) || (bExitFlag == TRUE ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERR_CHANGE));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//to strip of the unwanted string from the string and save the required part in the Boot Loader section.
|
|
szToken = _tcstok(szTmp,TOKEN_EQUAL);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION, KEY_DEFAULT, szTmp,
|
|
szPath ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_DEF_CHANGE));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERR_CHANGE));
|
|
DestroyDynamicArray(&arrResults);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
return bRes ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the default entry option (x86).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayChangeOSUsage_X86()
|
|
{
|
|
DWORD dwIndex = DEFAULT_BEGIN;
|
|
|
|
|
|
for(;dwIndex <=DEFAULT_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the default entry option (IA64).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayDefaultEntryUsage_IA64()
|
|
{
|
|
DWORD dwIndex = DEFAULT_IA64_BEGIN;
|
|
|
|
for(;dwIndex <=DEFAULT_IA64_END;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Implement the Debug switch.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.)
|
|
//
|
|
// ***************************************************************************
|
|
DWORD ProcessDebugSwitch( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bDebug = FALSE ;
|
|
|
|
DWORD dwId = 0;
|
|
TARRAY arrResults ;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
TCHAR szDebug[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szPort[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szBoot[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
BOOL bRes = FALSE ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bFlag = FALSE ;
|
|
|
|
DWORD dwBaudRate = 0 ;
|
|
DWORD dwCount = 0 ;
|
|
DWORD dwSectionFlag = 0 ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szTmpBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szBaudRate[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
TCHAR szString[MAX_STRING_LENGTH1] = NULL_STRING ;
|
|
|
|
TCHAR szTemp[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
_TCHAR *szValues[2] = {NULL};
|
|
|
|
TCHAR szMessage[MAX_STRING_LENGTH] = NULL_STRING;
|
|
|
|
TCHAR szErrorMsg[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
DWORD dwCode = 0 ;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
// Building the TCMDPARSER structure
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_DEBUG, CP_MAIN_OPTION, 1, 0,&bDebug, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY | CP_MANDATORY, 1, 0, &dwId, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PORT, CP_TYPE_TEXT | CP_VALUE_MANDATORY|CP_MODE_VALUES,1,0,&szPort,COM_PORT_RANGE,NULL,NULL},
|
|
{ SWITCH_BAUD, CP_TYPE_TEXT | CP_VALUE_MANDATORY |CP_MODE_VALUES,1,0,&szBaudRate,BAUD_RATE_VALUES_DEBUG,NULL,NULL},
|
|
{ CMDOPTION_DEFAULT, CP_DEFAULT | CP_TYPE_TEXT | CP_MANDATORY , 1, 0, &szDebug,NULL_STRING, NULL, NULL }
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
if(bUsage)
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayDebugUsage_X86();
|
|
return (EXIT_SUCCESS);
|
|
}else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
}
|
|
|
|
if(dwId <= 0)
|
|
{
|
|
SetReason(GetResString( IDS_INVALID_OSID));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
//display an error message if the server is empty.
|
|
if( (cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if( (cmdOptions[2].dwActuals!=0) && (lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//display an error message if the user specifies any string other than on,off,edit.
|
|
if( !( ( lstrcmpi(szDebug,VALUE_ON)== 0)|| (lstrcmpi(szDebug,VALUE_OFF)== 0) ||(lstrcmpi(szDebug,EDIT_STRING)== 0) ))
|
|
{
|
|
szValues[0]= (_TCHAR *)szDebug ;
|
|
szValues[1]= (_TCHAR *)CMDOPTION_DEBUG ;
|
|
|
|
FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
GetResString(IDS_OPTION_SNTAX_ERROR),0,MAKELANGID(LANG_NEUTRAL,
|
|
SUBLANG_DEFAULT),szMessage, MAX_STRING_LENGTH,(va_list*)szValues);
|
|
|
|
DISPLAY_MESSAGE(stderr,szMessage);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if( (lstrcmpi(szDebug,EDIT_STRING)== 0)&& (lstrlen(szPort)==0) && (lstrlen(szBaudRate)==0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_EDIT_SYNTAX));
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
|
|
arrResults = CreateDynamicArray();
|
|
|
|
//return failure if failed to allocate memory
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
// display a warning message if it is a local system and set the
|
|
// server name to empty.
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
lstrcpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
arrResults = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//getting the number of boot entries
|
|
dwCount = DynArrayGetCount(arrResults);
|
|
if(dwId<=0 || dwId > dwCount )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_OSID));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
lstrcpy(szString ,DynArrayItemAsString(arrResults, dwId - 1 ));
|
|
|
|
if(lstrlen(szString) == 0)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
// check if the user entered the value of debug as on and do accordingly
|
|
if( lstrcmpi(szDebug,VALUE_ON)== 0)
|
|
{
|
|
|
|
//display error message if the user specifies Baud rate with out specifying COM port.
|
|
if((lstrlen(szPort)== 0) && (lstrlen(szBaudRate)!= 0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_DEBUG));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//check if the debug switch is already present and if so display a error message.
|
|
if( (_tcsstr(szString,DEBUG_SWITCH) != NULL ) && ( (lstrlen(szPort)== 0)&&(lstrlen(szBaudRate)== 0) ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_DEBUG));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
if(_tcsstr(szString,DEBUG_SWITCH) == NULL )
|
|
{
|
|
lstrcat(szString,TOKEN_EMPTYSPACE);
|
|
lstrcat(szString,DEBUG_SWITCH);
|
|
}
|
|
}
|
|
|
|
|
|
// get the type of the Com port present
|
|
dwCode = GetSubString(szString,TOKEN_DEBUGPORT,szTemp);
|
|
|
|
if((lstrlen(szTemp )!= 0)&& (lstrlen(szPort)!= 0))
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_ERROR_DUPLICATE_COM_PORT), dwId );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
// if the debug port is specified by the user.
|
|
if(lstrlen(szPort)!= 0)
|
|
{
|
|
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,REDIRECT_STRING,szBoot);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if(lstrlen(szBoot)!= 0)
|
|
{
|
|
if (lstrcmpi(szBoot,szPort)==0)
|
|
{
|
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_REDIRECT_PORT));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
lstrcat(szTmpBuffer,TOKEN_EMPTYSPACE);
|
|
lstrcat(szTmpBuffer,TOKEN_DEBUGPORT) ;
|
|
lstrcat(szTmpBuffer,TOKEN_EQUAL) ;
|
|
CharLower(szPort);
|
|
lstrcat(szTmpBuffer,szPort);
|
|
lstrcat(szString,szTmpBuffer);
|
|
}
|
|
|
|
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
|
|
//to add the Baud rate value specified by the user.
|
|
GetBaudRateVal(szString,szTemp) ;
|
|
|
|
|
|
if(lstrlen(szBaudRate)!=0)
|
|
{
|
|
if(lstrlen(szTemp )!= 0)
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_ERROR_DUPLICATE_BAUD_VAL), dwId );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}else
|
|
{
|
|
|
|
//forming the string to be concatenated to the BootEntry string
|
|
lstrcpy(szTemp,BAUD_RATE);
|
|
lstrcat(szTemp,TOKEN_EQUAL);
|
|
lstrcat(szTemp,szBaudRate);
|
|
|
|
//append the string containing the modified port value to the string
|
|
lstrcat(szString,TOKEN_EMPTYSPACE);
|
|
lstrcat(szString,szTemp);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
else if( lstrcmpi(szDebug,VALUE_OFF)== 0)
|
|
{
|
|
if((lstrlen(szPort)!= 0) || (lstrlen(szBaudRate)!= 0))
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_DEBUG));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if (_tcsstr(szString,DEBUG_SWITCH) == 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DEBUG_ABSENT));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
// remove the /debug switch.
|
|
removeSubString(szString,DEBUG_SWITCH);
|
|
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
|
|
// get the type of the Com port present
|
|
dwCode = GetSubString(szString,TOKEN_DEBUGPORT,szTemp);
|
|
if(lstrcmpi(szTemp,PORT_1394)==0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_1394_REMOVE));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// remove the /debugport=comport switch if it is present from the Boot Entry
|
|
if (lstrlen(szTemp )!= 0)
|
|
{
|
|
removeSubString(szString,szTemp);
|
|
}
|
|
|
|
lstrcpy(szTemp , NULL_STRING );
|
|
|
|
//remove the baud rate switch if it is present.
|
|
GetBaudRateVal(szString,szTemp) ;
|
|
if (lstrlen(szTemp )!= 0)
|
|
{
|
|
removeSubString(szString,szTemp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
// if the user enters the EDIT option
|
|
else if(lstrcmpi(szDebug,SWITCH_EDIT)== 0)
|
|
{
|
|
|
|
//display error message if the /debugport=1394 switch is present already.
|
|
if(_tcsstr(szString,DEBUGPORT_1394)!=0)
|
|
{
|
|
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_EDIT_1394_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if (_tcsstr(szString,DEBUG_SWITCH) == 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_ERROR_NO_DBG_SWITCH), dwId );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
dwCode = GetSubString(szString,TOKEN_DEBUGPORT,szTemp);
|
|
|
|
//display an error message if user is trying to add baudrate value
|
|
// when there is no COM port present in the boot options.
|
|
|
|
if( (lstrlen(szTemp)==0)&&(lstrlen(szPort)== 0)&&(lstrlen(szBaudRate)!= 0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_COM_PORT));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
// chk if the port has been spec by the user
|
|
|
|
if((lstrlen(szPort)== 0)&&(lstrlen(szBaudRate)== 0))
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_DEBUG));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
if(lstrlen(szPort)!= 0)
|
|
{
|
|
lstrcpy(szTemp , NULL_STRING );
|
|
|
|
// get the type of the Com port present
|
|
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
dwCode = GetSubString(szString,TOKEN_DEBUGPORT,szTemp);
|
|
|
|
|
|
//display error message if there is no COM port found at all in the OS option
|
|
//changed for displaying error
|
|
if(lstrlen(szTemp )== 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_ERROR_NO_COM_PORT), dwId );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
bRes = resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
// remove the /debugport=comport switch if it is present from the Boot Entry
|
|
removeSubString(szString,szTemp);
|
|
lstrcpy(szTemp,TOKEN_DEBUGPORT) ;
|
|
lstrcat(szTemp,TOKEN_EQUAL);
|
|
|
|
CharUpper(szPort) ;
|
|
lstrcat(szTemp,szPort);
|
|
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,REDIRECT_STRING,szBoot);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if(lstrlen(szBoot)!= 0)
|
|
{
|
|
if (lstrcmpi(szBoot,szPort)==0)
|
|
{
|
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_REDIRECT_PORT));
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//append the string containing the modified port value to the string
|
|
lstrcat(szString,TOKEN_EMPTYSPACE);
|
|
lstrcat(szString,szTemp);
|
|
|
|
}
|
|
|
|
//to edit the baud rate value
|
|
if(lstrlen(szBaudRate)!= 0)
|
|
{
|
|
|
|
lstrcpy(szTemp , NULL_STRING );
|
|
|
|
//remove the baud rate switch if it is present.
|
|
GetBaudRateVal(szString,szTemp) ;
|
|
|
|
// remove the swithc to be changed.
|
|
removeSubString(szString,szTemp);
|
|
|
|
//forming the string to be concatenated to the BootEntry string
|
|
lstrcpy(szTemp,BAUD_RATE);
|
|
lstrcat(szTemp,TOKEN_EQUAL);
|
|
lstrcat(szTemp,szBaudRate);
|
|
|
|
//append the string containing the modified port value to the string
|
|
lstrcat(szString,TOKEN_EMPTYSPACE);
|
|
lstrcat(szString,szTemp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//display an error message if the Os Load Options string is more than
|
|
// 254 characters in length.
|
|
if( _tcslen(szString) >= MAX_RES_STRING)
|
|
{
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
DynArrayRemove(arrResults, dwId - 1 );
|
|
DynArrayInsertString(arrResults, dwId - 1, szString, MAX_STRING_LENGTH1);
|
|
|
|
// Variable storing the path of boot.ini file
|
|
szFinalStr = (TCHAR*)malloc(MAX_STRING_LENGTH1* sizeof(TCHAR));
|
|
if (szFinalStr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
if (stringFromDynamicArray1( arrResults,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_CHANGE), dwId );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_ADD_SWITCHES));
|
|
DestroyDynamicArray(&arrResults);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
bRes = resetFileAttrib(szPath);
|
|
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
return (bRes) ;
|
|
}
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Get the Type of Baud Rate present in Boot Entry
|
|
//
|
|
// Parameters : szString : The String which is to be searched.
|
|
// szTemp : String which will get the com port type
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID GetBaudRateVal(LPTSTR szString, LPTSTR szTemp)
|
|
{
|
|
|
|
if(_tcsstr(szString,BAUD_VAL6)!=0)
|
|
{
|
|
lstrcpy(szTemp,BAUD_VAL6);
|
|
}
|
|
else if(_tcsstr(szString,BAUD_VAL7)!=0)
|
|
{
|
|
lstrcpy(szTemp,BAUD_VAL7);
|
|
}
|
|
else if(_tcsstr(szString,BAUD_VAL8)!=0)
|
|
{
|
|
lstrcpy(szTemp,BAUD_VAL8);
|
|
}
|
|
else if(_tcsstr(szString,BAUD_VAL9)!=0)
|
|
{
|
|
lstrcpy(szTemp,BAUD_VAL9);
|
|
}
|
|
else if(_tcsstr(szString,BAUD_VAL10)!=0)
|
|
{
|
|
lstrcpy(szTemp,BAUD_VAL10);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Implement the ProcessEmsSwitch switch.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.)
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD ProcessEmsSwitch( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bEms = FALSE ;
|
|
|
|
DWORD dwId = 0;
|
|
|
|
TARRAY arrResults ;
|
|
TARRAY arrBootIni ;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
TCHAR szPort[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
BOOL bRes = FALSE ;
|
|
BOOL bFlag = FALSE ;
|
|
DWORD dwCount = 0 ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szDefault[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szString[MAX_STRING_LENGTH1] = NULL_STRING ;
|
|
TCHAR szBaudRate[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szBoot[MAX_RES_STRING] = NULL_STRING ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bRedirectFlag = FALSE ;
|
|
TCHAR szRedirectBaudrate[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
BOOL bRedirectBaudFlag = FALSE ;
|
|
|
|
TCHAR szErrorMsg[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
DWORD dwSectionFlag = FALSE ;
|
|
|
|
TCHAR szDebugPort[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
TCHAR szBootString[MAX_RES_STRING] = NULL_STRING ;
|
|
DWORD dwI = 0 ;
|
|
|
|
BOOL bMemFlag = FALSE ;
|
|
BOOL bDefault = FALSE ;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
|
|
{ CMDOPTION_EMS, CP_MAIN_OPTION, 1, 0,&bDefault, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY , 1, 0, &dwId, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PORT, CP_TYPE_TEXT | CP_VALUE_MANDATORY|CP_MODE_VALUES,1,0,&szPort,EMS_PORT_VALUES,NULL,NULL},
|
|
{ SWITCH_BAUD, CP_TYPE_TEXT | CP_VALUE_MANDATORY |CP_MODE_VALUES,1,0,&szBaudRate,BAUD_RATE_VALUES_EMS,NULL,NULL},
|
|
{ CMDOPTION_DEFAULT, CP_DEFAULT | CP_TYPE_TEXT | CP_MANDATORY , 1, 0, &szDefault,NULL_STRING, NULL, NULL }
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
if(bUsage)
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayEmsUsage_X86() ;
|
|
return (EXIT_SUCCESS) ;
|
|
}else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
}
|
|
}
|
|
|
|
//display an error message if the server is empty.
|
|
if( (cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//display error message if the user enters any invalid string.
|
|
if( !( ( lstrcmpi(szDefault,VALUE_ON)== 0) || (lstrcmpi(szDefault,VALUE_OFF)== 0 ) ||(lstrcmpi(szDefault,EDIT_STRING)== 0) ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_EMS));
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
if( (lstrcmpi(szDefault,EDIT_STRING)== 0)&& (lstrlen(szPort)==0) && (lstrlen(szBaudRate)==0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_EDIT_SYNTAX));
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if( ( (lstrcmpi(szDefault,ON_STRING)== 0) || (lstrcmpi(szDefault,OFF_STRING)== 0) )&& (cmdOptions[5].dwActuals==0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_ID_MISSING));
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_EMS_HELP));
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
}
|
|
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
arrResults = CreateDynamicArray();
|
|
|
|
//return failure if failed to allocate memory
|
|
if(arrResults == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
arrResults = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arrResults != NULL)
|
|
{
|
|
lstrcpy(szString ,DynArrayItemAsString(arrResults, dwId - 1 ));
|
|
}
|
|
else
|
|
{
|
|
bMemFlag = TRUE ;
|
|
}
|
|
|
|
if((szString == NULL)||(bMemFlag == TRUE ))
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//getting the number of boot entries
|
|
dwCount = DynArrayGetCount(arrResults);
|
|
if((dwId<=0 || dwId > dwCount ) && (lstrcmpi(szDefault,SWITCH_EDIT)!= 0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_OSID));
|
|
DestroyDynamicArray(&arrResults);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// common code till here . from here process acc to the ON/OFF/EDIT flag.
|
|
if(lstrcmpi(szDefault,ON_STRING)==0)
|
|
{
|
|
if((_tcsstr(szString,REDIRECT) != 0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_REDIRECT_SWITCH));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
//Display an error message if there is no redirect port present in the
|
|
// bootloader section and the user also does not specify the COM port.
|
|
if ((lstrlen(szPort)== 0))
|
|
{
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,REDIRECT_STRING,szBoot);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
if(lstrlen(szBoot)== 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NO_PORT));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if(lstrlen(szPort)!= 0)
|
|
{
|
|
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,BAUDRATE_STRING,szRedirectBaudrate);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,REDIRECT_STRING,szBoot);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
//display warning message if the redirect=COMX entry is already present in the BootLoader section.
|
|
if(lstrlen(szBoot)!= 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_WARN_REDIRECT));
|
|
bRedirectFlag = TRUE ;
|
|
}
|
|
|
|
if( (lstrlen(szRedirectBaudrate)!=0)&&(lstrlen(szBaudRate)!= 0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_WARN_REDIRECTBAUD));
|
|
bRedirectBaudFlag = TRUE ;
|
|
}
|
|
|
|
|
|
// if the Boot loader section does not
|
|
// contain any port for redirection.
|
|
if(!bRedirectFlag)
|
|
{
|
|
if (lstrcmpi(szPort,USEBIOSSET)== 0)
|
|
{
|
|
lstrcpy(szPort,USEBIOSSETTINGS);
|
|
}
|
|
|
|
|
|
|
|
// scan the entire BOOT.INI and check if the specified Port
|
|
lstrcpy(szDebugPort,DEBUGPORT);
|
|
lstrcat(szDebugPort,szPort);
|
|
|
|
arrBootIni = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arrBootIni == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//
|
|
//loop through all the OS entries and check if any of the
|
|
//
|
|
for(dwI = 0 ;dwI < dwCount-1 ; dwI++ )
|
|
{
|
|
lstrcpy(szBootString ,DynArrayItemAsString(arrBootIni,dwI));
|
|
CharLower(szDebugPort);
|
|
if(_tcsstr(szBootString,szDebugPort)!= 0)
|
|
{
|
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_DEBUG_PORT));
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//convert the com port value specified by user to upper case for storing into the ini file.
|
|
CharUpper(szPort);
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION,KEY_REDIRECT,szPort, szPath ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_EMS_CHANGE_BOOTLOADER));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_EMS_CHANGE_ERROR_BLOADER));
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if(!bRedirectBaudFlag)
|
|
{
|
|
// to add the baudrate to the BOOTLOADER section.
|
|
if(lstrlen(szBaudRate) != 0 )
|
|
{
|
|
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION,KEY_BAUDRATE,szBaudRate, szPath ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_EMS_CHANGE_BAUDRATE));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_EMS_CHANGE_ERROR_BAUDRATE));
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//add the /redirect into the OS options.
|
|
|
|
lstrcat(szString,TOKEN_EMPTYSPACE);
|
|
lstrcat(szString,REDIRECT);
|
|
|
|
//display an error message if the Os Load Options string is more than
|
|
// 254 characters in length.
|
|
if( _tcslen(szString) >= MAX_RES_STRING)
|
|
{
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
DynArrayRemove(arrResults, dwId - 1 );
|
|
DynArrayInsertString(arrResults, dwId - 1, szString, MAX_STRING_LENGTH1);
|
|
|
|
szFinalStr = (TCHAR*)malloc(MAX_STRING_LENGTH1* sizeof(TCHAR));
|
|
if (szFinalStr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
if (stringFromDynamicArray1( arrResults,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_CHANGE), dwId );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_ADD_SWITCHES));
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
}
|
|
|
|
if(lstrcmpi(szDefault,EDIT_STRING)==0)
|
|
{
|
|
//display error message if user enters a id for the edit option.
|
|
if(dwId!=0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_EMS));
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if (lstrcmpi(szPort,USEBIOSSET)== 0)
|
|
{
|
|
lstrcpy(szPort,USEBIOSSETTINGS);
|
|
}
|
|
|
|
//get the keys of the specified ini section.
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,BAUDRATE_STRING,szRedirectBaudrate);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
//get the keys of the specified ini section.
|
|
dwSectionFlag = getKeysOfSpecifiedINISection(szPath ,BOOTLOADERSECTION,REDIRECT_STRING,szBoot);
|
|
if (dwSectionFlag == MALLOC_FAILURE)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
if( (lstrlen(szBoot) == 0 ) && ((cmdOptions[6].dwActuals!=0)) )
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_COM_PORT));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
if( (lstrlen(szRedirectBaudrate) == 0 ) && ((cmdOptions[7].dwActuals!=0)) )
|
|
{
|
|
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_ERROR_BAUDRATE_HELP));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
lstrcpy(szDebugPort,DEBUGPORT);
|
|
lstrcat(szDebugPort,szPort);
|
|
|
|
arrBootIni = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
if(arrBootIni == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//
|
|
//loop through all the OS entries and check if any of the
|
|
//
|
|
for(dwI = 0 ;dwI < dwCount-1 ; dwI++ )
|
|
{
|
|
lstrcpy(szBootString ,DynArrayItemAsString(arrBootIni,dwI));
|
|
CharLower(szDebugPort);
|
|
if(_tcsstr(szBootString,szDebugPort)!= 0)
|
|
{
|
|
DISPLAY_MESSAGE( stderr, GetResString(IDS_ERROR_DEBUG_PORT));
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// edit the Boot loader section with the redirect values entered by the user.
|
|
CharUpper(szPort);
|
|
if(lstrlen(szPort)!= 0)
|
|
{
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION,KEY_REDIRECT,
|
|
szPort, szPath ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_EMS_CHANGE_BOOTLOADER));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_EMS_CHANGE_ERROR_BLOADER));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
SAFECLOSE(stream);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
|
|
// edit the Boot loader section with the baudrate values entered by the user.
|
|
if(lstrlen(szBaudRate)!= 0)
|
|
{
|
|
|
|
if( WritePrivateProfileString( BOOTLOADERSECTION,KEY_BAUDRATE,
|
|
szBaudRate, szPath ) != 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(IDS_EMS_CHANGE_BAUDRATE));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_EMS_CHANGE_ERROR_BAUDRATE));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arrResults);
|
|
DestroyDynamicArray(&arrBootIni);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// if the option value is off.
|
|
if(lstrcmpi(szDefault,VALUE_OFF)==0)
|
|
{
|
|
|
|
//display an error message if either the com port or baud rate is typed in the command line
|
|
if((lstrlen(szBaudRate)!=0)||(lstrlen(szPort)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_EMS));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// display error message if the /redirect switch is not present in the Boot.ini
|
|
if((_tcsstr(szString,REDIRECT) == 0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_REDIRECT_SWITCH));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//remove the /redirect switch from the OS entry specified .
|
|
removeSubString(szString,REDIRECT);
|
|
|
|
//display an error message if the Os Load options string is more than
|
|
// 255 characters in length.
|
|
|
|
if( _tcslen(szString) >= MAX_RES_STRING)
|
|
{
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
DynArrayRemove(arrResults, dwId - 1 );
|
|
DynArrayInsertString(arrResults, dwId - 1, szString, MAX_STRING_LENGTH1);
|
|
|
|
szFinalStr = (TCHAR*)malloc(MAX_STRING_LENGTH1* sizeof(TCHAR));
|
|
if (szFinalStr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
if (stringFromDynamicArray1( arrResults,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_CHANGE), dwId );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_ADD_SWITCHES));
|
|
DestroyDynamicArray(&arrResults);
|
|
SAFEFREE(szFinalStr);
|
|
resetFileAttrib(szPath);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arrResults);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes) ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the Ems entry option (X86).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayEmsUsage_X86()
|
|
{
|
|
DWORD dwIndex = IDS_EMS_BEGIN_X86 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_EMS_END_X86;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the Debug entry option (X86).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
// ***************************************************************************
|
|
VOID displayDebugUsage_X86()
|
|
{
|
|
DWORD dwIndex = IDS_DEBUG_BEGIN_X86 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_DEBUG_END_X86;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the Ems entry option (IA64).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayEmsUsage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_EMS_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_EMS_END_IA64;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the Debug entry option (IA64).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
// ***************************************************************************
|
|
VOID displayDebugUsage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_DEBUG_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <= IDS_DEBUG_END_IA64 ;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : This function gets all the keys present in the specified section of
|
|
// an .ini file and then returns the dynamic array containing all the
|
|
// keys
|
|
//
|
|
// Parameters : LPTSTR sziniFile (in) - Name of the ini file.
|
|
// LPTSTR szinisection (in) - Name of the section in the boot.ini.
|
|
//
|
|
// Return Type : TARRAY ( pointer to the dynamic array )
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD getKeysOfSpecifiedINISection( LPTSTR sziniFile, LPTSTR sziniSection,LPCWSTR szKeyName ,LPTSTR szValue)
|
|
{
|
|
|
|
|
|
// Number of characters returned by the GetPrivateProfileString function
|
|
DWORD len = 0;
|
|
|
|
|
|
DWORD dwLength = MAX_STRING_LENGTH1 ;
|
|
|
|
// Buffer which will be populated by the GetPrivateProfileString function
|
|
LPTSTR inBuf = NULL ;
|
|
|
|
inBuf = (LPTSTR)malloc(dwLength*sizeof(TCHAR));
|
|
|
|
if(inBuf == NULL)
|
|
{
|
|
return MALLOC_FAILURE ;
|
|
}
|
|
|
|
|
|
while(1)
|
|
{
|
|
// Getting all the keys from the boot.ini file
|
|
len = GetPrivateProfileString
|
|
(sziniSection,
|
|
szKeyName,
|
|
ERROR_PROFILE_STRING1,
|
|
inBuf,
|
|
dwLength,
|
|
sziniFile);
|
|
|
|
|
|
//if the size of the string is not sufficient then increment the size.
|
|
if(len == dwLength-2)
|
|
{
|
|
dwLength +=100 ;
|
|
|
|
inBuf = (LPTSTR)realloc(inBuf,dwLength*sizeof(TCHAR));
|
|
if(inBuf == NULL)
|
|
{
|
|
SAFEFREE(inBuf);
|
|
return MALLOC_FAILURE;
|
|
}
|
|
}
|
|
else
|
|
break ;
|
|
}
|
|
|
|
//copy the value into the destination buffer only if
|
|
// the size is less than 255 else return FAILURE.
|
|
//
|
|
if(lstrlen(inBuf) <= MAX_RES_STRING)
|
|
{
|
|
lstrcpy(szValue,inBuf);
|
|
}
|
|
else
|
|
{
|
|
SAFEFREE(inBuf);
|
|
return MALLOC_FAILURE;
|
|
}
|
|
|
|
SAFEFREE(inBuf);
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// Implement the Add Switch switch.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.)
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD ProcessAddSwSwitch( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bAddSw = FALSE ;
|
|
|
|
DWORD dwDefault = 0;
|
|
|
|
|
|
TARRAY arr ;
|
|
TCHAR szkey[MAX_STRING_LENGTH1] = NULL_STRING;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
DWORD dwNumKeys = 0;
|
|
BOOL bRes = FALSE ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bFlag = FALSE ;
|
|
TCHAR szMaxmem[10] = NULL_STRING ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szErrorMsg[MAX_RES_STRING] = NULL_STRING ;
|
|
BOOL bBaseVideo = FALSE ;
|
|
BOOL bSos = FALSE ;
|
|
BOOL bNoGui = FALSE ;
|
|
DWORD dwMaxmem = 0 ;
|
|
BOOL bErrorFlag = FALSE ;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_ADDSW, CP_MAIN_OPTION, 1, 0,&bAddSw, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY|CP_MANDATORY , 1, 0, &dwDefault, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_MAXMEM, CP_TYPE_UNUMERIC | CP_VALUE_MANDATORY,1,0,&dwMaxmem,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_BASEVIDEO, 0,1,0,&bBaseVideo,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_NOGUIBOOT, 0,1,0,&bNoGui,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_SOS, 0,1,0,&bSos,NULL_STRING,NULL,NULL},
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying query usage if user specified -? with -query option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayAddSwUsage_X86();
|
|
return (EXIT_SUCCESS);
|
|
}else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
|
|
if( (cmdOptions[6].dwActuals!=0) && (dwMaxmem < 32 ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_MAXMEM_VALUES));
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
//display an error message if the user does not enter even one of
|
|
if((dwMaxmem==0)&& (!bBaseVideo)&& (!bNoGui)&&(!bSos) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_ADDSW));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
|
|
szFinalStr = (TCHAR*) malloc(MAX_STRING_LENGTH1* sizeof(TCHAR) );
|
|
if (szFinalStr== NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TAG));
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Getting the keys of the Operating system section in the boot.ini file
|
|
arr = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
|
|
if(arr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Getting the total number of keys in the operating systems section
|
|
dwNumKeys = DynArrayGetCount(arr);
|
|
|
|
|
|
if((dwNumKeys >= MAX_BOOTID_VAL)&& (dwDefault >= MAX_BOOTID_VAL ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAX_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Displaying error message if the number of keys is less than the OS entry
|
|
// line number specified by the user
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwNumKeys ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Getting the key of the OS entry specified by the user
|
|
if (arr != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arr, dwDefault - 1 ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
_tcscpy( szkey,pwsz);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//if the max mem switch is specified by the user.
|
|
if(dwMaxmem != 0)
|
|
{
|
|
|
|
if(_tcsstr(szkey,MAXMEM_VALUE1) != 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_MAXMEM_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
lstrcat(szkey , TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey ,MAXMEM_VALUE1);
|
|
lstrcat(szkey,TOKEN_EQUAL);
|
|
_ltow(dwMaxmem,szMaxmem,10);
|
|
lstrcat(szkey,szMaxmem);
|
|
}
|
|
}
|
|
|
|
// if the base video is specified by the user.
|
|
if (bBaseVideo)
|
|
{
|
|
if(_tcsstr(szkey,BASEVIDEO_VALUE) != 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_BASEVIDEO_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
lstrcat(szkey , TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey ,BASEVIDEO_SWITCH);
|
|
}
|
|
|
|
}
|
|
|
|
// if the SOS is specified by the user.
|
|
if(bSos)
|
|
{
|
|
if(_tcsstr(szkey,SOS_VALUE) != 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_SOS_SWITCH ) );
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
lstrcat(szkey , TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey ,SOS_SWITCH);
|
|
}
|
|
}
|
|
|
|
// if the noguiboot is specified by the user.
|
|
if(bNoGui)
|
|
{
|
|
if(_tcsstr(szkey,NOGUI_VALUE) != 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPL_NOGUI_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
lstrcat(szkey , TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey ,NOGUI_VALUE );
|
|
}
|
|
}
|
|
|
|
if( _tcslen(szkey) >= MAX_RES_STRING)
|
|
{
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
DynArrayRemove(arr, dwDefault - 1 );
|
|
DynArrayInsertString(arr, dwDefault - 1, szkey, MAX_STRING_LENGTH1);
|
|
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
|
|
if (stringFromDynamicArray1( arr,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_ADD), dwDefault );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_ADD_SWITCHES));
|
|
DestroyDynamicArray(&arr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//reset the file attributes and free the memory and close the connection to the server.
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
|
|
}
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to remove the switches to the boot.ini file settings for
|
|
// the specified system.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.)
|
|
//
|
|
// ***************************************************************************
|
|
|
|
DWORD ProcessRmSwSwitch( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bRmSw = FALSE ;
|
|
|
|
DWORD dwDefault = 0;
|
|
|
|
TARRAY arr = NULL ;
|
|
|
|
|
|
TCHAR szkey[MAX_STRING_LENGTH1] = NULL_STRING;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
|
|
TCHAR szTmp[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szChangeKeyValue[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
DWORD dwNumKeys = 0;
|
|
BOOL bRes = FALSE ;
|
|
PTCHAR pToken = NULL ;
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bFlag = FALSE ;
|
|
TCHAR szMaxmem[STRING10] = NULL_STRING ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szDefault[MAX_RES_STRING] = NULL_STRING ;
|
|
BOOL bBaseVideo = FALSE ;
|
|
BOOL bSos = FALSE ;
|
|
BOOL bNoGui = FALSE ;
|
|
|
|
|
|
DWORD bMaxmem = FALSE ;
|
|
BOOL bErrorFlag = FALSE ;
|
|
TCHAR szTemp[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
TCHAR szString[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
|
|
LPTSTR szSubString = NULL ;
|
|
|
|
DWORD dwCode = 0;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
{ CMDOPTION_RMSW, CP_MAIN_OPTION, 1, 0,&bRmSw, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY|CP_MANDATORY , 1, 0, &dwDefault, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_MAXMEM, 0,1,0,&bMaxmem,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_BASEVIDEO, 0,1,0,&bBaseVideo,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_NOGUIBOOT, 0,1,0,&bNoGui,NULL_STRING,NULL,NULL},
|
|
{ SWITCH_SOS, 0,1,0,&bSos,NULL_STRING,NULL,NULL},
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying query usage if user specified -? with -query option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayRmSwUsage_X86();
|
|
return (EXIT_SUCCESS);
|
|
}else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//display an error mesage if none of the options are specified.
|
|
if((!bSos)&&(!bBaseVideo)&&(!bNoGui)&&(!bMaxmem))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_RMSW));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//display a warning message if the user specifies local system name
|
|
// with -s.
|
|
|
|
|
|
szFinalStr = (TCHAR*) malloc(MAX_STRING_LENGTH1* sizeof(TCHAR) );
|
|
if (szFinalStr== NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TAG));
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
SAFEFREE(szFinalStr);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
|
|
}
|
|
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
|
|
// Getting the keys of the Operating system section in the boot.ini file
|
|
arr = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
|
|
if(arr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Getting the total number of keys in the operating systems section
|
|
dwNumKeys = DynArrayGetCount(arr);
|
|
|
|
|
|
if( (dwNumKeys >= MAX_BOOTID_VAL)&&(dwDefault >= MAX_BOOTID_VAL ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAX_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Displaying error message if the number of keys is less than the OS entry
|
|
// line number specified by the user
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwNumKeys ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Getting the key of the OS entry specified by the user
|
|
if (arr != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arr, dwDefault - 1 ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
_tcscpy( szkey,pwsz);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
//if the max mem switch is specified by the user.
|
|
if(bMaxmem==TRUE)
|
|
{
|
|
|
|
if(_tcsstr(szkey,MAXMEM_VALUE1) == 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_MAXMEM_SWITCH));
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
|
|
szSubString = ( LPTSTR ) malloc( MAX_RES_STRING*sizeof( TCHAR ) );
|
|
if(szSubString == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TAG));
|
|
ShowLastError(stderr);
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
dwCode = GetSubString(szkey,MAXMEM_VALUE1,szSubString);
|
|
|
|
//remove the substring specified.
|
|
if(dwCode == EXIT_SUCCESS)
|
|
{
|
|
removeSubString(szkey,szSubString);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// if the base video is specified by the user.
|
|
if (bBaseVideo==TRUE)
|
|
{
|
|
if(_tcsstr(szkey,BASEVIDEO_VALUE) == 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_BV_SWITCH));
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
removeSubString(szkey,BASEVIDEO_VALUE);
|
|
}
|
|
}
|
|
|
|
// if the SOS is specified by the user.
|
|
if(bSos==TRUE)
|
|
{
|
|
if(_tcsstr(szkey,SOS_VALUE) == 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_SOS_SWITCH ) );
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
removeSubString(szkey,SOS_VALUE);
|
|
}
|
|
}
|
|
|
|
// if the noguiboot is specified by the user.
|
|
if(bNoGui==TRUE)
|
|
{
|
|
|
|
if(_tcsstr(szkey,NOGUI_VALUE) == 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_NOGUI_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
else
|
|
{
|
|
removeSubString(szkey,NOGUI_VALUE);
|
|
}
|
|
}
|
|
|
|
DynArrayRemove(arr, dwDefault - 1 );
|
|
DynArrayInsertString(arr, dwDefault - 1, szkey, MAX_STRING_LENGTH1);
|
|
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
|
|
if (stringFromDynamicArray1( arr,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
|
|
_stprintf(szBuffer,GetResString(IDS_SWITCH_DELETE), dwDefault );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
|
|
}
|
|
else
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_NO_SWITCH_DELETE), dwDefault );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
DestroyDynamicArray(&arr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//reset the file attributes and free the memory and close the connection to the server.
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the AddSw entry option (X86).
|
|
//
|
|
// Parameters : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayAddSwUsage_X86()
|
|
{
|
|
DWORD dwIndex = IDS_ADDSW_BEGIN_X86 ;
|
|
for(;dwIndex <=IDS_ADDSW_END_X86;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description : Display the help for the AddSw entry option (IA64).
|
|
//
|
|
// Arguments : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayAddSwUsage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_ADDSW_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_ADDSW_END_IA64;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the RmSw entry option (IA64).
|
|
//
|
|
// Arguments : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayRmSwUsage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_RMSW_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_RMSW_END_IA64;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the RmSw entry option (X86).
|
|
//
|
|
// Arguments : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayRmSwUsage_X86()
|
|
{
|
|
DWORD dwIndex = IDS_RMSW_BEGIN_X86 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_RMSW_END_X86;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : This function retreives a part of the string.
|
|
//
|
|
// Parameters :
|
|
// LPTSTR szString (in) - String in which substring is to be found.
|
|
// LPTSTR szPartString (in) - Part String whose remaining substring is to be found.
|
|
// LPTSTR pszFullString (out) - String in which substring is to be found.
|
|
//
|
|
//
|
|
// Return Type : DWORD
|
|
//
|
|
//
|
|
// ***************************************************************************
|
|
DWORD GetSubString(LPTSTR szString,LPTSTR szPartString,LPTSTR pszFullString)
|
|
{
|
|
|
|
TCHAR szTemp[MAX_RES_STRING]= NULL_STRING ;
|
|
PTCHAR pszMemValue = NULL ;
|
|
PTCHAR pszdest = NULL ;
|
|
|
|
#ifndef _WIN64
|
|
DWORD dwPos = 0;
|
|
#else
|
|
INT64 dwPos = 0;
|
|
#endif
|
|
|
|
pszMemValue = _tcsstr(szString,szPartString);
|
|
if(pszMemValue == NULL)
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the remaining part of the string into a buffer
|
|
lstrcpy(szTemp,pszMemValue);
|
|
|
|
|
|
//search for the empty space.
|
|
pszdest = _tcschr(szTemp,_T(' '));
|
|
if (pszdest==NULL)
|
|
{
|
|
//the api returns NULL if it is not able to find the
|
|
// character . This means that the required switch is at the end
|
|
//of the string . so we are copying it fully
|
|
lstrcpy(pszFullString,szTemp);
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
dwPos = pszdest - szTemp ;
|
|
szTemp[dwPos] = _T('\0');
|
|
|
|
|
|
lstrcpy(pszFullString,szTemp);
|
|
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
// Routine Description:
|
|
// This routine is to add/remove the /debugport=1394
|
|
// switches to the boot.ini file settings for the specified system.
|
|
// Arguments:
|
|
// [IN] argc Number of command line arguments
|
|
// [IN] argv Array containing command line arguments
|
|
//
|
|
// Return Value:
|
|
// DWORD (EXIT_SUCCESS for success and EXIT_FAILURE for Failure.)
|
|
//
|
|
// ***************************************************************************
|
|
DWORD ProcessDbg1394Switch( DWORD argc, LPCTSTR argv[] )
|
|
{
|
|
|
|
BOOL bUsage = FALSE ;
|
|
BOOL bNeedPwd = FALSE ;
|
|
BOOL bDbg1394 = FALSE ;
|
|
|
|
DWORD dwDefault = 0;
|
|
TARRAY arr ;
|
|
TCHAR szkey[MAX_RES_STRING] = NULL_STRING;
|
|
|
|
FILE *stream = NULL;
|
|
|
|
// Initialising the variables that are passed to TCMDPARSER structure
|
|
STRING256 szServer = NULL_STRING;
|
|
STRING256 szUser = NULL_STRING;
|
|
STRING256 szPassword = NULL_STRING;
|
|
STRING100 szPath = NULL_STRING;
|
|
|
|
|
|
DWORD dwNumKeys = 0;
|
|
BOOL bRes = FALSE ;
|
|
|
|
|
|
LPTSTR szFinalStr = NULL ;
|
|
BOOL bFlag = FALSE ;
|
|
TCHAR szMaxmem[STRING10] = NULL_STRING ;
|
|
|
|
TCHAR szBuffer[MAX_RES_STRING] = NULL_STRING ;
|
|
TCHAR szDefault[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
TCHAR szTemp[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
TCHAR szErrorMsg[MAX_RES_STRING] = NULL_STRING ;
|
|
|
|
LPTSTR szSubString = NULL ;
|
|
|
|
DWORD dwCode = 0;
|
|
|
|
DWORD dwChannel = 0;
|
|
|
|
TCHAR szChannel[MAX_RES_STRING] = NULL_STRING ;
|
|
LPCTSTR szToken = NULL ;
|
|
DWORD dwRetVal = 0 ;
|
|
BOOL bConnFlag = FALSE ;
|
|
|
|
TCMDPARSER cmdOptions[] =
|
|
{
|
|
|
|
{ CMDOPTION_DBG1394, CP_MAIN_OPTION, 1, 0,&bDbg1394,NULL_STRING , NULL, NULL },
|
|
{ SWITCH_SERVER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szServer, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_USER, CP_TYPE_TEXT | CP_VALUE_MANDATORY, 1, 0, &szUser, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_PASSWORD, CP_TYPE_TEXT | CP_VALUE_OPTIONAL, 1, 0, &szPassword, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_USAGE, CP_USAGE, 1, 0, &bUsage, NULL_STRING, NULL, NULL },
|
|
{ SWITCH_ID, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY| CP_MANDATORY , 1, 0, &dwDefault, NULL_STRING, NULL, NULL },
|
|
{ CMDOPTION_CHANNEL, CP_TYPE_NUMERIC | CP_VALUE_MANDATORY,1,0,&dwChannel,NULL_STRING,NULL,NULL},
|
|
{ CMDOPTION_DEFAULT, CP_DEFAULT|CP_TYPE_TEXT | CP_MANDATORY, 1, 0, &szDefault,NULL_STRING, NULL, NULL }
|
|
|
|
};
|
|
|
|
//
|
|
//check if the remote system is 64 bit and if so
|
|
// display an error.
|
|
//
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_FAILURE )
|
|
{
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//copy the Asterix token which is required for password prompting.
|
|
_tcscpy(cmdOptions[3].szValues,TOKEN_ASTERIX) ;
|
|
_tcscpy(szPassword,TOKEN_ASTERIX);
|
|
|
|
// Parsing the copy option switches
|
|
if ( ! DoParseParam( argc, argv, SIZE_OF_ARRAY(cmdOptions ), cmdOptions ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,ERROR_TAG);
|
|
ShowMessage(stderr,GetReason());
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
// Displaying query usage if user specified -? with -query option
|
|
if( bUsage )
|
|
{
|
|
dwRetVal = CheckSystemType( szServer);
|
|
if(dwRetVal==EXIT_SUCCESS )
|
|
{
|
|
displayDbg1394Usage_X86();
|
|
return (EXIT_SUCCESS);
|
|
}else
|
|
{
|
|
return (EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
//
|
|
//display error message if user enters a value
|
|
// other than on or off
|
|
//
|
|
if( ( lstrcmpi(szDefault,OFF_STRING)!=0 ) && (lstrcmpi(szDefault,ON_STRING)!=0 ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_DEFAULT_MISSING));
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_1394_HELP));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
if((cmdOptions[5].dwActuals == 0) &&(dwDefault == 0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_ID_MISSING));
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_1394_HELP));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
if(( lstrcmpi(szDefault,OFF_STRING)==0 ) &&(dwChannel != 0) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_SYNTAX_DBG1394));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
if( ( lstrcmpi(szDefault,ON_STRING)==0 ) && (cmdOptions[6].dwActuals != 0) && ( (dwChannel < 1) ||(dwChannel > 64 )) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_CH_RANGE));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
//display error message if the username is entered with out a machine name
|
|
if( (cmdOptions[1].dwActuals == 0)&&(cmdOptions[2].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_USER_BUT_NOMACHINE));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
if( (cmdOptions[2].dwActuals == 0)&&(cmdOptions[3].dwActuals != 0))
|
|
{
|
|
SetReason(GetResString(IDS_PASSWD_BUT_NOUSER));
|
|
ShowMessage(stderr,GetReason());
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
|
|
//for setting the bNeedPwd
|
|
if( ( _tcscmp(szPassword,TOKEN_ASTERIX )==0 ) && (IsLocalSystem(szServer)==FALSE ))
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
|
|
}
|
|
|
|
//set the bneedpassword to true if the server name is specified and password is not specified.
|
|
if((cmdOptions[1].dwActuals!=0)&&(cmdOptions[3].dwActuals==0))
|
|
{
|
|
if( (lstrlen( szServer ) != 0) && (IsLocalSystem(szServer)==FALSE) )
|
|
{
|
|
bNeedPwd = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
bNeedPwd = FALSE ;
|
|
}
|
|
|
|
if(_tcslen(szPassword)!= 0 )
|
|
{
|
|
_tcscpy(szPassword,NULL_STRING);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//display an error message if the server is empty.
|
|
if((cmdOptions[1].dwActuals!=0)&&(lstrlen(szServer)==0))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_SERVER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
//display an error message if the user is empty.
|
|
if((cmdOptions[2].dwActuals!=0)&&(lstrlen(szUser)==0 ))
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_NULL_USER));
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
if(StrCmpN(szServer,TOKEN_BACKSLASH4,2)==0)
|
|
{
|
|
if(!StrCmpN(szServer,TOKEN_BACKSLASH6,3)==0)
|
|
{
|
|
szToken = _tcstok(szServer,TOKEN_BACKSLASH4);
|
|
if(szToken == NULL)
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
lstrcpy(szServer,szToken);
|
|
}
|
|
}
|
|
|
|
szFinalStr = (TCHAR*) malloc(MAX_STRING_LENGTH1* sizeof(TCHAR) );
|
|
if (szFinalStr== NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_TAG));
|
|
ShowLastError(stderr);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Establishing connection to the specified machine and getting the file pointer
|
|
// of the boot.ini file if there is no error while establishing connection
|
|
lstrcpy(szPath, PATH_BOOTINI );
|
|
|
|
//display a warning message if the user specifies local system name
|
|
// with -s.
|
|
if( (IsLocalSystem(szServer)==TRUE)&&(lstrlen(szUser)!=0))
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(WARN_LOCALCREDENTIALS));
|
|
_tcscpy(szServer,_T(""));
|
|
}
|
|
|
|
bFlag = openConnection( szServer, szUser, szPassword, szPath,bNeedPwd,stream,&bConnFlag);
|
|
if(bFlag == EXIT_FAILURE)
|
|
{
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
|
|
|
|
// Getting the keys of the Operating system section in the boot.ini file
|
|
arr = getKeyValueOfINISection( szPath, OS_FIELD );
|
|
|
|
if(arr == NULL)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
// Getting the total number of keys in the operating systems section
|
|
dwNumKeys = DynArrayGetCount(arr);
|
|
if( (dwNumKeys >= MAX_BOOTID_VAL) && (dwDefault >= MAX_BOOTID_VAL ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_MAX_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
DestroyDynamicArray(&arr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Displaying error message if the number of keys is less than the OS entry
|
|
// line number specified by the user
|
|
if( ( dwDefault <= 0 ) || ( dwDefault > dwNumKeys ) )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_BOOTID));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
// Getting the key of the OS entry specified by the user
|
|
if (arr != NULL)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
pwsz = DynArrayItemAsString( arr, dwDefault - 1 ) ;
|
|
if(pwsz != NULL)
|
|
{
|
|
_tcscpy( szkey,pwsz);
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
DISPLAY_MESSAGE( stderr, ERROR_TAG);
|
|
ShowLastError(stderr);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
|
|
if(lstrcmpi(szDefault,ON_STRING)==0 )
|
|
{
|
|
if(_tcsstr(szkey,DEBUGPORT) != 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_DUPLICATE_ENTRY));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if((_tcsstr(szkey,DEBUG_SWITCH) == 0))
|
|
{
|
|
lstrcat(szkey,TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey,DEBUG_SWITCH);
|
|
}
|
|
|
|
lstrcat(szkey,TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey,DEBUGPORT_1394) ;
|
|
|
|
if(dwChannel!=0)
|
|
{
|
|
|
|
//frame the string and concatenate to the Os Load options.
|
|
lstrcat(szkey,TOKEN_EMPTYSPACE);
|
|
lstrcat(szkey,TOKEN_CHANNEL);
|
|
lstrcat(szkey,TOKEN_EQUAL);
|
|
_ltow(dwChannel,szChannel,10);
|
|
lstrcat(szkey,szChannel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(lstrcmpi(szDefault,OFF_STRING)==0 )
|
|
{
|
|
if(_tcsstr(szkey,DEBUGPORT_1394) == 0)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_NO_1394_SWITCH));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
removeSubString(szkey,DEBUGPORT_1394);
|
|
removeSubString(szkey,DEBUG_SWITCH);
|
|
|
|
if(_tcsstr(szkey,TOKEN_CHANNEL)!=0)
|
|
{
|
|
lstrcpy(szTemp,NULL_STRING);
|
|
dwCode = GetSubString(szkey,TOKEN_CHANNEL,szTemp);
|
|
if(dwCode == EXIT_FAILURE )
|
|
{
|
|
DISPLAY_MESSAGE( stderr,GetResString(IDS_NO_TOKENS));
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
|
|
}
|
|
|
|
if(lstrlen(szTemp)!=0)
|
|
{
|
|
removeSubString(szkey,szTemp);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( _tcslen(szkey) >= MAX_RES_STRING)
|
|
{
|
|
_stprintf(szErrorMsg,GetResString(IDS_ERROR_STRING_LENGTH),MAX_RES_STRING);
|
|
DISPLAY_MESSAGE( stderr,szErrorMsg);
|
|
resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE ;
|
|
}
|
|
|
|
DynArrayRemove(arr, dwDefault - 1 );
|
|
DynArrayInsertString(arr, dwDefault - 1, szkey, MAX_RES_STRING);
|
|
|
|
|
|
// Setting the buffer to 0, to avoid any junk value
|
|
memset(szFinalStr, 0, MAX_STRING_LENGTH1);
|
|
|
|
// Forming the final string from all the key-value pairs
|
|
|
|
if (stringFromDynamicArray1( arr,szFinalStr) == EXIT_FAILURE)
|
|
{
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
resetFileAttrib(szPath);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
// Writing to the profile section with new key-value pair
|
|
// If the return value is non-zero, then there is an error.
|
|
if( WritePrivateProfileSection(OS_FIELD, szFinalStr, szPath ) != 0 )
|
|
{
|
|
|
|
_stprintf(szBuffer,GetResString(IDS_SUCCESS_CHANGE_OSOPTIONS), dwDefault );
|
|
DISPLAY_MESSAGE(stdout,szBuffer);
|
|
|
|
}
|
|
else
|
|
{
|
|
_stprintf(szBuffer,GetResString(IDS_ERROR_LOAD_OSOPTIONS), dwDefault );
|
|
DISPLAY_MESSAGE(stderr,szBuffer);
|
|
DestroyDynamicArray(&arr);
|
|
resetFileAttrib(szPath);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (EXIT_FAILURE);
|
|
}
|
|
|
|
//reset the file attributes and free the memory and close the connection to the server.
|
|
bRes = resetFileAttrib(szPath);
|
|
DestroyDynamicArray(&arr);
|
|
SAFEFREE(szFinalStr);
|
|
SAFECLOSE(stream);
|
|
SafeCloseConnection(szServer,bConnFlag);
|
|
return (bRes);
|
|
|
|
}
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the Dbg1394 entry option (X86).
|
|
//
|
|
// Arguments : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayDbg1394Usage_X86()
|
|
{
|
|
DWORD dwIndex = IDS_DBG1394_BEGIN_X86 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_DBG1394_END_X86;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the Dbg1394 entry option (IA64).
|
|
//
|
|
// Arguments : none
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
// ***************************************************************************
|
|
VOID displayDbg1394Usage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_DBG1394_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_DBG1394_END_IA64 ;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : determines if the computer is 32 bit system or 64 bit
|
|
// Arguments :
|
|
// [ in ] szComputerName : System name
|
|
// Return Type : DWORD
|
|
// TRUE : if the system is a 32 bit system
|
|
// FALSE : if the system is a 64 bit system
|
|
// ***************************************************************************
|
|
|
|
DWORD GetCPUInfo(LPTSTR szComputerName)
|
|
{
|
|
HKEY hKey1 = 0;
|
|
|
|
HKEY hRemoteKey = 0;
|
|
TCHAR szPath[MAX_STRING_LENGTH + 1] = SUBKEY ;
|
|
DWORD dwValueSize = MAX_STRING_LENGTH + 1;
|
|
DWORD dwRetCode = ERROR_SUCCESS;
|
|
DWORD dwError = 0;
|
|
TCHAR szTmpCompName[MAX_STRING_LENGTH+1] = NULL_STRING;
|
|
|
|
TCHAR szTemp[MAX_RES_STRING+1] = NULL_STRING ;
|
|
DWORD len = lstrlen(szTemp);
|
|
TCHAR szVal[MAX_RES_STRING+1] = NULL_STRING ;
|
|
DWORD dwLength = MAX_STRING_LENGTH ;
|
|
LPTSTR szReturnValue = NULL ;
|
|
DWORD dwCode = 0 ;
|
|
szReturnValue = ( LPTSTR ) malloc( dwLength*sizeof( TCHAR ) );
|
|
if(szReturnValue == NULL)
|
|
{
|
|
return ERROR_RETREIVE_REGISTRY ;
|
|
}
|
|
|
|
if(lstrlen(szComputerName)!= 0 )
|
|
{
|
|
lstrcpy(szTmpCompName,TOKEN_BACKSLASH4);
|
|
lstrcat(szTmpCompName,szComputerName);
|
|
}
|
|
else
|
|
{
|
|
lstrcpy(szTmpCompName,szComputerName);
|
|
}
|
|
|
|
// Get Remote computer local machine key
|
|
dwError = RegConnectRegistry(szTmpCompName,HKEY_LOCAL_MACHINE,&hRemoteKey);
|
|
if (dwError == ERROR_SUCCESS)
|
|
{
|
|
dwError = RegOpenKeyEx(hRemoteKey,szPath,0,KEY_READ,&hKey1);
|
|
if (dwError == ERROR_SUCCESS)
|
|
{
|
|
dwRetCode = RegQueryValueEx(hKey1, IDENTIFIER_VALUE, NULL, NULL,(LPBYTE) szReturnValue, &dwValueSize);
|
|
|
|
if (dwRetCode == ERROR_MORE_DATA)
|
|
{
|
|
szReturnValue = ( LPTSTR ) realloc( szReturnValue , dwValueSize * sizeof( TCHAR ) );
|
|
dwRetCode = RegQueryValueEx(hKey1, IDENTIFIER_VALUE, NULL, NULL,(LPBYTE) szReturnValue, &dwValueSize);
|
|
}
|
|
if(dwRetCode != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey1);
|
|
RegCloseKey(hRemoteKey);
|
|
SAFEFREE(szReturnValue);
|
|
return ERROR_RETREIVE_REGISTRY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RegCloseKey(hRemoteKey);
|
|
SAFEFREE(szReturnValue);
|
|
return ERROR_RETREIVE_REGISTRY ;
|
|
|
|
}
|
|
|
|
RegCloseKey(hKey1);
|
|
}
|
|
else
|
|
{
|
|
RegCloseKey(hRemoteKey);
|
|
SAFEFREE(szReturnValue);
|
|
return ERROR_RETREIVE_REGISTRY ;
|
|
}
|
|
|
|
RegCloseKey(hRemoteKey);
|
|
|
|
lstrcpy(szVal,X86_MACHINE);
|
|
|
|
//check if the specified system contains the words x86 (belongs to the 32 )
|
|
// set the flag to true if the specified system is 64 bit .
|
|
|
|
if( !_tcsstr(szReturnValue,szVal))
|
|
{
|
|
dwCode = SYSTEM_64_BIT ;
|
|
}
|
|
else
|
|
{
|
|
dwCode = SYSTEM_32_BIT ;
|
|
}
|
|
|
|
|
|
SAFEFREE(szReturnValue);
|
|
return dwCode ;
|
|
|
|
}//GetCPUInfo
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : determines if the computer is 32 bit system or 64 bit
|
|
// Arguments :
|
|
// [ in ] szServer : System name
|
|
// Return Type : DWORD
|
|
// EXIT_FAILURE : if the system is a 32 bit system
|
|
// EXIT_SUCCESS : if the system is a 64 bit system
|
|
// ***************************************************************************
|
|
|
|
DWORD CheckSystemType(LPTSTR szServer)
|
|
{
|
|
|
|
DWORD dwSystemType = 0 ;
|
|
#ifndef _WIN64
|
|
|
|
//display the error message if the target system is a 64 bit system or if error occured in
|
|
//retreiving the information
|
|
dwSystemType = GetCPUInfo(szServer);
|
|
if(dwSystemType == ERROR_RETREIVE_REGISTRY)
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_SYSTEM_INFO));
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
if(dwSystemType == SYSTEM_64_BIT)
|
|
{
|
|
if(lstrlen(szServer)== 0 )
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_VERSION_MISMATCH));
|
|
}
|
|
else
|
|
{
|
|
DISPLAY_MESSAGE(stderr,GetResString(IDS_REMOTE_NOT_SUPPORTED));
|
|
}
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
#endif
|
|
return EXIT_SUCCESS ;
|
|
}
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : determines if the computer is 32 bit system or 64 bit
|
|
// Arguments :
|
|
// [ in ] szServer : System name
|
|
// [ in ] bFlag : Flag
|
|
// Return Type : VOID
|
|
//
|
|
//
|
|
// ***************************************************************************
|
|
VOID SafeCloseConnection(LPTSTR szServer,BOOL bFlag)
|
|
{
|
|
|
|
if (bFlag )
|
|
{
|
|
CloseConnection(szServer);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// ***************************************************************************
|
|
//
|
|
// Routine Description : Display the help for the mirror option (IA64).
|
|
// Arguments :
|
|
// : NONE
|
|
//
|
|
// Return Type : VOID
|
|
//
|
|
//
|
|
// ***************************************************************************
|
|
|
|
VOID displayMirrorUsage_IA64()
|
|
{
|
|
DWORD dwIndex = IDS_MIRROR_BEGIN_IA64 ;
|
|
|
|
|
|
for(;dwIndex <=IDS_MIRROR_END_IA64 ;dwIndex++)
|
|
{
|
|
DISPLAY_MESSAGE(stdout,GetResString(dwIndex));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|