Go to the documentation of this file.00001 #ifndef __DRIVERS_FS_NP_NPFS_H
00002 #define __DRIVERS_FS_NP_NPFS_H
00003
00004 #include <ntifs.h>
00005 #include <ndk/iotypes.h>
00006 #include <pseh/pseh2.h>
00007
00008 #define TAG_NPFS_CCB 'cFpN'
00009 #define TAG_NPFS_CCB_DATA 'iFpN'
00010 #define TAG_NPFS_FCB 'FFpN'
00011 #define TAG_NPFS_NAMEBLOCK 'nFpN'
00012 #define TAG_NPFS_THREAD_CONTEXT 'tFpN'
00013
00014 #define ROUND_DOWN(n, align) \
00015 (((ULONG)n) & ~((align) - 1l))
00016
00017 #define ROUND_UP(n, align) \
00018 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
00019
00020 typedef enum _FCB_TYPE
00021 {
00022 FCB_INVALID,
00023 FCB_DEVICE,
00024 FCB_DIRECTORY,
00025 FCB_PIPE
00026 } FCB_TYPE;
00027
00028 typedef enum _CCB_TYPE
00029 {
00030 CCB_INVALID,
00031 CCB_DEVICE,
00032 CCB_DIRECTORY,
00033 CCB_PIPE
00034 } CCB_TYPE;
00035
00036
00037 typedef struct _NPFS_VCB
00038 {
00039 LIST_ENTRY PipeListHead;
00040 LIST_ENTRY ThreadListHead;
00041 KMUTEX PipeListLock;
00042 ULONG EmptyWaiterCount;
00043 ULONG MinQuota;
00044 ULONG DefaultQuota;
00045 ULONG MaxQuota;
00046 struct _NPFS_FCB *DeviceFcb;
00047 struct _NPFS_FCB *RootFcb;
00048 } NPFS_VCB, *PNPFS_VCB;
00049
00050 typedef struct _NPFS_FCB
00051 {
00052 FCB_TYPE Type;
00053 PNPFS_VCB Vcb;
00054 UNICODE_STRING PipeName;
00055 LIST_ENTRY PipeListEntry;
00056 KMUTEX CcbListLock;
00057 LIST_ENTRY ServerCcbListHead;
00058 LIST_ENTRY ClientCcbListHead;
00059 LIST_ENTRY WaiterListHead;
00060 LIST_ENTRY EmptyBufferListHead;
00061 ULONG PipeType;
00062 ULONG ClientReadMode;
00063 ULONG ServerReadMode;
00064 ULONG CompletionMode;
00065 ULONG PipeConfiguration;
00066 ULONG MaximumInstances;
00067 ULONG CurrentInstances;
00068 ULONG InboundQuota;
00069 ULONG OutboundQuota;
00070 LARGE_INTEGER TimeOut;
00071 } NPFS_FCB, *PNPFS_FCB;
00072
00073
00074 typedef struct _NPFS_CCB_DIRECTORY_DATA
00075 {
00076 UNICODE_STRING SearchPattern;
00077 ULONG FileIndex;
00078 } NPFS_CCB_DIRECTORY_DATA, *PNPFS_CCB_DIRECTORY_DATA;
00079
00080
00081 typedef struct _NPFS_CCB
00082 {
00083 LIST_ENTRY CcbListEntry;
00084 CCB_TYPE Type;
00085 PNPFS_FCB Fcb;
00086
00087 PFILE_OBJECT FileObject;
00088
00089 struct _NPFS_CCB* OtherSide;
00090 struct ETHREAD *Thread;
00091 KEVENT ConnectEvent;
00092 KEVENT ReadEvent;
00093 KEVENT WriteEvent;
00094 ULONG PipeEnd;
00095 ULONG PipeState;
00096 ULONG ReadDataAvailable;
00097 ULONG WriteQuotaAvailable;
00098 ULONG RefCount;
00099
00100 LIST_ENTRY ReadRequestListHead;
00101
00102 PVOID Data;
00103 PVOID ReadPtr;
00104 PVOID WritePtr;
00105 ULONG MaxDataLength;
00106
00107 FAST_MUTEX DataListLock;
00108
00109 union
00110 {
00111 NPFS_CCB_DIRECTORY_DATA Directory;
00112 } u;
00113
00114 } NPFS_CCB, *PNPFS_CCB;
00115
00116 typedef struct _NPFS_CONTEXT
00117 {
00118 LIST_ENTRY ListEntry;
00119 PKEVENT WaitEvent;
00120 } NPFS_CONTEXT, *PNPFS_CONTEXT;
00121
00122 typedef struct _NPFS_THREAD_CONTEXT
00123 {
00124 ULONG Count;
00125 KEVENT Event;
00126 PNPFS_VCB Vcb;
00127 LIST_ENTRY ListEntry;
00128 PVOID WaitObjectArray[MAXIMUM_WAIT_OBJECTS];
00129 KWAIT_BLOCK WaitBlockArray[MAXIMUM_WAIT_OBJECTS];
00130 PIRP WaitIrpArray[MAXIMUM_WAIT_OBJECTS];
00131 } NPFS_THREAD_CONTEXT, *PNPFS_THREAD_CONTEXT;
00132
00133 typedef struct _NPFS_WAITER_ENTRY
00134 {
00135 LIST_ENTRY Entry;
00136 PNPFS_CCB Ccb;
00137 } NPFS_WAITER_ENTRY, *PNPFS_WAITER_ENTRY;
00138
00139
00140 extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList;
00141
00142
00143 #define KeLockMutex(x) KeWaitForSingleObject(x, \
00144 UserRequest, \
00145 KernelMode, \
00146 FALSE, \
00147 NULL);
00148
00149 #define KeUnlockMutex(x) KeReleaseMutex(x, FALSE);
00150
00151 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
00152
00153 DRIVER_DISPATCH NpfsCreate;
00154 NTSTATUS NTAPI NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00155
00156 DRIVER_DISPATCH NpfsCreateNamedPipe;
00157 NTSTATUS NTAPI NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00158
00159 DRIVER_DISPATCH NpfsCleanup;
00160 NTSTATUS NTAPI NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00161
00162 DRIVER_DISPATCH NpfsClose;
00163 NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00164
00165 DRIVER_DISPATCH NpfsDirectoryControl;
00166 NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00167
00168 DRIVER_DISPATCH NpfsRead;
00169 NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00170
00171 DRIVER_DISPATCH NpfsWrite;
00172 NTSTATUS NTAPI NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00173
00174 DRIVER_DISPATCH NpfsFlushBuffers;
00175 NTSTATUS NTAPI NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00176
00177 DRIVER_DISPATCH NpfsFileSystemControl;
00178 NTSTATUS NTAPI NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00179
00180 DRIVER_DISPATCH NpfsQueryInformation;
00181 NTSTATUS NTAPI NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00182
00183 DRIVER_DISPATCH NpfsSetInformation;
00184 NTSTATUS NTAPI NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
00185
00186 DRIVER_DISPATCH NpfsQueryVolumeInformation;
00187 NTSTATUS NTAPI NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject, PIRP Irp);
00188
00189 NTSTATUS NTAPI
00190 DriverEntry(PDRIVER_OBJECT DriverObject,
00191 PUNICODE_STRING RegistryPath);
00192
00193 PNPFS_FCB
00194 NpfsFindPipe(PNPFS_VCB Vcb,
00195 PUNICODE_STRING PipeName);
00196
00197 FCB_TYPE
00198 NpfsGetFcb(PFILE_OBJECT FileObject,
00199 PNPFS_FCB *Fcb);
00200
00201 CCB_TYPE
00202 NpfsGetCcb(PFILE_OBJECT FileObject,
00203 PNPFS_CCB *Ccb);
00204
00205 #endif