Leaked source code of windows server 2003
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.
 
 
 
 
 
 

390 lines
9.7 KiB

#include "brian.h"
PCHAR
SwallowNonWhite (
IN PCHAR Ptr,
OUT PULONG Count
)
{
ULONG LocalCount = 0;
while (*Ptr) {
if (*Ptr == ' ' || *Ptr == '\t' ) {
break;
}
LocalCount += 1;
Ptr++;
}
*Count = LocalCount;
return Ptr;
}
PCHAR
SwallowWhite (
IN PCHAR Ptr,
OUT PULONG Count
)
{
ULONG LocalCount = 0;
while (*Ptr != '\0') {
if (*Ptr != ' ' && *Ptr != '\t') {
break;
}
LocalCount += 1;
Ptr++;
}
*Count = LocalCount;
return Ptr;
}
ULONG
AnalyzeBuffer (
PCHAR *BuffPtr,
PULONG ParamStringLen
)
{
ULONG BytesSwallowed;
ULONG Count;
PCHAR CurrentChar;
if (!ExtractCmd( BuffPtr, &BytesSwallowed )) {
return SHELL_UNKNOWN;
}
//
// Lower case the command string.
//
for (Count = 0, CurrentChar = *BuffPtr; Count < BytesSwallowed; Count++, CurrentChar++) {
if ((*CurrentChar <= 'Z') && (*CurrentChar >= 'A')) {
*CurrentChar += ('a' - 'A');
}
}
*ParamStringLen = BytesSwallowed;
if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "op", 2 )) {
return SHELL_OPEN;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "die", 3 )) {
return SHELL_EXIT;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "clb", 3 )) {
return SHELL_CLEAR_BUFFER;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "db", 2 )) {
return SHELL_DISPLAY_BYTES;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "dw", 2 )) {
return SHELL_DISPLAY_WORDS;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "dd", 2 )) {
return SHELL_DISPLAY_DWORDS;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "cb", 2 )) {
return SHELL_COPY_BUFFER;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "am", 2 )) {
return SHELL_ALLOC_MEM;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "dm", 2 )) {
return SHELL_DEALLOC_MEM;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "fb", 2 )) {
return SHELL_FILL_BUFFER;
} else if ((BytesSwallowed == 5) &&
RtlEqualMemory( *BuffPtr, "fbusn", 5 )) {
return SHELL_FILL_BUFFER_USN;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "pea", 3 )) {
return SHELL_PUT_EA;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "fea", 3 )) {
return SHELL_FILL_EA;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "di", 2 )) {
return SHELL_DISPLAY_HANDLE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "cl", 2 )) {
return SHELL_CLOSE_HANDLE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "rd", 2 )) {
return SHELL_READ_FILE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "pa", 2 )) {
return SHELL_PAUSE;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "qea", 3 )) {
return SHELL_QUERY_EAS;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "sea", 3 )) {
return SHELL_SET_EAS;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "br", 2 )) {
return SHELL_BREAK;
} else if ((BytesSwallowed == 4) &&
RtlEqualMemory( *BuffPtr, "oplk", 4 )) {
return SHELL_OPLOCK;
} else if ((BytesSwallowed == 4) &&
RtlEqualMemory( *BuffPtr, "fsct", 4 )) {
return SHELL_FSCTRL;
} else if ((BytesSwallowed == 6) &&
RtlEqualMemory( *BuffPtr, "sparse", 6 )) {
return SHELL_SPARSE;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "usn", 3 )) {
return SHELL_USN;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "rp", 2 )) {
return SHELL_REPARSE;
} else if ((BytesSwallowed == 5) &&
RtlEqualMemory( *BuffPtr, "ioctl", 4 )) {
return SHELL_IOCTL;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "wr", 2 )) {
return SHELL_WRITE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "qd", 2 )) {
return SHELL_QDIR;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "dqd", 3 )) {
return SHELL_DISPLAY_QDIR;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "qf", 2 )) {
return SHELL_QFILE;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "dqf", 3 )) {
return SHELL_DISPLAY_QFILE;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "ncd", 3 )) {
return SHELL_NOTIFY_CHANGE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "et", 2 )) {
return SHELL_ENTER_TIME;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "dt", 2 )) {
return SHELL_DISPLAY_TIME;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "sf", 2 )) {
return SHELL_SETFILE;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "qv", 2 )) {
return SHELL_QUERY_VOLUME;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "dqv", 3 )) {
return SHELL_DISPLAY_QVOL;
} else if ((BytesSwallowed == 2) &&
RtlEqualMemory( *BuffPtr, "sv", 2 )) {
return SHELL_SET_VOLUME;
} else if ((BytesSwallowed == 3) &&
RtlEqualMemory( *BuffPtr, "can", 2 )) {
return SHELL_CANCEL_IO;
}
return SHELL_UNKNOWN;
}
BOOLEAN
ExtractCmd (
PCHAR *BufferPtr,
PULONG BufferLen
)
{
BOOLEAN Status;
PCHAR CurrentLoc;
PCHAR StartLoc;
ULONG BytesSwallowed;
//
// Remember the total length and the starting position.
// Bytes swallowed is zero.
//
CurrentLoc = *BufferPtr;
BytesSwallowed = 0;
Status = TRUE;
//
// Swallow leading white spaces.
//
CurrentLoc = SwallowWhite (CurrentLoc, &BytesSwallowed);
//
// If first character is NULL, then there was no command.
//
if (!*CurrentLoc) {
Status = FALSE;
//
// Else find the next white space.
//
} else {
StartLoc = CurrentLoc;
CurrentLoc = SwallowNonWhite (CurrentLoc, &BytesSwallowed);
}
//
// Update the passed in values.
// Return the status of this operation.
//
*BufferPtr = StartLoc;
*BufferLen = BytesSwallowed;
return Status;
}
VOID
CommandSummary ()
{
printf( "\nBSHELL Command Summary" );
printf( "\n\tdie Exit BSHELL" );
printf( "\n\tpa Pause input" );
printf( "\n\tbr Break into debugger" );
printf( "\n" );
printf( "\n\top Open a file, directory or volume" );
printf( "\n\tcan Cancel IO on a handle" );
printf( "\n\tcl Close a file handle" );
printf( "\n" );
printf( "\n\tqd Query directory operation" );
printf( "\n\tdqd Disply query directory buffer" );
printf( "\n\tncd Notify change directory" );
printf( "\n" );
printf( "\n\trd Read from a file" );
printf( "\n\twr Write to a file" );
printf( "\n" );
printf( "\n\tqf Query file information" );
printf( "\n\tdqf Display query file buffer" );
printf( "\n\tsf Set file information" );
printf( "\n" );
printf( "\n\tqv Query volume information" );
printf( "\n\tdqv Display volume informatin" );
printf( "\n\tsv Set volume information" );
printf( "\n" );
printf( "\n\tfsct Fsctrl operation" );
printf( "\n\tsparse Sparse file operation" );
printf( "\n\tusn Usn operation" );
printf( "\n\trp Reparse operation" );
printf( "\n\toplk Oplock operation" );
printf( "\n\tioctl Ioctl operation" );
printf( "\n" );
printf( "\n\tclb Clear a buffer" );
printf( "\n\tdb Display a buffer in bytes" );
printf( "\n\tdw Display a buffer in words" );
printf( "\n\tdd Display a buffer in dwords" );
printf( "\n\tcb Copy a buffer" );
printf( "\n\tfb Fill a buffer" );
printf( "\n\tfbusn Fill a usn fsctl buffer" );
printf( "\n" );
printf( "\n\tam Allocate memory" );
printf( "\n\tdm Deallocate memory" );
printf( "\n" );
printf( "\n\tdi Display information on an index" );
printf( "\n" );
printf( "\n\tqea Query the ea's for a file" );
printf( "\n\tsea Set the ea's for a file" );
printf( "\n\tpea Store an ea name in a buffer for query ea" );
printf( "\n\tfea Store an ea name in a buffer to set an ea" );
printf( "\n" );
printf( "\n\tet Enter a time value into a buffer" );
printf( "\n\tdt Display a buffer as a time value" );
printf( "\n\n" );
return;
}