/****************************************************************************** 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= 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)); } }