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