// // Application Verifier UI // Copyright (c) Microsoft Corporation, 2001 // // // // module: CmdLine.cpp // author: DMihai // created: 02/22/2001 // // Description: // // Command line support // #include "stdafx.h" #include "appverif.h" #include "CmdLine.h" #include "AVUtil.h" #include "Setting.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// VOID CmdLinePrintHelpInformation() { AVTPrintfResourceFormat( IDS_HELP_LINE1, VER_PRODUCTVERSION_STR ); puts( VER_LEGALCOPYRIGHT_STR ); AVPrintStringFromResources( IDS_HELP_LINE3 ); AVPrintStringFromResources( IDS_HELP_LINE4 ); AVPrintStringFromResources( IDS_HELP_LINE5 ); AVPrintStringFromResources( IDS_HELP_LINE6 ); AVPrintStringFromResources( IDS_HELP_LINE7 ); AVPrintStringFromResources( IDS_HELP_LINE8 ); AVPrintStringFromResources( IDS_HELP_LINE9 ); AVPrintStringFromResources( IDS_HELP_LINE10 ); AVPrintStringFromResources( IDS_HELP_LINE11 ); AVPrintStringFromResources( IDS_HELP_LINE12 ); } ///////////////////////////////////////////////////////////////////////////// // // See if the user asked for help and print out the help strings // BOOL CmdLineExecuteIfHelp( INT argc, TCHAR *argv[] ) { BOOL bPrintedHelp; TCHAR szCmdLineSwitch[ 64 ]; bPrintedHelp = FALSE; VERIFY( AVLoadString( IDS_HELP_CMDLINE_SWITCH, szCmdLineSwitch, ARRAY_LENGTH( szCmdLineSwitch ) ) ); // // Search for help switch in the command line // if( argc == 2 && _tcsicmp( argv[ 1 ], szCmdLineSwitch) == 0) { CmdLinePrintHelpInformation(); bPrintedHelp = TRUE; } return bPrintedHelp; } ///////////////////////////////////////////////////////////////////////////// // // See if we need to dump the statistics to the console // BOOL CmdLineExecuteIfQuerySettings( INT argc, TCHAR *argv[] ) { BOOL bFoundCmdLineSwitch; TCHAR szCmdLineSwitch[ 64 ]; bFoundCmdLineSwitch = FALSE; VERIFY( AVLoadString( IDS_QUERYSETT_CMDLINE_SWITCH, szCmdLineSwitch, ARRAY_LENGTH( szCmdLineSwitch ) ) ); // // Search for our switch in the command line // if( argc == 2 && _tcsicmp( argv[1], szCmdLineSwitch) == 0) { bFoundCmdLineSwitch = TRUE; AVDumpRegistrySettingsToConsole(); } return bFoundCmdLineSwitch; } ///////////////////////////////////////////////////////////////////////////// VOID CmdLineGetFlagsAppsReset( INT argc, TCHAR *argv[], DWORD &dwNewFlags, CStringArray &astrNewApps, BOOL &bHaveReset ) { INT nCrtArg; INT nCrtVerifierFlag; BOOL bThisIsAppName; TCHAR szResetCmdLineOption[ 64 ]; TCHAR szReservedCmdLineOption[ 64 ]; dwNewFlags = 0; // // Load the switches from the resources // VERIFY( AVLoadString( IDS_RESET_CMDLINE_SWITCH, szResetCmdLineOption, ARRAY_LENGTH( szResetCmdLineOption ) ) ); // // Parse all the cmd line arguments, looking for ours // for( nCrtArg = 1; nCrtArg < argc; nCrtArg += 1 ) { bThisIsAppName = TRUE; if( _tcsicmp( argv[ nCrtArg ], szResetCmdLineOption ) == 0 ) { // // Have /reset // bHaveReset = TRUE; bThisIsAppName = FALSE; } else { for( nCrtVerifierFlag = 0; nCrtVerifierFlag < ARRAY_LENGTH( g_AllNamesAndBits ); nCrtVerifierFlag += 1 ) { // // Load the cmd line argument reserved for this bit // VERIFY( AVLoadString( g_AllNamesAndBits[ nCrtVerifierFlag ].m_uCmdLineStringId, szReservedCmdLineOption, ARRAY_LENGTH( szReservedCmdLineOption ) ) ); if( _tcsicmp( argv[ nCrtArg ], szReservedCmdLineOption ) == 0 ) { // // Enable this bit since we found it in the cmd line // dwNewFlags |= g_AllNamesAndBits[ nCrtVerifierFlag ].m_dwBit; bThisIsAppName = FALSE; } } } // // If the current cmd line arg is not a reserve one consider it's an app name // if( FALSE != bThisIsAppName ) { astrNewApps.Add( argv[ nCrtArg ] ); } } if( 0 == dwNewFlags ) { // // If the user didn't specify any flags we will // enable all the standard checks // dwNewFlags = AV_ALL_STANDARD_VERIFIER_FLAGS; } } ///////////////////////////////////////////////////////////////////////////// DWORD CmdLineExecute( INT argc, TCHAR *argv[] ) { DWORD dwExitCode; BOOL bFoundCmdLineSwitch; BOOL bHaveReset; DWORD dwNewFlags; INT_PTR nAppsNo; INT_PTR nCrtApp; CStringArray astrNewApps; dwExitCode = AV_EXIT_CODE_SUCCESS; // // See if the user asked for help // bFoundCmdLineSwitch = CmdLineExecuteIfHelp( argc, argv ); if( TRUE == bFoundCmdLineSwitch ) { // // We are done printing out the help strings // goto Done; } // // See if the user asked to dump the current registry settings // bFoundCmdLineSwitch = CmdLineExecuteIfQuerySettings( argc, argv ); if( TRUE == bFoundCmdLineSwitch ) { // // We are done with the settings query // goto Done; } // // Get the new flags and apps if they have been specified // bHaveReset = FALSE; CmdLineGetFlagsAppsReset( argc, argv, dwNewFlags, astrNewApps, bHaveReset ); // // Transform our array of names in the global g_NewSettings data // g_NewSettings.m_SettingsType = AVSettingsTypeCustom; nAppsNo = astrNewApps.GetSize(); for( nCrtApp = 0; nCrtApp < nAppsNo; nCrtApp += 1 ) { g_NewSettings.m_aApplicationData. AddNewAppDataConsoleMode( astrNewApps.GetAt( nCrtApp ), dwNewFlags ); } // // Save the new settings. // // If bHaveReset is set to TRUE the old app verifier settings for // apps not mentioned in this command line will be deleted. // if( AVSaveNewSettings( bHaveReset ) ) { dwExitCode = AV_EXIT_CODE_RESTART; } else { dwExitCode = AV_EXIT_CODE_ERROR; } Done: return dwExitCode; }