555 lines
7.6 KiB
C
555 lines
7.6 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <ntddcdrm.h>
|
||
|
#include <ntdddisk.h>
|
||
|
|
||
|
extern BOOLEAN SynchronousCmds;
|
||
|
extern ULONG (*DbgPrintLocation)(PCH Format,...);
|
||
|
|
||
|
|
||
|
|
||
|
ULONG
|
||
|
GetLastError(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
HANDLE
|
||
|
CreateThread(
|
||
|
IN PVOID lpThreadAttributes,
|
||
|
IN ULONG dwStackSize,
|
||
|
IN PVOID lpStartAddress,
|
||
|
IN PVOID lpParameter,
|
||
|
IN ULONG dwCreationFlags,
|
||
|
OUT PVOID lpThreadId
|
||
|
);
|
||
|
|
||
|
#define FlagOn( Flags,SingleFlag ) ( \
|
||
|
(BOOLEAN)(((Flags) & (SingleFlag)) != 0 ? TRUE : FALSE) \
|
||
|
)
|
||
|
|
||
|
//
|
||
|
// Shell constants
|
||
|
//
|
||
|
|
||
|
#define SHELL_UNKNOWN 0
|
||
|
#define SHELL_EXIT 1
|
||
|
#define SHELL_OPEN 2
|
||
|
#define SHELL_CLEAR_BUFFER 3
|
||
|
#define SHELL_DISPLAY_BYTES 4
|
||
|
#define SHELL_COPY_BUFFER 5
|
||
|
#define SHELL_ALLOC_MEM 6
|
||
|
#define SHELL_DEALLOC_MEM 7
|
||
|
#define SHELL_PUT_EA 8
|
||
|
#define SHELL_FILL_EA 9
|
||
|
#define SHELL_DISPLAY_HANDLE 10
|
||
|
#define SHELL_CLOSE_HANDLE 11
|
||
|
#define SHELL_READ_FILE 12
|
||
|
#define SHELL_PAUSE 13
|
||
|
#define SHELL_QUERY_EAS 14
|
||
|
#define SHELL_SET_EAS 15
|
||
|
#define SHELL_BREAK 16
|
||
|
#define SHELL_OPLOCK 17
|
||
|
#define SHELL_WRITE 18
|
||
|
#define SHELL_QDIR 19
|
||
|
#define SHELL_DISPLAY_QDIR 20
|
||
|
#define SHELL_QFILE 21
|
||
|
#define SHELL_DISPLAY_QFILE 22
|
||
|
#define SHELL_NOTIFY_CHANGE 23
|
||
|
#define SHELL_ENTER_TIME 24
|
||
|
#define SHELL_DISPLAY_TIME 25
|
||
|
#define SHELL_SETFILE 26
|
||
|
#define SHELL_QUERY_VOLUME 27
|
||
|
#define SHELL_DISPLAY_QVOL 28
|
||
|
#define SHELL_SET_VOLUME 29
|
||
|
#define SHELL_FSCTRL 30
|
||
|
#define SHELL_IOCTL 31
|
||
|
#define SHELL_CANCEL_IO 32
|
||
|
#define SHELL_SPARSE 33
|
||
|
#define SHELL_USN 34
|
||
|
#define SHELL_FILL_BUFFER 35
|
||
|
#define SHELL_FILL_BUFFER_USN 36
|
||
|
#define SHELL_DISPLAY_WORDS 37
|
||
|
#define SHELL_DISPLAY_DWORDS 38
|
||
|
#define SHELL_REPARSE 39
|
||
|
|
||
|
#define try_return(S) { S; goto try_exit; }
|
||
|
#define bprint (*DbgPrintLocation)(
|
||
|
|
||
|
//
|
||
|
// Support routines contained in prmptsup.c
|
||
|
//
|
||
|
|
||
|
PCHAR
|
||
|
SwallowNonWhite (
|
||
|
IN PCHAR Ptr,
|
||
|
OUT PULONG Count
|
||
|
);
|
||
|
|
||
|
PCHAR
|
||
|
SwallowWhite (
|
||
|
IN PCHAR Ptr,
|
||
|
OUT PULONG Count
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
AnalyzeBuffer (
|
||
|
PCHAR *BuffPtr,
|
||
|
PULONG ParamStringLen
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
ExtractCmd (
|
||
|
PCHAR *BufferPtr,
|
||
|
PULONG BufferLen
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CommandSummary ();
|
||
|
|
||
|
//
|
||
|
// Routines contained in topen.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputOpenFile(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
#define ROUND_UP( x, y ) ((ULONG)(x) + ((y)-1) & ~((y)-1))
|
||
|
|
||
|
//
|
||
|
// Routines contained in tbuffer.c
|
||
|
//
|
||
|
|
||
|
#define MAX_BUFFERS 200
|
||
|
|
||
|
typedef struct _BUFFER_ELEMENT {
|
||
|
|
||
|
PCHAR Buffer;
|
||
|
ULONG Length;
|
||
|
BOOLEAN Used;
|
||
|
|
||
|
} BUFFER_ELEMENT, *PBUFFER_ELEMENT;
|
||
|
|
||
|
extern BUFFER_ELEMENT Buffers[MAX_BUFFERS];
|
||
|
extern HANDLE BufferEvent;
|
||
|
|
||
|
VOID
|
||
|
InitBuffers (
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
UninitBuffers (
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
AllocateBuffer (
|
||
|
IN ULONG ZeroBits,
|
||
|
IN OUT PSIZE_T RegionSize,
|
||
|
OUT PULONG BufferIndex
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
DeallocateBuffer (
|
||
|
IN ULONG Index
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
BufferInfo (
|
||
|
IN ULONG Index,
|
||
|
OUT PVOID *BufferAddress,
|
||
|
OUT PULONG RegionSize
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputClearBuffer(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayBuffer(
|
||
|
IN PCHAR ParamBuffer,
|
||
|
IN ULONG DisplaySize
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputCopyBuffer(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputAllocMem(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDeallocMem(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputFillBuffer(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputFillBufferUsn(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Ea routines contained in tea.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputPutEaName(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputFillEaBuffer(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputQueryEa(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputSetEa(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in thandle.c
|
||
|
//
|
||
|
|
||
|
#define MAX_HANDLES 200
|
||
|
|
||
|
typedef struct _HANDLE_ELEMENT {
|
||
|
|
||
|
HANDLE Handle;
|
||
|
BOOLEAN Used;
|
||
|
|
||
|
} HANDLE_ELEMENT, *PHANDLE_ELEMENT;
|
||
|
|
||
|
HANDLE_ELEMENT Handles[MAX_HANDLES];
|
||
|
HANDLE HandleEvent;
|
||
|
|
||
|
VOID
|
||
|
InitHandles (
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
UninitHandles (
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ObtainIndex (
|
||
|
OUT PUSHORT NewIndex
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
FreeIndex (
|
||
|
IN USHORT Index
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayHandle (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tclose.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputCloseIndex (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tevent.c
|
||
|
//
|
||
|
|
||
|
#define MAX_EVENTS 200
|
||
|
|
||
|
typedef struct _EVENT_ELEMENT {
|
||
|
|
||
|
HANDLE Handle;
|
||
|
BOOLEAN Used;
|
||
|
|
||
|
} EVENT_ELEMENT, *PEVENT_ELEMENT;
|
||
|
|
||
|
EVENT_ELEMENT Events[MAX_EVENTS];
|
||
|
HANDLE EventEvent;
|
||
|
|
||
|
VOID
|
||
|
InitEvents (
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
UninitEvents (
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ObtainEvent (
|
||
|
OUT PUSHORT NewIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
FreeEvent (
|
||
|
IN USHORT Index
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tread.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputRead(
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tpause.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputPause (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tbreak.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputBreak (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in toplock.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputOplock (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tdevctl.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputDevctrl (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tfsctrl.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputFsctrl (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tsparse.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputSparse (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tusn.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputUsn (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in treparse.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputReparse (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in twrite.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputWrite (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tqdir.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputQDir (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayQDir (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQDirNames (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQDirDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQDirFullDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQDirIdFullDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQBothDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQIdBothDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
DisplayQOleDirs (
|
||
|
IN USHORT BufferIndex
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in ttime.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputEnterTime (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayTime (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PrintTime (
|
||
|
IN PTIME Time
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
BPrintTime (
|
||
|
IN PTIME Time
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tmisc.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
PrintLargeInteger (
|
||
|
IN PLARGE_INTEGER LargeInt
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
AsciiToInteger (
|
||
|
IN PCHAR Ascii
|
||
|
);
|
||
|
|
||
|
ULONGLONG
|
||
|
AsciiToLargeInteger (
|
||
|
IN PCHAR Ascii
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tqfile.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputQFile (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayQFile (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tnotify.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputNotifyChange (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tsetfile.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputSetFile (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tqvolume.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputQVolume (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
InputDisplayQVolume (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines contained in tsetvol.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputSetVolume (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Routines defined in tcancel.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
InputCancelIndex (
|
||
|
IN PCHAR ParamBuffer
|
||
|
);
|
||
|
|