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