276 lines
4.9 KiB
C
276 lines
4.9 KiB
C
|
#include "brian.h"
|
|||
|
|
|||
|
VOID
|
|||
|
DisplayHandle (
|
|||
|
IN USHORT Index
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
InitHandles (
|
|||
|
)
|
|||
|
{
|
|||
|
NtCreateEvent( &HandleEvent, SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
|
|||
|
NULL, SynchronizationEvent, TRUE );
|
|||
|
|
|||
|
RtlZeroMemory( Handles, sizeof( Handles ));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
UninitHandles (
|
|||
|
)
|
|||
|
{
|
|||
|
USHORT Index;
|
|||
|
|
|||
|
//
|
|||
|
// Close any handles.
|
|||
|
//
|
|||
|
|
|||
|
for (Index = 0; Index < MAX_HANDLES; Index++) {
|
|||
|
|
|||
|
if (Handles[Index].Used) {
|
|||
|
|
|||
|
NtClose( Handles[Index].Handle );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ObtainIndex (
|
|||
|
OUT PUSHORT NewIndex
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
USHORT Index;
|
|||
|
|
|||
|
//
|
|||
|
// Wait for the handle event
|
|||
|
//
|
|||
|
|
|||
|
if ((Status = NtWaitForSingleObject( HandleEvent,
|
|||
|
FALSE,
|
|||
|
NULL )) != STATUS_SUCCESS) {
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Find an available index. Return STATUS_INSUFFICIENT_RESOURCES
|
|||
|
// if not found.
|
|||
|
//
|
|||
|
|
|||
|
for (Index = 0; Index < MAX_HANDLES; Index++) {
|
|||
|
|
|||
|
if (!Handles[Index].Used) {
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Index >= MAX_HANDLES) {
|
|||
|
|
|||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
|||
|
|
|||
|
//
|
|||
|
// Otherwise reserve this handle index.
|
|||
|
//
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
Handles[Index].Used = TRUE;
|
|||
|
*NewIndex = Index;
|
|||
|
|
|||
|
Status = STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
NtSetEvent( HandleEvent, NULL );
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FreeIndex (
|
|||
|
IN USHORT Index
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
NTSTATUS Status = STATUS_SUCCESS;
|
|||
|
|
|||
|
//
|
|||
|
// Return immediately if beyond the end of the valid handles.
|
|||
|
//
|
|||
|
|
|||
|
if (Index >= MAX_HANDLES) {
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Grab the event for the handles.
|
|||
|
//
|
|||
|
|
|||
|
if ((Status = NtWaitForSingleObject( HandleEvent, FALSE, NULL )) != STATUS_SUCCESS) {
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Mark the index as unused and close the file object if present.
|
|||
|
//
|
|||
|
|
|||
|
if (Handles[Index].Handle) {
|
|||
|
|
|||
|
Status = NtClose( Handles[Index].Handle );
|
|||
|
}
|
|||
|
|
|||
|
if (Handles[Index].Used) {
|
|||
|
|
|||
|
Handles[Index].Used = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
NtSetEvent( HandleEvent, NULL );
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
InputDisplayHandle (
|
|||
|
IN PCHAR ParamBuffer
|
|||
|
)
|
|||
|
{
|
|||
|
ULONG Index;
|
|||
|
BOOLEAN LastInput;
|
|||
|
BOOLEAN ParmSpecified;
|
|||
|
|
|||
|
Index = 0;
|
|||
|
|
|||
|
ParmSpecified = FALSE;
|
|||
|
LastInput = TRUE;
|
|||
|
|
|||
|
//
|
|||
|
// While there is more input, analyze the parameter and update the
|
|||
|
// query 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 ) {
|
|||
|
|
|||
|
//
|
|||
|
// Check buffer index.
|
|||
|
//
|
|||
|
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++;
|
|||
|
|
|||
|
Index = AsciiToInteger( ParamBuffer );
|
|||
|
|
|||
|
ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount );
|
|||
|
|
|||
|
ParmSpecified = TRUE;
|
|||
|
|
|||
|
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 if there is no input then exit.
|
|||
|
//
|
|||
|
} else if ( LastInput ) {
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
//
|
|||
|
// Else try to read another line for open parameters.
|
|||
|
//
|
|||
|
} else {
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// If no parameters were received then display the syntax message.
|
|||
|
//
|
|||
|
if (!ParmSpecified) {
|
|||
|
|
|||
|
printf( "\n Usage: di -i<digits> \n" );
|
|||
|
printf( "\n -i<digits> Handle index" );
|
|||
|
printf( "\n\n" );
|
|||
|
|
|||
|
//
|
|||
|
// Else call our copy buffer routine.
|
|||
|
//
|
|||
|
} else {
|
|||
|
|
|||
|
DisplayHandle( (USHORT) Index );
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
DisplayHandle (
|
|||
|
IN USHORT Index
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
printf( "\n" );
|
|||
|
printf( "\nIndex -> %04x, Handle -> %p, Used -> %04x",
|
|||
|
Index,
|
|||
|
Handles[Index].Handle,
|
|||
|
Handles[Index].Used );
|
|||
|
printf( "\n" );
|
|||
|
|
|||
|
return;
|
|||
|
}
|