windows-nt/Source/XPSP1/NT/sdktools/appverif/cmdline.cpp
2020-09-26 16:20:57 +08:00

290 lines
7 KiB
C++

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