// // Driver Verifier UI // Copyright (c) Microsoft Corporation, 1999 // // // // module: CmdLine.cpp // author: DMihai // created: 11/1/00 // // Description: // #include "stdafx.h" #include "verifier.h" #include "CmdLine.h" #include "VrfUtil.h" #include "VGlobal.h" ///////////////////////////////////////////////////////////////////////////// // // Execute command line // DWORD CmdLineExecute( INT argc, TCHAR *argv[] ) { BOOL bFoundCmdLineSwitch; BOOL bHaveNewFlags; BOOL bHaveNewDrivers; BOOL bHaveVolatile; BOOL bVolatileAddDriver; DWORD dwExitCode; DWORD dwNewFlags; INT_PTR nDrivers; INT_PTR nCrtDriver; CStringArray astrNewDrivers; CString strAllDrivers; dwExitCode = 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 reset all the existing verifier settings // bFoundCmdLineSwitch = CmdLineFindResetSwitch( argc, argv ); if( TRUE == bFoundCmdLineSwitch ) { if( VrfDeleteAllVerifierSettings() ) { if( g_bSettingsSaved ) { // // Had some non-void verifier settings before // dwExitCode = EXIT_CODE_REBOOT_NEEDED; } else { // // Nothing has changed // dwExitCode = EXIT_CODE_SUCCESS; } } else { dwExitCode = EXIT_CODE_ERROR; } // // We are deleting the settings // goto Done; } // // See if we need to start logging statistics // bFoundCmdLineSwitch = CmdLineExecuteIfLog( argc, argv ); if( TRUE == bFoundCmdLineSwitch ) { // // We are done logging // goto Done; } // // See if the user asked to dump the current statistics // to the console // bFoundCmdLineSwitch = CmdLineExecuteIfQuery( argc, argv ); if( TRUE == bFoundCmdLineSwitch ) { // // We are done with the query // 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, drivers and volatile // if they have been specified // bHaveNewFlags = FALSE; bHaveNewDrivers = FALSE; bHaveVolatile = FALSE; CmdLineGetFlagsDriversVolatile( argc, argv, dwNewFlags, bHaveNewFlags, astrNewDrivers, bHaveNewDrivers, bHaveVolatile, bVolatileAddDriver ); if( bHaveNewFlags || bHaveNewDrivers ) { // // Some new drivers and/or flags have been specified // if( FALSE != bHaveVolatile ) { // // Have new volative settings // if( bHaveNewFlags ) { VrfSetNewFlagsVolatile( dwNewFlags ); } else { if( astrNewDrivers.GetSize() > 0 ) { // // Have some new drivers to add or remove // from the verify list // if( bVolatileAddDriver ) { // // Add some drivers // VrfAddDriversVolatile( astrNewDrivers ); } else { // // Remove some drivers // VrfRemoveDriversVolatile( astrNewDrivers ); } } } } else { // // Have new persistent settings (registry) // // // Try to get the old settings // VrtLoadCurrentRegistrySettings( g_bAllDriversVerified, g_astrVerifyDriverNamesRegistry, g_dwVerifierFlagsRegistry ); if( bHaveNewDrivers ) { // // Concat all the new driver names in only one string, // separated with spaces // nDrivers = astrNewDrivers.GetSize(); for( nCrtDriver = 0; nCrtDriver < nDrivers; nCrtDriver += 1 ) { if( strAllDrivers.GetLength() > 0 ) { strAllDrivers += _T( ' ' ); } strAllDrivers += astrNewDrivers.ElementAt( nCrtDriver ); } } // // If: // // - we are switching to "all drivers verified" OR // - we are switching to a new set of drivers to be verified OR // - we are switching to other verifier flags // if( ( bHaveNewDrivers && strAllDrivers.CompareNoCase( _T( "*" ) ) == 0 && TRUE != g_bAllDriversVerified ) || ( bHaveNewDrivers && strAllDrivers.CompareNoCase( _T( "*" ) ) != 0 && VrfIsDriversSetDifferent( strAllDrivers, g_astrVerifyDriverNamesRegistry ) ) || ( bHaveNewFlags && dwNewFlags != g_dwVerifierFlagsRegistry ) ) { // // These are different settings from what we had before // VrfWriteVerifierSettings( bHaveNewDrivers, strAllDrivers, bHaveNewFlags, dwNewFlags ); } else { // // The new settings are the same as previous // VrfMesssageFromResource( IDS_NO_SETTINGS_WERE_CHANGED ); } if( g_bSettingsSaved ) { VrfMesssageFromResource( IDS_NEW_SETTINGS ); VrfDumpRegistrySettingsToConsole(); } } } Done: return dwExitCode; } ///////////////////////////////////////////////////////////////////////////// // // 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( VrfLoadString( 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; } ///////////////////////////////////////////////////////////////////////////// VOID CmdLinePrintHelpInformation() { VrfTPrintfResourceFormat( IDS_HELP_LINE1, VER_PRODUCTVERSION_STR ); puts( VER_LEGALCOPYRIGHT_STR ); VrfPrintStringFromResources( IDS_HELP_LINE3 ); VrfPrintStringFromResources( IDS_HELP_LINE4 ); VrfPrintStringFromResources( IDS_HELP_LINE5 ); VrfPrintStringFromResources( IDS_HELP_LINE6 ); VrfPrintStringFromResources( IDS_HELP_LINE7 ); VrfPrintStringFromResources( IDS_HELP_LINE8 ); VrfPrintStringFromResources( IDS_HELP_LINE9 ); VrfPrintStringFromResources( IDS_HELP_LINE10 ); VrfPrintStringFromResources( IDS_HELP_LINE11 ); VrfPrintStringFromResources( IDS_HELP_LINE12 ); VrfPrintStringFromResources( IDS_HELP_LINE13 ); VrfPrintStringFromResources( IDS_HELP_LINE14 ); VrfPrintStringFromResources( IDS_HELP_LINE15 ); VrfPrintStringFromResources( IDS_HELP_LINE16 ); VrfPrintStringFromResources( IDS_HELP_LINE17 ); VrfPrintStringFromResources( IDS_HELP_LINE18 ); VrfPrintStringFromResources( IDS_HELP_LINE19 ); VrfPrintStringFromResources( IDS_HELP_LINE20 ); VrfPrintStringFromResources( IDS_HELP_LINE21 ); VrfPrintStringFromResources( IDS_HELP_LINE22 ); VrfPrintStringFromResources( IDS_HELP_LINE23 ); VrfPrintStringFromResources( IDS_HELP_LINE24 ); VrfPrintStringFromResources( IDS_HELP_LINE25 ); VrfPrintStringFromResources( IDS_HELP_LINE26 ); VrfPrintStringFromResources( IDS_HELP_LINE27 ); VrfPrintStringFromResources( IDS_HELP_LINE28 ); VrfPrintStringFromResources( IDS_HELP_LINE29 ); VrfPrintStringFromResources( IDS_HELP_LINE30 ); VrfPrintStringFromResources( IDS_HELP_LINE31 ); } ///////////////////////////////////////////////////////////////////////////// // // See if the user asked to reset all the existing verifier settings // BOOL CmdLineFindResetSwitch( INT argc, TCHAR *argv[] ) { BOOL bFound; TCHAR szCmdLineOption[ 64 ]; bFound = FALSE; if( 2 == argc ) { VERIFY( VrfLoadString( IDS_RESET_CMDLINE_SWITCH, szCmdLineOption, ARRAY_LENGTH( szCmdLineOption ) ) ); bFound = ( _tcsicmp( argv[ 1 ], szCmdLineOption) == 0 ); } return bFound; } ///////////////////////////////////////////////////////////////////////////// // // See if we need to start logging statistics // BOOL CmdLineExecuteIfLog( INT argc, TCHAR *argv[] ) { INT nCrtArg; BOOL bStartLogging; LPCTSTR szLogFileName; DWORD dwLogMillisec; FILE *file; TCHAR szLogCmdLineOption[ 64 ]; TCHAR szIntervalCmdLineOption[ 64 ]; bStartLogging = FALSE; szLogFileName = NULL; if( argc < 2 ) { // // Need at least /log LOG_FILE_NAME IN THE CMD LINE // goto Done; } // // Default log period - 30 sec // dwLogMillisec = 30000; VERIFY( VrfLoadString( IDS_LOG_CMDLINE_SWITCH, szLogCmdLineOption, ARRAY_LENGTH( szLogCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_INTERVAL_CMDLINE_SWITCH, szIntervalCmdLineOption, ARRAY_LENGTH( szIntervalCmdLineOption ) ) ); for( nCrtArg = 1; nCrtArg < argc - 1; nCrtArg += 1 ) { if( _tcsicmp( argv[ nCrtArg ], szLogCmdLineOption) == 0 ) { // // Start logging // bStartLogging = TRUE; szLogFileName = argv[ nCrtArg + 1 ]; } else { if( _tcsicmp( argv[ nCrtArg ], szIntervalCmdLineOption) == 0 ) { // // Logging period // dwLogMillisec = _ttoi( argv[ nCrtArg + 1 ] ) * 1000; } } } if( TRUE == bStartLogging ) { ASSERT( szLogFileName != NULL ); while( TRUE ) { // // Open the file // file = _tfopen( szLogFileName, TEXT("a+") ); if( file == NULL ) { // // print a error message // VrfTPrintfResourceFormat( IDS_CANT_APPEND_FILE, szLogFileName ); break; } // // Dump current information // if( ! VrfDumpStateToFile ( file ) ) { // // Insufficient disk space ? // VrfTPrintfResourceFormat( IDS_CANT_WRITE_FILE, szLogFileName ); } fflush( file ); VrfFTPrintf( file, TEXT("\n\n") ); // // Close the file // fclose( file ); // // Sleep // Sleep( dwLogMillisec ); } } Done: return bStartLogging; } ///////////////////////////////////////////////////////////////////////////// // // See if we need to dump the statistics to the console // BOOL CmdLineExecuteIfQuery( INT argc, TCHAR *argv[] ) { BOOL bFoundCmdLineSwitch; TCHAR szCmdLineSwitch[ 64 ]; bFoundCmdLineSwitch = FALSE; VERIFY( VrfLoadString( IDS_QUERY_CMDLINE_SWITCH, szCmdLineSwitch, ARRAY_LENGTH( szCmdLineSwitch ) ) ); // // Search for our switch in the command line // if( argc == 2 && _tcsicmp( argv[1], szCmdLineSwitch) == 0) { bFoundCmdLineSwitch = TRUE; VrfDumpStateToFile( stdout ); } return bFoundCmdLineSwitch; } ///////////////////////////////////////////////////////////////////////////// // // 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( VrfLoadString( 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; VrfDumpRegistrySettingsToConsole(); } return bFoundCmdLineSwitch; } ///////////////////////////////////////////////////////////////////////////// // // Get the new flags, drivers and volatile // if they have been specified // VOID CmdLineGetFlagsDriversVolatile( INT argc, TCHAR *argv[], DWORD &dwNewFlags, BOOL &bHaveNewFlags, CStringArray &astrNewDrivers, BOOL &bHaveNewDrivers, BOOL &bHaveVolatile, BOOL &bVolatileAddDriver ) { INT nCrtArg; NTSTATUS Status; UNICODE_STRING ustrFlags; TCHAR szFlagsCmdLineOption[ 64 ]; TCHAR szAllCmdLineOption[ 64 ]; TCHAR szVolatileCmdLineOption[ 64 ]; TCHAR szDriversCmdLineOption[ 64 ]; TCHAR szAddDriversCmdLineOption[ 64 ]; TCHAR szRemoveDriversCmdLineOption[ 64 ]; TCHAR szStandardCmdLineOption[ 64 ]; #ifndef UNICODE // // ANSI // INT nNameLength; LPWSTR szUnicodeName; #endif //#ifndef UNICODE astrNewDrivers.RemoveAll(); bHaveNewFlags = FALSE; bHaveNewDrivers = FALSE; bHaveVolatile = FALSE; // // Load the switches from the resources // VERIFY( VrfLoadString( IDS_FLAGS_CMDLINE_SWITCH, szFlagsCmdLineOption, ARRAY_LENGTH( szFlagsCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_ALL_CMDLINE_SWITCH, szAllCmdLineOption, ARRAY_LENGTH( szAllCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_DONTREBOOT_CMDLINE_SWITCH, szVolatileCmdLineOption, ARRAY_LENGTH( szVolatileCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_DRIVER_CMDLINE_SWITCH, szDriversCmdLineOption, ARRAY_LENGTH( szDriversCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_ADDDRIVER_CMDLINE_SWITCH, szAddDriversCmdLineOption, ARRAY_LENGTH( szAddDriversCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_REMOVEDRIVER_CMDLINE_SWITCH, szRemoveDriversCmdLineOption, ARRAY_LENGTH( szRemoveDriversCmdLineOption ) ) ); VERIFY( VrfLoadString( IDS_STANDARD_CMDLINE_SWITCH, szStandardCmdLineOption, ARRAY_LENGTH( szStandardCmdLineOption ) ) ); // // Parse all the cmd line arguments, looking for ours // for( nCrtArg = 1; nCrtArg < argc; nCrtArg += 1 ) { if( _tcsicmp( argv[ nCrtArg ], szFlagsCmdLineOption) == 0 ) { if( nCrtArg < argc - 1 ) { // // Not the last cmd line arg - look for the flags next // #ifdef UNICODE // // UNICODE // RtlInitUnicodeString( &ustrFlags, argv[ nCrtArg + 1 ] ); #else // // ANSI // nNameLength = strlen( argv[ nCrtArg + 1 ] ); szUnicodeName = new WCHAR[ nNameLength + 1 ]; if( NULL == szUnicodeName ) { VrfErrorResourceFormat( IDS_NOT_ENOUGH_MEMORY ); goto DoneWithFlags; } MultiByteToWideChar( CP_ACP, 0, argv[ nCrtArg + 1 ], -1, szUnicodeName, nNameLength + 1 ); RtlInitUnicodeString( &ustrFlags, szUnicodeName ); #endif Status = RtlUnicodeStringToInteger( &ustrFlags, 0, &dwNewFlags ); if( NT_SUCCESS( Status ) ) { bHaveNewFlags = TRUE; } #ifndef UNICODE // // ANSI // ASSERT( NULL != szUnicodeName ); delete [] szUnicodeName; szUnicodeName = NULL; DoneWithFlags: NOTHING; #endif } } else if( _tcsicmp( argv[ nCrtArg ], szAllCmdLineOption) == 0 ) { // // Verify all drivers // bHaveVolatile = FALSE; astrNewDrivers.Add( _T( '*' ) ); bHaveNewDrivers = TRUE; } else if( _tcsicmp( argv[ nCrtArg ], szStandardCmdLineOption) == 0 ) { // // Standard verifier flags // dwNewFlags = VrfGetStandardFlags(); bHaveNewFlags = TRUE; } else if( _tcsicmp( argv[ nCrtArg ], szVolatileCmdLineOption) == 0 ) { // // Volatile // bHaveVolatile = TRUE; } else if( _tcsicmp( argv[ nCrtArg ], szDriversCmdLineOption) == 0 ) { // // /Driver // bHaveVolatile = FALSE; CmdLineGetDriversFromArgv( argc, argv, nCrtArg + 1, astrNewDrivers, bHaveNewDrivers ); // // All done - all the rest of argumentshave been driver names // break; } else if( bHaveVolatile && _tcsicmp( argv[ nCrtArg ], szAddDriversCmdLineOption) == 0 ) { // // /adddriver // bVolatileAddDriver = TRUE; CmdLineGetDriversFromArgv( argc, argv, nCrtArg + 1, astrNewDrivers, bHaveNewDrivers ); // // All done - all the rest of argumentshave been driver names // break; } else if( bHaveVolatile && _tcsicmp( argv[ nCrtArg ], szRemoveDriversCmdLineOption) == 0 ) { // // /removedriver // bVolatileAddDriver = FALSE; CmdLineGetDriversFromArgv( argc, argv, nCrtArg + 1, astrNewDrivers, bHaveNewDrivers ); // // All done - all the rest of arguments have been driver names // break; } } // // If we have new drivers look if they are miniports // if( bHaveNewDrivers ) { VrfAddMiniports( astrNewDrivers ); } } ///////////////////////////////////////////////////////////////////////////// // // Everything that follows after /driver, /adddriver, /removedriver // should be driver names. Extract these from the command line // VOID CmdLineGetDriversFromArgv( INT argc, TCHAR *argv[], INT nFirstDriverArgIndex, CStringArray &astrNewDrivers, BOOL &bHaveNewDrivers ) { INT nDriverArg; bHaveNewDrivers = FALSE; astrNewDrivers.RemoveAll(); // // Everything in the command line from here on should be driver names // for( nDriverArg = nFirstDriverArgIndex; nDriverArg < argc; nDriverArg += 1 ) { astrNewDrivers.Add( argv[ nDriverArg ] ); } bHaveNewDrivers = ( astrNewDrivers.GetSize() > 0 ); }