224 lines
5.1 KiB
C
224 lines
5.1 KiB
C
|
#include "brian.h"
|
|||
|
|
|||
|
VOID
|
|||
|
CancelIndex (
|
|||
|
IN USHORT Index,
|
|||
|
IN BOOLEAN DisplayParameters,
|
|||
|
IN BOOLEAN VerboseResults
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
InputCancelIndex (
|
|||
|
IN PCHAR ParamBuffer
|
|||
|
)
|
|||
|
{
|
|||
|
BOOLEAN Verbose;
|
|||
|
BOOLEAN HandleFound;
|
|||
|
BOOLEAN DisplayParms;
|
|||
|
ULONG ThisHandleIndex;
|
|||
|
|
|||
|
//
|
|||
|
// Set the defaults.
|
|||
|
//
|
|||
|
Verbose = TRUE;
|
|||
|
DisplayParms = FALSE;
|
|||
|
HandleFound = FALSE;
|
|||
|
|
|||
|
//
|
|||
|
// While there is more input, analyze the parameter and update the
|
|||
|
// open flags.
|
|||
|
//
|
|||
|
|
|||
|
while (TRUE) {
|
|||
|
|
|||
|
ULONG DummyCount;
|
|||
|
|
|||
|
//
|
|||
|
// Swallow leading white spaces.
|
|||
|
//
|
|||
|
ParamBuffer = SwallowWhite( ParamBuffer, &DummyCount );
|
|||
|
|
|||
|
if (*ParamBuffer) {
|
|||
|
|
|||
|
//
|
|||
|
// If the next parameter is legal then check the paramter value.
|
|||
|
// Update the parameter value.
|
|||
|
//
|
|||
|
if((*ParamBuffer == '-'
|
|||
|
|| *ParamBuffer == '/')
|
|||
|
&& (ParamBuffer++, *ParamBuffer != '\0')) {
|
|||
|
|
|||
|
//
|
|||
|
// Switch on the next character.
|
|||
|
//
|
|||
|
|
|||
|
switch (*ParamBuffer) {
|
|||
|
|
|||
|
//
|
|||
|
// Recover a handle.
|
|||
|
//
|
|||
|
case 'i' :
|
|||
|
case 'I' :
|
|||
|
|
|||
|
//
|
|||
|
// Move to the next character, as long as there
|
|||
|
// are no white spaces continue analyzing letters.
|
|||
|
// On the first bad letter, skip to the next
|
|||
|
// parameter.
|
|||
|
//
|
|||
|
ParamBuffer++;
|
|||
|
|
|||
|
ThisHandleIndex = AsciiToInteger( ParamBuffer );
|
|||
|
|
|||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
|||
|
|
|||
|
HandleFound = TRUE;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case 'v' :
|
|||
|
case 'V' :
|
|||
|
|
|||
|
//
|
|||
|
// Legal values for params are T/t or F/f.
|
|||
|
//
|
|||
|
ParamBuffer++;
|
|||
|
|
|||
|
if (*ParamBuffer == 'T'
|
|||
|
|| *ParamBuffer == 't') {
|
|||
|
|
|||
|
Verbose = TRUE;
|
|||
|
ParamBuffer++;
|
|||
|
|
|||
|
} else if (*ParamBuffer == 'F'
|
|||
|
|| *ParamBuffer == 'f') {
|
|||
|
|
|||
|
Verbose = FALSE;
|
|||
|
ParamBuffer++;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case 'y' :
|
|||
|
case 'Y' :
|
|||
|
|
|||
|
//
|
|||
|
// Set the display parms flag and jump over this
|
|||
|
// character.
|
|||
|
//
|
|||
|
DisplayParms = TRUE;
|
|||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default :
|
|||
|
|
|||
|
//
|
|||
|
// Swallow to the next white space and continue the
|
|||
|
// loop.
|
|||
|
//
|
|||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Else the text is invalid, skip the entire block.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Else break.
|
|||
|
//
|
|||
|
} else {
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// If the file name wasn't found, then display the syntax message
|
|||
|
// and set verbose to FALSE.
|
|||
|
//
|
|||
|
|
|||
|
if( !HandleFound ) {
|
|||
|
|
|||
|
printf( "\n Usage: can [options]*\n" );
|
|||
|
printf( "\n Options:" );
|
|||
|
printf( "\n -i<index number> Input a index to cancel" );
|
|||
|
printf( "\n -v[t|f] Verbose mode for subsequent handles" );
|
|||
|
printf( "\n -y Display parameters before call" );
|
|||
|
printf( "\n\n" );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
CancelIndex( (USHORT) ThisHandleIndex,
|
|||
|
DisplayParms,
|
|||
|
Verbose );
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
CancelIndex (
|
|||
|
IN USHORT Index,
|
|||
|
IN BOOLEAN DisplayParameters,
|
|||
|
IN BOOLEAN VerboseResults
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
IO_STATUS_BLOCK Iosb;
|
|||
|
|
|||
|
Iosb.Status = 0;
|
|||
|
Iosb.Information = 0;
|
|||
|
|
|||
|
//
|
|||
|
// Display parameters if requested.
|
|||
|
//
|
|||
|
|
|||
|
if (DisplayParameters) {
|
|||
|
|
|||
|
printf( "\nCancel Index Parameters" );
|
|||
|
printf( "\n\tIndex -> %04x", Index );
|
|||
|
printf( "\n\n" );
|
|||
|
}
|
|||
|
|
|||
|
if (Index >= MAX_HANDLES) {
|
|||
|
|
|||
|
printf( "\n\tCancel Index: Invalid index value" );
|
|||
|
Status = STATUS_INVALID_HANDLE;
|
|||
|
|
|||
|
} else if (!Handles[Index].Used) {
|
|||
|
|
|||
|
printf( "\n\tCancelIndex: Index is unused" );
|
|||
|
Status = STATUS_INVALID_HANDLE;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
Status = NtCancelIoFile( Handles[Index].Handle, &Iosb );
|
|||
|
if (VerboseResults) {
|
|||
|
|
|||
|
printf( "\nCancelIndex: Status -> %08lx\n", Status );
|
|||
|
|
|||
|
if (NT_SUCCESS( Status )) {
|
|||
|
|
|||
|
printf( "\nCancelIndex: Iosb.Information -> %08lx", Iosb.Information );
|
|||
|
printf( "\nCancelIndex: Iosb.Status -> %08lx", Iosb.Status );
|
|||
|
}
|
|||
|
|
|||
|
printf( "\n" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|