Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3852 lines
141 KiB

// --------------------------------------
//
// Copyright (c) 1990 Microsoft Corporation
//
// Module Name:
//
// tpctl.c
//
// Abstract:
//
// This is the main component of the NDIS 3.0 MAC Tester control program.
//
// Author:
//
// Tom Adams (tomad) 2-Apr-1991
//
// Revision History:
//
// 2-Apr-1991 tomad
//
// created
//
// Sanjeev Katariya (sanjeevk) 4-6-1993
//
// Bug #5203: Changed the routine TpRunTest() at the point where the OPEN returns
// and the InformationBuffer contains information about the address and
// the Medium Type. This was made in order to satisfy the correct setting
// of the OID on multicast addresses(FDDI, 802.3).
// Added support for commands DISABLE, ENABLE, SHELL, RECORDINGENABLE, RECORDINGDISABLE,
// Tpctl Options w,c and ?, fixed multicast address accounting
//
// Tim Wynsma (timothyw) 4-27-94
// Added performance testing
// 5-18-94
// Added hooks for globvars; cleanup
// 6-08-94
// Chgd perf test to client/server model
//
// --------------------------------
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tpctl.h"
#include "parse.h"
BOOL ToolActive = TRUE;
extern BOOL WriteThrough ;
extern BOOL ContinueOnError;
DWORD
TpctlRunTest(
IN HANDLE hFileHandle
)
// -----
//
// Routine Description:
//
// This routine is the main funciton of the TPCTL program. It
// prompts the user for commands, or reads them from the script
// file, and then issues the call to NtDeviceIoControlFile.
//
// Arguments:
//
// IN HANDLE hFileHandle - Supplies the handle to the Test Protocol
// driver where the IOCTLs will be directed.
//
// Return Value:
//
// DWORD - the status of the last call to take place.
//
// -----
{
BYTE Buffer[TPCTL_CMDLINE_SIZE];
LPSTR localArgv[TPCTL_MAX_ARGC];
DWORD localArgc;
DWORD CmdCode;
DWORD Status = NO_ERROR;
NTSTATUS NtStatus;
HANDLE Event;
HANDLE Event1;
IO_STATUS_BLOCK IoStatusBlock;
IO_STATUS_BLOCK IoStatusBlock2;
HANDLE InputBuffer;
DWORD InputBufferSize = 8*IOCTL_BUFFER_SIZE;
HANDLE OutputBuffer;
HANDLE OutputBuffer2;
DWORD OutputBufferSize = 8*IOCTL_BUFFER_SIZE;
DWORD OutputBufferSize2;
DWORD WaitTime;
BOOL IoctlCommand = FALSE;
PCMD_ARGS CmdArgs;
DWORD OpenInstance;
InputBuffer = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,InputBufferSize );
if ( InputBuffer == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tGlobalAlloc failed to alloc InputBuffer: returned 0x%lx.\n",
(PVOID)Status);
return Status;
}
CmdArgs = (PCMD_ARGS)InputBuffer;
OutputBuffer = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,OutputBufferSize );
if ( OutputBuffer == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tGlobalAlloc failed to alloc OutputBuffer: returned 0x%lx.\n",
(PVOID)Status);
GlobalFree( InputBuffer );
return Status;
}
Event = CreateEvent( NULL,FALSE,FALSE,NULL );
if (Event == NULL)
{
Status = GetLastError();
TpctlErrorLog("\n\tCreateEvent failed: returned 0x%lx.\n",(PVOID)Status);
GlobalFree( InputBuffer );
GlobalFree( OutputBuffer );
return Status;
}
while ( ExitFlag == FALSE )
{
if ( ContinueLooping == FALSE )
{
//
// A Ctrl-c has been entered, If we are reading commands
// from a script file then reset all the open blocks, and
// close the script files.
//
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
ContinueLooping = TRUE;
}
Status = TpctlReadCommand( TPCTL_PROMPT,Buffer,TPCTL_CMDLINE_SIZE );
if ( Status != NO_ERROR )
{
printf("STATUS == Some error\n");
//
// there was an error in the last command entered. If we
// are reading commands from a script file then reset all
// the open blocks, and close the script files.
//
if ( !ContinueOnError )
{
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
}
continue;
}
else if (( !TpctlParseCommand( Buffer,
localArgv,
&localArgc,
TPCTL_MAX_ARGC )) &&
( CommandsFromScript == TRUE ))
{
printf("which means parse command failed.\n");
if ( !ContinueOnError )
{
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
}
continue;
}
if (( localArgc <= 0 ) || ( localArgv[0][0] == ';' ))
{
continue;
}
CmdCode = TpctlGetCommandCode( localArgv[0] );
switch( CmdCode )
{
case VERBOSE:
if ( ToolActive )
{
Verbose = ( Verbose ) ? FALSE : TRUE;
TpctlLog("\n\tTpctl: Verbose Mode enabled.\n",NULL);
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
}
CmdCode = CMD_COMPLETED;
break;
case SETENV:
if ( ToolActive )
{
if ( TpctlParseArguments( SetEnvOptions,
Num_SetEnv_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetEnvOptions,
Num_SetEnv_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
TpctlSaveNewEnvironmentVariables( CmdArgs->OpenInstance - 1 );
}
CmdCode = CMD_COMPLETED;
break;
case READSCRIPT:
if ( ToolActive )
{
if ( TpctlParseArguments( ReadScriptOptions,
Num_ReadScript_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( ReadScriptOptions,
Num_ReadScript_Params,
localArgc,
localArgv );
}
Status = TpctlLoadFiles(GlobalCmdArgs.ARGS.FILES.ScriptFile,
GlobalCmdArgs.ARGS.FILES.LogFile );
if ( Status != NO_ERROR )
{
if ( !ContinueOnError )
{
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
}
}
}
CmdCode = CMD_COMPLETED;
break;
case BEGINLOGGING:
if( ToolActive )
{
if ( CommandsFromScript == TRUE )
{
TpctlErrorLog("\n\tTpctl: Already logging results to \"%s\".\n",
(PVOID)Scripts[ScriptIndex].LogFile);
}
else if ( CommandLineLogging == TRUE )
{
TpctlErrorLog("\n\tTpctl: Command Line Logging is already enabled.\n",NULL);
}
else
{
if ( TpctlParseArguments( LoggingOptions,
Num_Logging_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( LoggingOptions,
Num_Logging_Params,
localArgc,
localArgv );
}
CommandLineLogHandle = TpctlOpenLogFile();
if ( CommandLineLogHandle == (HANDLE)-1 )
{
TpctlErrorLog("\n\tTpctl: failed to open Log File.\n",NULL);
}
else
{
CommandLineLogging = TRUE;
}
}
}
CmdCode = CMD_COMPLETED;
break;
case ENDLOGGING:
if ( ToolActive )
{
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
if ( CommandLineLogging == TRUE )
{
TpctlCloseLogFile();
CommandLineLogging = FALSE;
}
else
{
TpctlErrorLog("\n\tTpctl: Logging is not enabled.\n\n",NULL);
}
}
CmdCode = CMD_COMPLETED;
break;
case RECORDINGENABLE:
if( ToolActive )
{
if ( RecordToScript == TRUE )
{
TpctlErrorLog("\n\tTpctl: Already recording commands to \"%s\".\n",
(PVOID)RecordScriptName );
}
else
{
if ( TpctlParseArguments( RecordingOptions,
Num_Recording_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
ScriptRecordHandle = TpctlOpenScriptFile();
if ( ScriptRecordHandle == (HANDLE)-1 )
{
TpctlErrorLog("\n\tTpctl: failed to open script record File.\n",NULL);
}
else
{
RecordToScript = TRUE;
}
}
}
CmdCode = CMD_COMPLETED;
break;
case RECORDINGDISABLE:
if ( ToolActive )
{
if ( RecordToScript == TRUE )
{
TpctlCloseScriptFile();
RecordToScript = FALSE;
}
else
{
TpctlErrorLog("\n\tTpctl: Script Recording is not enabled.\n\n",NULL);
}
}
CmdCode = CMD_COMPLETED;
break;
case WAIT:
if ( ToolActive )
{
if ( localArgv[1] != NULL )
{
WaitTime = atol( localArgv[1] );
}
else
{
WaitTime = 0;
}
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
min(2,localArgc),
localArgv );
}
TpctlLog("\n\tTpctl: Waiting for %d seconds.\n",(PVOID)WaitTime);
//
// Multiply by 1000 to convert seconds to msecs for us by
// Sleep().
//
Sleep( WaitTime * 1000 );
}
CmdCode = CMD_COMPLETED;
break;
case GO:
case PAUSE:
if ( ToolActive )
{
if ( TpctlParseArguments( PauseGoOptions,
Num_PauseGo_Params - 1, // Ignore Unique Signature
// while parsing arguments.
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( PauseGoOptions,
Num_PauseGo_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
TpctlPauseGo( hFileHandle,CmdArgs,InputBufferSize,CmdCode );
}
CmdCode = CMD_COMPLETED;
break;
case LOAD:
case UNLOAD:
if ( ToolActive )
{
if ( TpctlParseArguments( LoadUnloadOptions,
Num_LoadUnload_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( LoadUnloadOptions,
Num_LoadUnload_Params,
localArgc,
localArgv );
}
TpctlLoadUnload( CmdCode );
}
CmdCode = CMD_COMPLETED;
break;
case OPEN: // NdisOpenAdapter
if ( ToolActive )
{
if ( TpctlParseArguments( OpenOptions,
Num_Open_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenOptions,
Num_Open_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == TRUE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter is already opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case CLOSE: // NdisCloseAdapter
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_COMPLETED;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETPF:
if ( ToolActive )
{
if ( TpctlParseArguments( SetPacketFilterOptions,
Num_SetPacketFilter_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetPacketFilterOptions,
Num_SetPacketFilter_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETLA:
if ( ToolActive )
{
if ( TpctlParseArguments( SetLookaheadOptions,
Num_SetLookahead_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetLookaheadOptions,
Num_SetLookahead_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case ADDMA:
case DELMA:
if ( ToolActive )
{
if ( TpctlParseArguments( MulticastAddrOptions,
Num_MulticastAddr_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( MulticastAddrOptions,
Num_MulticastAddr_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETFA:
if ( ToolActive )
{
if ( TpctlParseArguments( FunctionalAddrOptions,
Num_FunctionalAddr_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( FunctionalAddrOptions,
Num_FunctionalAddr_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETGA:
if ( ToolActive )
{
if ( TpctlParseArguments( GroupAddrOptions,
Num_GroupAddr_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( GroupAddrOptions,
Num_GroupAddr_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETINFO: // NdisSetInformation
if ( ToolActive )
{
DWORD tmpArgc = 1;
LPSTR tmpArgv[2];
if ( localArgc > 1 )
{
TpctlParseSetInfoArguments( &localArgc,
localArgv,
&tmpArgc,
tmpArgv );
}
if ( TpctlParseArguments( SetInfoOptions,
Num_SetInfo_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoOptions,
Num_SetInfo_Params,
localArgc,
localArgv );
}
//
// If the information class argument is one of Station Address,
// Functional Address, or Lookahead Size, then we need to
// continue parsing the arguments because we have not found
// the class specific argument needed in these three cases.
//
switch ( GlobalCmdArgs.ARGS.TPSET.OID )
{
case OID_GEN_CURRENT_PACKET_FILTER:
if ( TpctlParseArguments( SetInfoPFOptions,
Num_SetInfoPF_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoPFOptions,
Num_SetInfoPF_Params,
tmpArgc,
tmpArgv );
}
break;
case OID_GEN_CURRENT_LOOKAHEAD:
if ( TpctlParseArguments( SetInfoLAOptions,
Num_SetInfoLA_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoLAOptions,
Num_SetInfoLA_Params,
tmpArgc,
tmpArgv );
}
break;
case OID_802_3_MULTICAST_LIST:
if ( TpctlParseArguments( SetInfoMAOptions,
Num_SetInfoMA_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoMAOptions,
Num_SetInfoMA_Params,
tmpArgc,
tmpArgv );
}
break;
case OID_FDDI_LONG_MULTICAST_LIST :
if ( TpctlParseArguments( SetInfoMAOptions,
Num_SetInfoMA_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoMAOptions,
Num_SetInfoMA_Params,
tmpArgc,
tmpArgv );
}
break;
case OID_FDDI_SHORT_CURRENT_ADDR :
//
// Not implemented yet
//
break;
case OID_FDDI_LONG_CURRENT_ADDR :
//
// Not implemented yet
//
break;
case OID_FDDI_SHORT_MULTICAST_LIST :
//
// Not implemented yet
//
break;
case OID_802_5_CURRENT_FUNCTIONAL:
if ( TpctlParseArguments( SetInfoFAOptions,
Num_SetInfoFA_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoFAOptions,
Num_SetInfoFA_Params,
tmpArgc,
tmpArgv );
}
break;
case OID_802_5_CURRENT_GROUP:
if ( TpctlParseArguments( SetInfoGAOptions,
Num_SetInfoGA_Params,
tmpArgc,
tmpArgv ) == -1 )
{
CmdCode = CMD_ERR;
}
if ( RecordToScript )
{
TpctlRecordArguments( SetInfoGAOptions,
Num_SetInfoGA_Params,
tmpArgc,
tmpArgv );
}
break;
} // end switch
if ( CmdCode == CMD_ERR )
{
break;
}
if ( !TpctlInitCommandBuffer(CmdArgs,SETINFO))
{
CmdCode = CMD_COMPLETED;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
break;
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case QUERYINFO:
if ( ToolActive )
{
if ( TpctlParseArguments( QueryInfoOptions,
Num_QueryInfo_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( QueryInfoOptions,
Num_QueryInfo_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_COMPLETED;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case QUERYSTATS:
if ( ToolActive )
{
if ( TpctlParseArguments( QueryStatsOptions,
Num_QueryStats_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( QueryStatsOptions,
Num_QueryStats_Params,
localArgc,
localArgv );
}
TpctlQueryStatistics( GlobalCmdArgs.ARGS.TPQUERYSTATS.DeviceName,
GlobalCmdArgs.ARGS.TPQUERYSTATS.OID,
NULL, //StatsBuffer,
0); //BufLen
}
CmdCode = CMD_COMPLETED;
break;
case RESET: // NdisReset
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SEND: // NdisSend
if ( ToolActive )
{
if ( TpctlParseArguments( SendOptions,
Num_Send_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( SendOptions,
Num_Send_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Is this Open Instance already sending packets?
//
if ( Open[OpenInstance].Sending == TRUE )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: Packets are currently being sent on Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
else if ( Open[OpenInstance].SendResultsCompleted == TRUE )
{
//
// A previous SEND test has left some results in the SEND
// RESULTS buffer, and they have not been printed.
//
TpctlLog("\n\tTpctl: Results exist for a prior SEND test.\n",NULL);
TpctlPrintSendResults( Open[OpenInstance].SendResults );
Open[OpenInstance].SendResultsCompleted = FALSE;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// Send IoStatusBlock, and the OutputBuffer to point to its
// SendResults structure.
//
IoStatusBlock2 = Open[OpenInstance].SendStatusBlock;
OutputBuffer2 = Open[OpenInstance].SendResults;
OutputBufferSize2 = sizeof( SEND_RECEIVE_RESULTS );
//
// Set up the Send Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPSEND];
if ( !ResetEvent( Open[OpenInstance].SendEvent ))
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: failed to reset Send Event 0x%lx.\n",
(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
//
// Finally set the Sending flag for this Open Instance,
//
Open[OpenInstance].Sending = TRUE;
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case STOPSEND:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
//
// Is this Open Instance currently sending packets?
//
if ( Open[OpenInstance].Sending == FALSE )
{
//
// If not are the any results to report?
//
if ( Open[OpenInstance].SendResultsCompleted == FALSE )
{
//
// If not, print an error message and prompt for next
// command.
//
TpctlErrorLog(
"\n\tTpctl: A SEND test is not currently running for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_COMPLETED;
break;
}
else // SendResultsCompleted == TRUE
{
//
// If there are results from a previous send, then print
// them, reset the flags, and prompt for the command.
//
TpctlPrintSendResults(Open[OpenInstance].SendResults);
Open[OpenInstance].SendResultsCompleted = FALSE;
Open[OpenInstance].Sending = FALSE;
CmdCode = CMD_COMPLETED;
break;
}
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case WAITSEND:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
if ( Open[OpenInstance].SendResultsCompleted == TRUE )
{
TpctlPrintSendResults( Open[OpenInstance].SendResults );
Open[OpenInstance].SendResultsCompleted = FALSE;
Open[OpenInstance].Sending = FALSE;
}
else if ( Open[OpenInstance].Sending == TRUE )
{
ContinueLooping = TRUE;
do
{
Status = WaitForSingleObject( Open[OpenInstance].SendEvent,
1000); // One_Second
if (( Status != NO_ERROR ) &&
( Status != WAIT_TIMEOUT ))
{
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
}
} while (( Status != NO_ERROR ) && ( ContinueLooping == TRUE ));
if ( ContinueLooping == FALSE )
{
TpctlLog("\n\tTpctl: Cancelling WaitSend command.\n",NULL);
}
else
{
TpctlPrintSendResults( Open[OpenInstance].SendResults );
Open[OpenInstance].SendResultsCompleted = FALSE;
Open[OpenInstance].Sending = FALSE;
}
}
else
{
TpctlErrorLog("\n\tTpctl: No Send results exist, and no Send test is\n",
NULL);
TpctlErrorLog("\t currently running for Open Instance %lu.\n",
(PVOID)CmdArgs->OpenInstance);
}
}
CmdCode = CMD_COMPLETED;
break;
case RECEIVE:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Is this Open Instance already receiveing packets?
//
if ( Open[OpenInstance].Receiving == TRUE )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: Packets are currently being received on Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
else if ( Open[OpenInstance].ReceiveResultsCompleted == TRUE )
{
//
// A previous RECEIVE test has left some results in the RECEIVE
// RESULTS buffer, and they have not been printed.
//
TpctlLog("\n\tTpctl: Results exist for a prior RECEIVE test.\n",NULL);
TpctlPrintReceiveResults(Open[OpenInstance].ReceiveResults);
Open[OpenInstance].ReceiveResultsCompleted = FALSE;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// Send IoStatusBlock, and the OutputBuffer to point to its
// ReceiveResults structure.
//
IoStatusBlock2 = Open[OpenInstance].ReceiveStatusBlock;
OutputBuffer2 = Open[OpenInstance].ReceiveResults;
OutputBufferSize2 = sizeof( SEND_RECEIVE_RESULTS );
//
// Set up the Receive Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPRECEIVE];
if (!ResetEvent(Open[OpenInstance].ReceiveEvent))
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: failed to reset Receive Event 0x%lx.\n",
(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
//
// Finally set the Receiving flag for this Open Instance,
//
Open[OpenInstance].Receiving = TRUE;
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case STOPREC:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
//
// Is this Open Instance receiving packets?
//
if ( Open[OpenInstance].Receiving == FALSE )
{
//
// If not are the any results to report?
//
if ( Open[OpenInstance].ReceiveResultsCompleted == FALSE )
{
//
// If not, print an error message and prompt for next
// command.
//
TpctlErrorLog(
"\n\tTpctl: A RECEIVE test is not currently running for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
else // ReceiveResultsCompleted == TRUE
{
TpctlPrintReceiveResults( Open[OpenInstance].ReceiveResults );
Open[OpenInstance].ReceiveResultsCompleted = FALSE;
Open[OpenInstance].Receiving = FALSE;
CmdCode = CMD_COMPLETED;
break;
}
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case GETEVENTS:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
TpctlGetEvents( hFileHandle,CmdArgs,InputBufferSize );
}
CmdCode = CMD_COMPLETED;
break;
case STRESS:
if ( ToolActive )
{
if ( TpctlParseArguments( StressOptions,
Num_Stress_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( StressOptions,
Num_Stress_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Is this Open Instance already running a stress test?
//
if ( Open[OpenInstance].Stressing == TRUE )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: A Stress test is currently running for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
else if ( Open[OpenInstance].StressResultsCompleted == TRUE )
{
//
// A previous STRESS test has left some results in the STRESS
// RESULTS buffer, and they have not been printed.
//
TpctlLog("\n\tTpctl: Results exist for a prior STRESS test.\n",NULL);
TpctlPrintStressResults(Open[OpenInstance].StressResults,
Open[OpenInstance].Ack10 );
Open[OpenInstance].StressResultsCompleted = FALSE;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// Stress IoStatusBlock, and the OutputBuffer to point to its
// StressResults structure.
//
IoStatusBlock2 = Open[OpenInstance].StressStatusBlock;
OutputBuffer2 = Open[OpenInstance].StressResults;
OutputBufferSize2 = sizeof( STRESS_RESULTS );
//
// Set up the Stress Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPSTRESS];
if (!ResetEvent(Open[OpenInstance].StressEvent))
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: failed to reset Stress Event 0x%lx.\n",
(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
//
// if we are running a stress test with a response type of
// ack 10 times for every packet, set the flag for displaying.
//
if ( CmdArgs->ARGS.TPSTRESS.ResponseType == ACK_10_TIMES )
{
Open[OpenInstance].Ack10 = TRUE;
}
else
{
Open[OpenInstance].Ack10 = FALSE;
}
//
// Finally set the Stressing flag for this Open Instance,
//
Open[OpenInstance].Stressing = TRUE;
//
// the flag indicating that a Client is running on this Open
// Instance,
//
Open[OpenInstance].StressClient = TRUE;
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case STRESSSERVER:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Is this Open Instance already running a stress test?
//
if ( Open[OpenInstance].Stressing == TRUE )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: A Stress test is currently running for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// IoStatusBlock, and the OutputBuffer to point to its
// StressResults structure.
//
IoStatusBlock2 = Open[OpenInstance].StressStatusBlock;
OutputBuffer2 = Open[OpenInstance].StressResults;
OutputBufferSize2 = sizeof( STRESS_RESULTS );
//
// Set up the Stress Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPSTRESS];
if (!ResetEvent(Open[OpenInstance].StressEvent))
{
Status = GetLastError();
TpctlErrorLog(
"\n\tTpctl: failed to reset Stress Event 0x%lx.\n",(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
//
// Finally set the Stressing flag for this Open Instance,
//
Open[OpenInstance].Stressing = TRUE;
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case ENDSTRESS:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
//
// Is this Open Instance running a stress test?
//
if ( Open[OpenInstance].Stressing == FALSE )
{
//
// If not, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: A Stress test is not currently running for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_COMPLETED;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case WAITSTRESS:
case CHECKSTRESS:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
if ( Open[OpenInstance].StressResultsCompleted == TRUE )
{
TpctlPrintStressResults(Open[OpenInstance].StressResults,
Open[OpenInstance].Ack10 );
Open[OpenInstance].StressResultsCompleted = FALSE;
Open[OpenInstance].Stressing = FALSE;
}
else if ( Open[OpenInstance].Stressing == TRUE )
{
if ( Open[OpenInstance].StressClient != TRUE )
{
TpctlErrorLog("\n\tTpctl: %s command valid only for Stress Clients.\n",
TpctlGetCommandName( localArgv[0] ));
CmdCode = CMD_ERR;
break;
}
if ( CmdCode == WAITSTRESS )
{
ContinueLooping = TRUE;
do
{
Status = WaitForSingleObject( Open[OpenInstance].StressEvent,
1000); // One_Second
if (( Status != NO_ERROR ) &&
( Status != WAIT_TIMEOUT ))
{
TpctlErrorLog(
"\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
}
} while (( Status != NO_ERROR ) &&
( ContinueLooping == TRUE ));
if ( ContinueLooping == FALSE )
{
TpctlLog("\n\tTpctl: Cancelling WaitStress command.\n",NULL);
}
else
{
TpctlPrintStressResults(Open[OpenInstance].StressResults,
Open[OpenInstance].Ack10 );
Open[OpenInstance].StressResultsCompleted = FALSE;
Open[OpenInstance].Stressing = FALSE;
}
}
else
{
TpctlLog("\n\tTpctl: The Stress test is still running.\n",NULL);
}
}
else
{
TpctlErrorLog("\n\tTpctl: No Stress results exist, and no Stress test is\n",
NULL);
TpctlErrorLog("\t currently running for Open Instance %lu.\n",
(PVOID)CmdArgs->OpenInstance);
}
}
CmdCode = CMD_COMPLETED;
break;
case BREAKPOINT:
if ( !ToolActive )
{
CmdCode = CMD_COMPLETED;
}
else
{
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
}
break;
case QUIT:
if ( ToolActive )
{
DWORD i;
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
//
// If there are any outstanding ASYNC IRPs print a message
// to the user to wait patiently.
//
for (i=0;i<NUM_OPEN_INSTANCES;i++ )
{
if ((( Open[i].Stressing == TRUE ) ||
( Open[i].Sending == TRUE )) ||
( Open[i].Receiving == TRUE ))
{
TpctlErrorLog(
"\n\tTpctl: Cancelling outstanding IRPs, please wait...\n",NULL);
break;
}
}
ExitFlag = TRUE;
Status = NO_ERROR;
}
CmdCode = CMD_COMPLETED;
break;
case HELP:
if ( ToolActive )
{
DWORD TmpScriptIndex = ScriptIndex;
//
// We are going to temporarily override the script index
// to fool the TpctlParseArguments routine into not prompting
// for an argument if none is give with the help command.
//
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
ScriptIndex = (DWORD)1;
if ( TpctlParseArguments( HelpOptions,
Num_Help_Params,
localArgc,
localArgv ) == -1 )
{
break;
}
TpctlHelp( GlobalCmdArgs.ARGS.CmdName );
ScriptIndex = TmpScriptIndex;
}
CmdCode = CMD_COMPLETED;
break;
case SHELL:
if ( ToolActive )
{
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
1,
localArgv );
}
{
CONSOLE_SCREEN_BUFFER_INFO ScreenBuffer;
HANDLE OutputHandle;
COORD Start;
BOOL NoErrorsAccessingConsole = FALSE;
DWORD CharactersWritten;
ZeroMemory( (PVOID)&ScreenBuffer, sizeof(CONSOLE_SCREEN_BUFFER_INFO));
Start.X = 0;
Start.Y = 0;
OutputHandle = GetStdHandle( STD_OUTPUT_HANDLE );
//
// Record the old console settings
//
if ( GetConsoleScreenBufferInfo( OutputHandle, &ScreenBuffer ) )
{
NoErrorsAccessingConsole = TRUE;
}
//
// Set the console foregrounds and background colors to the new settings
//
if( NoErrorsAccessingConsole )
{
WORD Colors;
if ( ScreenBuffer.wAttributes & BACKGROUND_BLUE )
{
Colors = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|
FOREGROUND_INTENSITY|BACKGROUND_RED;
}
else
{
Colors = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|
FOREGROUND_INTENSITY|BACKGROUND_BLUE;
}
SetConsoleTextAttribute( OutputHandle, Colors );
FillConsoleOutputAttribute( OutputHandle, Colors,
0xFFFFFFFF, Start,
&CharactersWritten );
}
//
// And spawn the command shell
//
{
CHAR ShellCommand[256];
INT TmpCount;
ZeroMemory( ShellCommand, sizeof( ShellCommand ));
strcpy( ShellCommand, "CMD" );
if ( localArgc > 1 )
{
strcat( ShellCommand, " /C " );
for( TmpCount = 1; TmpCount < (INT)localArgc; TmpCount++ )
{
strcat( ShellCommand, localArgv[TmpCount] );
strcat( ShellCommand, " " );
}
}
system( ShellCommand );
}
//
// Reset the console foregrounds and background colors to the old settings
//
if( NoErrorsAccessingConsole )
{
SetConsoleTextAttribute( OutputHandle, ScreenBuffer.wAttributes );
FillConsoleOutputAttribute( OutputHandle, ScreenBuffer.wAttributes,
0xFFFFFFFF, Start,
&CharactersWritten );
}
}
printf("\n");
}
CmdCode = CMD_COMPLETED;
break;
case DISABLE:
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
localArgc,
localArgv );
}
if ( Disable( localArgc, localArgv ) )
{
printf( "\n\tDisabling TPCTL...\n\n" );
}
CmdCode = CMD_COMPLETED;
break;
case ENABLE:
ToolActive = TRUE;
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
localArgc,
localArgv );
}
printf( "\n\tEnabling TPCTL...\n\n" );
CmdCode = CMD_COMPLETED;
break;
case REGISTRY:
if ( ToolActive )
{
if ( TpctlParseArguments( RegistryOptions,
Num_Registry_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( RegistryOptions,
Num_Registry_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
TpctlPerformRegistryOperation( CmdArgs );
}
CmdCode = CMD_COMPLETED;
break;
case PERFSERVER:
if ( ToolActive )
{
if ( TpctlParseArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( OpenInstanceOptions,
Num_OpenInstance_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Is this Open Instance already sending or receiving packets?
//
if ( (Open[OpenInstance].Sending == TRUE ) ||
(Open[OpenInstance].Receiving == TRUE ) ||
(Open[OpenInstance].ReceiveResultsCompleted == TRUE ) ||
(Open[OpenInstance].SendResultsCompleted == TRUE ) )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: Packets are currently being sent or received on Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// Send IoStatusBlock, and the OutputBuffer to point to its
// SendResults structure.
//
IoStatusBlock2 = Open[OpenInstance].PerfStatusBlock;
OutputBuffer2 = Open[OpenInstance].PerfResults;
OutputBufferSize2 = sizeof( PERF_RESULTS );
//
// Set up the Send Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPPERF];
if ( !ResetEvent( Open[OpenInstance].PerfEvent ))
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: failed to reset Perf Event 0x%lx.\n",
(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case PERFCLIENT:
if ( ToolActive )
{
if ( TpctlParseArguments( PerfClntOptions,
Num_PerfClnt_Params,
localArgc,
localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( PerfClntOptions,
Num_PerfClnt_Params,
localArgc,
localArgv );
}
if ( !TpctlInitCommandBuffer( CmdArgs,CmdCode ))
{
CmdCode = CMD_ERR;
break;
}
OpenInstance = CmdArgs->OpenInstance - 1;
if ( Open[OpenInstance].AdapterOpened == FALSE )
{
TpctlErrorLog(
"\n\tTpctl: The adapter has not been opened for Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
//
// Is this Open Instance already sending or receiving packets?
//
if ( (Open[OpenInstance].Sending == TRUE ) ||
(Open[OpenInstance].Receiving == TRUE ) ||
(Open[OpenInstance].ReceiveResultsCompleted == TRUE ) ||
(Open[OpenInstance].SendResultsCompleted == TRUE ) )
{
//
// If so, print an error message and prompt for next command.
//
TpctlErrorLog(
"\n\tTpctl: Packets are currently being sent or received on Open Instance %lu.\n",
(PVOID)(CmdArgs->OpenInstance));
CmdCode = CMD_ERR;
break;
}
//
// Set up the IoStatusBlock to point to this Open Instance's
// Send IoStatusBlock, and the OutputBuffer to point to its
// ReceiveResults structure.
//
IoStatusBlock2 = Open[OpenInstance].PerfStatusBlock;
OutputBuffer2 = Open[OpenInstance].PerfResults;
OutputBufferSize2 = sizeof( PERF_RESULTS );
//
// Set up the Receive Event to wait on.
//
Event1 = Open[OpenInstance].Events[TPPERF];
if (!ResetEvent(Open[OpenInstance].PerfEvent))
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: failed to reset Perf Event 0x%lx.\n",
(PVOID)Status);
CmdCode = CMD_ERR;
break;
}
CpuUsageInit();
}
else
{
CmdCode = CMD_COMPLETED;
}
break;
case SETGLOBAL:
if (ToolActive)
{
if ( TpctlParseSet( localArgc, localArgv ) == -1 )
{
CmdCode = CMD_ERR;
break;
}
if ( RecordToScript )
{
TpctlRecordArguments( NULL,
0,
min(2,localArgc),
localArgv );
}
}
CmdCode = CMD_COMPLETED;
break;
default:
CmdCode = CMD_COMPLETED;
if( ToolActive )
{
TpctlErrorLog("\n\tTpctl: Invalid Command Entered.\n",NULL);
CmdCode = CMD_ERR;
}
break;
} // switch();
//
// If we have a command to issue to the driver and the tool
// is active, do it now.
//
if ( ( CmdCode == STRESS ) || ( CmdCode == STRESSSERVER ) ||
( CmdCode == SEND ) || ( CmdCode == RECEIVE ) ||
( CmdCode == PERFSERVER ) || ( CmdCode == PERFCLIENT ) )
{
//!!NOT WIN32!!
NtStatus = NtDeviceIoControlFile( hFileHandle,
Event1,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock2,
TP_CONTROL_CODE( CmdCode,IOCTL_METHOD ),
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer2,
OutputBufferSize2 );
if (( NtStatus == STATUS_SUCCESS ) ||
( NtStatus == STATUS_PENDING ))
{
TpctlLog("\n\tTpctl: The %s command has been issued.\n",
TpctlGetCommandName( localArgv[0] ));
}
}
else if (( CmdCode != CMD_ERR ) && ( CmdCode != CMD_COMPLETED ))
{
// !!NOT WIN32!!
NtStatus = NtDeviceIoControlFile( hFileHandle,
Event,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock,
TP_CONTROL_CODE( CmdCode,IOCTL_METHOD ),
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer,
OutputBufferSize );
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
//
// If the IOCTL call failed then close any script files
// and break out of while loop by setting the ExitFlag
// to true.
//
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
break;
}
else
{
TpctlLog("\n\tTpctl: The %s command has been issued.\n",
TpctlGetCommandName( localArgv[0] ));
if ( NtStatus == STATUS_PENDING )
{
//
// If the ioctl pended, then wait for it to complete.
//
Status = WaitForSingleObject( Event,60000 ); // ONE_MINUTE
if ( Status == WAIT_TIMEOUT )
{
//
// The wait timed out, this probable means there
// was a failure in the MAC not completing a
// request, because the IRP was never completed
// by the test protocol driver.
//
TpctlErrorLog(
"\n\tTpctl: WARNING - WaitForSingleObject unexpectedly timed out.\n",
NULL);
TpctlErrorLog(
"\t IRP was never completed in protocol driver.\n",
NULL);
CmdCode = CMD_ERR;
}
else if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit
// the test app with the error.
//
TpctlErrorLog(
"\n\tTpctl: ERROR - WaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
CmdCode = CMD_ERR;
}
else if ( IoStatusBlock.Status != STATUS_SUCCESS )
{
//
// else if the pending ioctl returned failure again
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile pended.\n",NULL);
TpctlErrorLog("\n\t NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)IoStatusBlock.Status);
ExitFlag = TRUE;
Status = IoStatusBlock.Status;
}
}
}
}
switch ( CmdCode )
{
case CMD_ERR:
//
// NOTE: if commands are being read from a script file setting
// the CmdCode to CMD_ERR causes this routine to unload ALL
// script files, and wait at the prompt for the next command
// to process, use CMD_ERR wisely.
//
if( !ContinueOnError )
{
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
}
break;
case SETENV:
break;
case OPEN:
if (((PREQUEST_RESULTS)OutputBuffer)->RequestStatus == NDIS_STATUS_SUCCESS )
{
//
// The open request succeeded so mark this open instance
// as opened.
//
Open[OpenInstance].AdapterOpened = TRUE;
//
// if the open "initialization" requests all succeeded
// copy the adapter address into the open, and set the
// open instance.
//
if (((PREQUEST_RESULTS)OutputBuffer)->OpenRequestStatus ==
NDIS_STATUS_SUCCESS )
{
//
// STARTCHANGE
//
// Sanjeevk: Bug #5203
//
PNDIS_MEDIUM MediumType =
(PNDIS_MEDIUM)((PREQUEST_RESULTS)OutputBuffer)->InformationBuffer;
//
// Copy the Media Type
//
Open[OpenInstance].MediumType = *MediumType;
//
// STOPCHANGE
//
//
// Copy the address of the adapter
//
TpctlCopyAdapterAddress(OpenInstance,
(PREQUEST_RESULTS)OutputBuffer );
Open[OpenInstance].OpenInstance = (UCHAR)OpenInstance;
}
}
//
// Now print the Open request results regardless of success or
// failure.
//
TpctlPrintResults( (PREQUEST_RESULTS)OutputBuffer,CmdCode,0 );
break;
case CLOSE:
if (((PREQUEST_RESULTS)OutputBuffer)->RequestStatus ==
NDIS_STATUS_SUCCESS )
{
//
// The close request succeeded, set the flag stating so,
// and reset the open structure to its initial state.
//
Open[OpenInstance].AdapterOpened = FALSE;
Open[OpenInstance].OpenInstance = (UCHAR)-1;
TpctlResetOpenState( &Open[OpenInstance],hFileHandle );
}
//
// Now print the results regardless of success or failure.
//
TpctlPrintResults( (PREQUEST_RESULTS)OutputBuffer,CmdCode,0 );
break;
case SETPF:
case SETLA:
case ADDMA:
case SETFA:
case SETGA:
case SETINFO:
{
PMULT_ADDR MultAddr = NULL;
BOOL AddressFound = FALSE;
DWORD i;
if (((PREQUEST_RESULTS)OutputBuffer)->RequestStatus ==
NDIS_STATUS_SUCCESS )
{
//
// If the command succeeded, then update the local
// state to reflect the changed info.
//
switch ( CmdArgs->ARGS.TPSET.OID )
{
case OID_GEN_CURRENT_PACKET_FILTER:
Open[OpenInstance].PacketFilter =
CmdArgs->ARGS.TPSET.U.PacketFilter;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
Open[OpenInstance].LookaheadSize =
CmdArgs->ARGS.TPSET.U.LookaheadSize;
break;
case OID_FDDI_LONG_MULTICAST_LIST :
case OID_802_3_MULTICAST_LIST :
//
// We successfully added the multicast address to the
// card, if it is not in our local list already, then
// put it on the local multicast address list
// for accounting purposes.
//
// XXX: The stress tests be required to add and delete
// the stress multicast address to/from this list?
//
MultAddr = Open[OpenInstance].MulticastAddresses;
if ( MultAddr != NULL )
{
//
// if the list is not empty see if this addr is
// in it yet.
//
while ( MultAddr != NULL )
{
if ( memcmp(CmdArgs->ARGS.TPSET.U.MulticastAddress[0],
MultAddr->MulticastAddress,
ADDRESS_LENGTH ) == 0 )
{
//
// We found the address in the list already,
// so skip adding it in again.
//
AddressFound = TRUE;
break;
}
//
// Otherwise, get the next list entry.
//
MultAddr = MultAddr->Next;
}
}
if ( AddressFound == FALSE )
{
MultAddr = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,
sizeof( MULT_ADDR ) );
if ( MultAddr == NULL )
{
Status = GetLastError();
TpctlErrorLog(
"\n\tGlobalAlloc failed to alloc a MultAddr stuct: returned 0x%lx.\n",
(PVOID)Status);
break;
}
for ( i=0;i<ADDRESS_LENGTH;i++ )
{
MultAddr->MulticastAddress[i] =
CmdArgs->ARGS.TPSET.U.MulticastAddress[0][i];
}
MultAddr->Next = Open[OpenInstance].MulticastAddresses;
Open[OpenInstance].MulticastAddresses = MultAddr;
Open[OpenInstance].NumberMultAddrs++;
}
break;
case OID_802_5_CURRENT_FUNCTIONAL:
for (i=0;i<FUNCTIONAL_ADDRESS_LENGTH;i++)
{
Open[OpenInstance].FunctionalAddress[i] =
CmdArgs->ARGS.TPSET.U.FunctionalAddress[i];
}
break;
case OID_802_5_CURRENT_GROUP:
for (i=0;i<FUNCTIONAL_ADDRESS_LENGTH;i++)
{
Open[OpenInstance].GroupAddress[i] =
CmdArgs->ARGS.TPSET.U.GroupAddress[i];
}
break;
}
}
TpctlPrintSetInfoResults( (PREQUEST_RESULTS)OutputBuffer,
CmdCode,
CmdArgs->ARGS.TPSET.OID );
break;
}
case DELMA:
{
PMULT_ADDR MultAddr = NULL;
PMULT_ADDR BaseMultAddr = NULL;
//
// We successfully deleted the multicast address from the
// card, if it is in our local list already, then remove
// it from the local multicast address list for accounting
// purposes.
//
// The stress tests be required to add and delete the stress
// multicast address to/from this list?
//
MultAddr = Open[OpenInstance].MulticastAddresses;
if ( MultAddr != NULL )
{
//
// if the list is not empty see if this addr is
// in it, first check the initial entry.
//
if ( memcmp(GlobalCmdArgs.ARGS.TPSET.U.MulticastAddress[0],
MultAddr->MulticastAddress,
ADDRESS_LENGTH ) == 0 )
{
//
// and if found remove from list and free
//
Open[OpenInstance].MulticastAddresses = MultAddr->Next;
GlobalFree( MultAddr );
Open[OpenInstance].NumberMultAddrs--;
}
else
{
//
// Otherwise check the rest of the list.
//
while ( MultAddr->Next != NULL )
{
if (memcmp( GlobalCmdArgs.ARGS.TPSET.U.MulticastAddress[0],
MultAddr->Next->MulticastAddress,
ADDRESS_LENGTH ) == 0 )
{
//
// We found the address in the list, so remove
// it and deallocate the memory
//
MultAddr->Next = MultAddr->Next->Next;
GlobalFree( MultAddr->Next );
Open[OpenInstance].NumberMultAddrs--;
break;
}
//
// Otherwise, get the next list entry.
//
MultAddr = MultAddr->Next;
}
}
}
TpctlPrintSetInfoResults( (PREQUEST_RESULTS)OutputBuffer,
CmdCode,
CmdArgs->ARGS.TPSET.OID );
break;
}
case QUERYINFO:
TpctlPrintQueryInfoResults( (PREQUEST_RESULTS)OutputBuffer,
CmdCode,
CmdArgs->ARGS.TPQUERY.OID );
break;
case RESET:
TpctlPrintResults( (PREQUEST_RESULTS)OutputBuffer,CmdCode,0 );
break;
case SEND:
//
// If the IOCTL call failed then break out of while loop
// by setting the ExitFlag to true.
//
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
break;
}
//
// If we have only attempted to SEND one packet, then we will
// print the results here and now.
//
else if ( CmdArgs->ARGS.TPSEND.NumberOfPackets == 1 )
{
//
// Wait for the SEND event to be signaled telling us that
// the results are complete.
//
Status = WaitForSingleObject( Open[OpenInstance].SendEvent,
0xFFFFFFFF );
if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the send did not completed successfully then
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: The SEND command failed, returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
else
{
//
// Otherwise print the send test results.
//
TpctlPrintSendResults( Open[OpenInstance].SendResults );
}
//
// then reset the SEND control flags to the initial state
// and return.
//
Open[OpenInstance].SendResultsCompleted = FALSE;
Open[OpenInstance].Sending = FALSE;
}
break;
case STOPSEND:
//
// Wait for the SEND event to be signaled telling us that
// the results are complete.
//
Status = WaitForSingleObject( Open[OpenInstance].SendEvent,
0xFFFFFFFF );
if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the send did not completed successfully then
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: The STOPSEND command failed, returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
else
{
//
// Otherwise print the send test results.
//
TpctlPrintSendResults( Open[OpenInstance].SendResults );
}
//
// then reset the SEND control flags to the initial state
// and return.
//
Open[OpenInstance].SendResultsCompleted = FALSE;
Open[OpenInstance].Sending = FALSE;
break;
case RECEIVE:
//
// If the IOCTL call failed then break out of while loop
// by setting the ExitFlag to true.
//
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
}
//
// otherwise the RECEIVE test has been started successfully, and
// there is nothing more to do.
//
break;
case STOPREC:
//
// Wait for the RECEIVE event to be signaled telling us that
// the results are complete.
//
Status = WaitForSingleObject( Open[OpenInstance].ReceiveEvent,
0xFFFFFFFF );
if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the receive did not completed successfully then
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: The STOPRECEIVE command failed, returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
else
{
//
// Otherwise print the receive test results.
//
TpctlPrintReceiveResults( Open[OpenInstance].ReceiveResults );
}
//
// then reset the RECEIVE control flags to the initial state
// and return.
//
Open[OpenInstance].ReceiveResultsCompleted = FALSE;
Open[OpenInstance].Receiving = FALSE;
break;
case STRESS:
//
// If the Ioctl call failed then the attempt to start the
// stress test has failed, then break out of while loop by
// setting the ExitFlag to true.
//
if ((( NtStatus != TP_STATUS_NO_SERVERS ) &&
( NtStatus != STATUS_SUCCESS )) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
}
else if ( NtStatus == TP_STATUS_NO_SERVERS )
{
//
// No Stress Servers where found to participate in the
// test, reset the Stress Test control flags to show that
// the test did not start properly.
//
Open[OpenInstance].Stressing = FALSE;
Open[OpenInstance].StressResultsCompleted = FALSE;
Open[OpenInstance].StressClient = FALSE;
//
// Then Display the error to the user.
//
TpctlErrorLog("\n\tTpctl: failed to start STRESS test, returned %s.\n",
(PVOID)TpctlGetStatus( NtStatus ));
//
// And, if we are reading commands from a script, assume
// that the failure should force the test to stop, therefore
// unload the script files.
//
if ( !ContinueOnError )
{
TpctlResetAllOpenStates( hFileHandle );
TpctlCloseScripts();
}
}
break;
case STRESSSERVER:
//
// If the IOCTL call failed then break out of while loop
// by setting the ExitFlag to true.
//
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
}
//
// otherwise the STRESS SERVER has been started successfully, and
// there is nothing more to do here.
//
break;
case ENDSTRESS:
//
// Wait for the STRESS event to be signaled telling us that
// the results are complete.
//
Status = WaitForSingleObject( Open[OpenInstance].StressEvent,
0xFFFFFFFF );
if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the receive did not completed successfully then
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: The ENDSTRESS command failed, returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
else if ( Open[OpenInstance].StressClient == TRUE )
{
TpctlPrintStressResults(Open[OpenInstance].StressResults,
Open[OpenInstance].Ack10 );
Open[OpenInstance].StressResultsCompleted = FALSE;
Open[OpenInstance].StressClient = FALSE;
Open[OpenInstance].Stressing = FALSE;
}
break;
case BREAKPOINT:
break;
case CMD_COMPLETED:
break;
case PERFSERVER:
//
// If the IOCTL call failed then break out of while loop
// by setting the ExitFlag to true.
//
Status = NtStatus;
if (( Status != STATUS_SUCCESS ) && ( Status != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
break;
}
//
// Wait for the PERFSEND event to be signaled telling us that
// the results are complete.
//
if (Status == STATUS_PENDING)
{
for(;;)
{
Status = WaitForSingleObject( Open[OpenInstance].PerfEvent,
2000 );
if (Status == WAIT_TIMEOUT)
{
if (!ContinueLooping) // ctl-C was pressed
{
ContinueLooping = TRUE; // just quit this command
NtStatus =
NtDeviceIoControlFile( hFileHandle,
Event,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock,
IOCTL_TP_PERF_ABORT,
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer,
OutputBufferSize );
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog(
"\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
Status = NtStatus;
}
ExitFlag = TRUE;
break;
}
}
else if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the command did not complete successfully then
// exit the test app with the error.
//
TpctlErrorLog(
"\n\tTpctl: The PERFSERVER command failed,returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
else
{
break;
}
}
}
//
// then reset the SEND control flags to the initial state
// and return.
//
Open[OpenInstance].PerfResultsCompleted = FALSE;
break;
case PERFCLIENT:
//
// If the IOCTL call failed then break out of while loop
// by setting the ExitFlag to true.
//
if (( NtStatus != STATUS_SUCCESS ) && ( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
ExitFlag = TRUE;
Status = NtStatus;
break;
}
//
// Wait for the RECEIVE event to be signaled telling us that
// the results are complete.
//
for(;;)
{
Status = WaitForSingleObject( Open[OpenInstance].PerfEvent,
2000 );
if (Status == WAIT_TIMEOUT)
{
if (!ContinueLooping) // ctl-C was pressed
{
ContinueLooping = TRUE; // just quit this command
NtStatus = NtDeviceIoControlFile( hFileHandle,
Event,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock,
IOCTL_TP_PERF_ABORT,
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer,
OutputBufferSize );
if (( NtStatus != STATUS_SUCCESS ) &&
( NtStatus != STATUS_PENDING ))
{
TpctlErrorLog(
"\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)NtStatus);
Status = NtStatus;
}
ExitFlag = TRUE;
break;
}
}
else if ( Status != NO_ERROR )
{
//
// If the wait for single object failed, then exit the
// test app with the error.
//
TpctlErrorLog("\n\tWaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
ExitFlag = TRUE;
break;
}
else if ( IoStatusBlock2.Status != STATUS_SUCCESS )
{
//
// If the receive did not completed successfully then
// exit the test app with the error.
//
TpctlErrorLog("\n\tTpctl: The PERFCLIENT command failed, returned 0x%lx.\n",
(PVOID)IoStatusBlock2.Status);
ExitFlag = TRUE;
Status = IoStatusBlock2.Status;
break;
}
//
// If here, status was succes. Print the send test results.
//
else
{
TpctlPrintPerformResults( Open[OpenInstance].PerfResults);
//
// then reset the RECEIVE control flags to the initial state
// and return.
//
Open[OpenInstance].PerfResultsCompleted = FALSE;
break;
}
}
break;
default:
TpctlErrorLog("\n\tTpctl: Invalid Command Entered.\n",NULL);
break;
} // switch();
//
// Now zero out the input and output buffers to guarantee no
// random garbage on the next call.
//
ZeroMemory( InputBuffer,InputBufferSize );
if (((( CmdCode == STRESS ) || ( CmdCode == STRESSSERVER )) ||
( CmdCode == SEND )) || ( CmdCode == RECEIVE ))
{
ZeroMemory( OutputBuffer2,OutputBufferSize2 );
}
else if (( CmdCode != CMD_ERR ) && ( CmdCode != CMD_COMPLETED ))
{
ZeroMemory( OutputBuffer,OutputBufferSize );
}
}
//
// The test has ended either successfully or not, close any opened
// script files, deallocate the memory buffers, and return status.
//
TpctlCloseScripts();
// Reset State
GlobalFree( InputBuffer );
GlobalFree( OutputBuffer );
CloseHandle( Event );
return Status;
}
VOID
TpctlGetEvents(
IN HANDLE FileHandle,
IN HANDLE InputBuffer,
IN DWORD InputBufferSize
)
{
DWORD Status;
HANDLE OutputBuffer;
DWORD OutputBufferSize = IOCTL_BUFFER_SIZE;
HANDLE Event;
IO_STATUS_BLOCK IoStatusBlock;
BOOL ReadFromEventQueue = FALSE;
ContinueLooping = TRUE;
OutputBuffer = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,OutputBufferSize );
if ( OutputBuffer == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: GlobalAlloc failed to alloc OutputBuffer: returned 0x%lx.\n",
(PVOID)Status);
return;
}
Event = CreateEvent( NULL,FALSE,FALSE,NULL );
if ( Event == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: CreateEvent failed: returned 0x%lx.\n",(PVOID)Status);
GlobalFree( OutputBuffer );
return;
}
TpctlLog("\n",NULL);
do
{
//
// We want to continuously call the driver for the
// event information, until the event queue is empty.
// this is represented by the IoStatusBlock.Status
// being STATUS_FAILURE.
//
// !!NOT WIN32!!
Status = NtDeviceIoControlFile( FileHandle,
Event,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock,
TP_CONTROL_CODE( GETEVENTS,IOCTL_METHOD ),
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer,
OutputBufferSize );
if ((( Status != TP_STATUS_NO_EVENTS ) &&
( Status != STATUS_SUCCESS )) &&
( Status != STATUS_PENDING ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)Status);
}
else if ( Status == TP_STATUS_NO_EVENTS )
{
TpctlLog("\tTpctl: Event Queue is empty.\tMAY_DIFFER\n",NULL);
}
else
{
Status = WaitForSingleObject( Event,0xFFFFFFFF );
if ( Status != STATUS_SUCCESS )
{
TpctlErrorLog("\n\tTpctl: WaitForSingleObject failed: returned 0x%lx.\n",
(PVOID)Status);
}
else if ( IoStatusBlock.Status == TP_STATUS_NO_EVENTS )
{
TpctlLog("\tTpctl: Event Queue is empty.\tMAY_DIFFER\n",NULL);
}
else if ( IoStatusBlock.Status == STATUS_SUCCESS )
{
TpctlPrintEventResults( (PEVENT_RESULTS)OutputBuffer );
}
else
{
TpctlErrorLog("\tTpctl: Error getting events from driver.\n",NULL);
}
}
} while ((( IoStatusBlock.Status == STATUS_SUCCESS ) &&
( ContinueLooping == TRUE )) &&
( Status == STATUS_SUCCESS ));
GlobalFree( OutputBuffer );
CloseHandle( Event );
return;
}
VOID
TpctlPauseGo(
IN HANDLE FileHandle,
IN HANDLE InputBuffer,
IN DWORD InputBufferSize,
IN DWORD CmdCode
)
{
DWORD Status;
IO_STATUS_BLOCK IoStatusBlock;
HANDLE OutputBuffer;
DWORD OutputBufferSize = IOCTL_BUFFER_SIZE;
ULONG TimedOut = 0;
OutputBuffer = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT,OutputBufferSize );
if ( OutputBuffer == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: GlobalAlloc failed to alloc OutputBuffer: returned 0x%lx.\n",
(PVOID)Status);
return;
}
ContinueLooping = TRUE;
do
{
//
// We want to continuously call the driver for PAUSE or GO
// until a Go is received or the Pause is acknowledged.
//
// !!NOT WIN32!!
Status = NtDeviceIoControlFile( FileHandle,
NULL, // Event,
NULL, // ApcRoutine
NULL, // ApcContext
&IoStatusBlock,
TP_CONTROL_CODE( CmdCode,IOCTL_METHOD ),
(PVOID)InputBuffer,
InputBufferSize,
(PVOID)OutputBuffer,
OutputBufferSize );
if ( Status != STATUS_SUCCESS )
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile failed: returned 0x%lx.\n",
(PVOID)Status);
}
else if (((PREQUEST_RESULTS)OutputBuffer)->RequestStatus == TP_STATUS_TIMEDOUT )
{
//
// The GO or PAUSE timed out, if we have looped ten times
// display the error to the user.
//
if (( ++TimedOut % 12 ) == 0 ) // Two Minutes
{
if ( CmdCode == GO )
{
printf("\n\tTpctl: GO timed out prior to receiving acknowledgment packet.\n",
NULL);
printf("\t Re-Sending...\n",NULL);
}
else
{
printf("\n\tTpctl: PAUSE timed out prior to receiving GO packet.\n",NULL);
printf("\t Re-Waiting...\n",NULL);
}
}
}
else if (((PREQUEST_RESULTS)OutputBuffer)->RequestStatus != NDIS_STATUS_SUCCESS )
{
//
// The call to send a GO or GO_ACK packet failed, display the
// error to the user.
//
if ( CmdCode == GO )
{
TpctlErrorLog("\n\tTpctl: Failed to send the GO packet: returned %s.\n",
(PVOID)TpctlGetStatus(((PREQUEST_RESULTS)OutputBuffer)->RequestStatus));
}
else
{
TpctlErrorLog("\n\tTpctl: Failed to send the acknowledgment packet: returned %s.\n",
(PVOID)TpctlGetStatus(((PREQUEST_RESULTS)OutputBuffer)->RequestStatus));
}
Status = ((PREQUEST_RESULTS)OutputBuffer)->RequestStatus;
}
else
{
//
// The GO or PAUSE has completed successfully, break
// out of the loop.
//
break;
}
} while (( ContinueLooping == TRUE ) && ( Status == NO_ERROR ));
if (( Status != NO_ERROR ) || ( ContinueLooping == FALSE ))
{
//
// If we are reading commands from a script, assume
// that the failure should force the test to stop,
// therefore unload the script files, and reset the
// state all opens back to the initial state.
//
if ( !ContinueOnError )
{
TpctlResetAllOpenStates( FileHandle );
TpctlCloseScripts();
}
}
GlobalFree( OutputBuffer );
return;
}
VOID
TpctlLoadUnload(
IN DWORD CmdCode
)
{
SERVICE_STATUS ServiceStatus ;
SC_HANDLE ServiceControlMgrHandle ;
SC_HANDLE ServiceHandle ;
NTSTATUS Status ;
//
// Open the service control manager
//
ServiceControlMgrHandle = OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
ServiceHandle = OpenService(ServiceControlMgrHandle,
GlobalCmdArgs.ARGS.DriverName,
SERVICE_START|SERVICE_STOP );
if ( CmdCode == LOAD )
{
if ( !StartService( ServiceHandle, 0, NULL ) )
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: Failed to load MAC driver : %s\n",
(PVOID)GlobalCmdArgs.ARGS.DriverName);
TpctlErrorLog("\tError Code Status = %ldL.\n",(PVOID)Status);
}
else
{
TpctlLog( "\n\tLoaded driver %s successfully\tMAY_DIFFER\n",
GlobalCmdArgs.ARGS.DriverName );
}
}
else
{
if ( !ControlService( ServiceHandle, SERVICE_CONTROL_STOP, &ServiceStatus ) )
{
Status = GetLastError();
TpctlErrorLog("\n\tTpctl: Failed to unload MAC driver : %s\n",
(PVOID)GlobalCmdArgs.ARGS.DriverName);
TpctlErrorLog("\tError Code Status = %ldL with a Service State of ",(PVOID)Status);
TpctlErrorLog("%ld\n",(PVOID)ServiceStatus.dwCurrentState);
}
else
{
TpctlLog( "\n\tUnloaded driver %s successfully.\tMAY_DIFFER\n",
GlobalCmdArgs.ARGS.DriverName );
}
}
}
VOID
TpctlQueryStatistics(
IN PUCHAR DriverName,
IN NDIS_OID OID,
IN PUCHAR StatsBuffer,
IN DWORD BufLen
)
{
HANDLE FileHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
ANSI_STRING DrvrNameString;
UNICODE_STRING UnicodeDrvrName;
DWORD NameLength;
LPSTR NameBuffer;
NTSTATUS Status;
PUCHAR TmpBuf[265];
NameLength = strlen( DriverName ) + 1 + 8;
NameBuffer = (LPSTR)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
NameLength );
if ( NameBuffer == NULL )
{
Status = GetLastError();
TpctlErrorLog("\n\tGlobalAlloc failed to alloc NameBuffer: returned 0x%lx.\n",
(PVOID)Status);
return;
}
ZeroMemory( NameBuffer, NameLength );
memcpy( NameBuffer,"\\Device\\",8 );
memcpy( NameBuffer + 8, DriverName, NameLength - 8 );
// !!NOT WIN32!!
RtlInitString( &DrvrNameString, NameBuffer );
// !!NOT WIN32!!
RtlAnsiStringToUnicodeString( &UnicodeDrvrName, &DrvrNameString, TRUE );
// !!NOT WIN32!!
InitializeObjectAttributes( &ObjectAttributes,
&UnicodeDrvrName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
// !!NOT WIN32!!
Status = NtOpenFile(&FileHandle,
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHRONOUS_IO_ALERT );
if (Status != STATUS_SUCCESS )
{
TpctlErrorLog("\n\tTpctl: NtOpenFile returned %lx\n\n", (PVOID)Status);
return;
}
// !!NOT WIN32!!
Status = NtDeviceIoControlFile( FileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_NDIS_QUERY_GLOBAL_STATS,
(PVOID)&OID,
sizeof( NDIS_OID ),
(PVOID)TmpBuf, //StatsBuffer,
256); //Buflen
if (( Status != STATUS_SUCCESS ) &&
( IoStatusBlock.Status != STATUS_SUCCESS ))
{
TpctlErrorLog("\n\tTpctl: NtDeviceIoControlFile returned %lx\n\n",
(PVOID)IoStatusBlock.Status);
return;
}
TpctlLog("\n\tOID 0x%8.8lx ", (PVOID)OID);
TpctlLog("len %d ", (PVOID)IoStatusBlock.Information );
TpctlLog("value %u\tMAY_DIFFER\n\n", (PVOID)TmpBuf[0]);
// !!NOT WIN32!!
RtlFreeUnicodeString( &UnicodeDrvrName );
// !!NOT WIN32!!
Status = NtClose( FileHandle );
}
BOOL
Disable(
IN DWORD argc,
IN LPSTR argv[]
)
{
UINT EnvCounter1 = 0 , EnvCounter2 = 0 ;
DWORD i;
CHAR TmpBuffer[256];
ZeroMemory( TmpBuffer, 256 );
//
// Detected command Disable
//
for( i = 1; i < argc; i++ )
{
EnvCounter1++;
ZeroMemory ( TmpBuffer, sizeof( TmpBuffer ) );
strncpy( TmpBuffer, argv[i], strlen( argv[i] ) );
if ( getenv( TmpBuffer ) != NULL )
{
EnvCounter2++;
}
}
//
// If all the environment variables have been enabled
// we must re-enable the tool. Setting of all the
// enviornment variables indicates that all those
// modes are supported and there is no need to disable
// the tool. If has been disabled by a previous disable
// it would require an enable to activate the tool
//
if ( (EnvCounter1 == EnvCounter2) && (EnvCounter1 != 0) )
{
printf("\n\tSupport for ");
for( i = 1; i < argc; i++ )
{
if ( i == (argc-1) )
{
printf("%s ", argv[i] );
}
else
{
if ( (i%2) == 0 )
{
printf("\n\t");
}
printf("%s, ", argv[i] );
}
}
printf("modes has been detected.\n\tTPCTL has not been disabled.\n\n");
return FALSE;
}
//
// Disable TPCTL
//
ToolActive = FALSE;
return TRUE;
}