[NPFS]
[reactos.git] / reactos / drivers / filesystems / npfs / npfs.h
1 #ifndef __DRIVERS_FS_NP_NPFS_H
2 #define __DRIVERS_FS_NP_NPFS_H
3
4 #include <ntifs.h>
5 #include <ndk/iotypes.h>
6 #include <pseh/pseh2.h>
7
8 #define ROUND_DOWN(n, align) \
9 (((ULONG)n) & ~((align) - 1l))
10
11 #define ROUND_UP(n, align) \
12 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
13
14 typedef enum _FCB_TYPE
15 {
16 FCB_INVALID,
17 FCB_DEVICE,
18 FCB_DIRECTORY,
19 FCB_PIPE
20 } FCB_TYPE;
21
22 typedef enum _CCB_TYPE
23 {
24 CCB_INVALID,
25 CCB_DEVICE,
26 CCB_DIRECTORY,
27 CCB_PIPE
28 } CCB_TYPE;
29
30 /* Volume Control Block (VCB) aka Device Extension */
31 typedef struct _NPFS_VCB
32 {
33 LIST_ENTRY PipeListHead;
34 LIST_ENTRY ThreadListHead;
35 KMUTEX PipeListLock;
36 ULONG EmptyWaiterCount;
37 ULONG MinQuota;
38 ULONG DefaultQuota;
39 ULONG MaxQuota;
40 struct _NPFS_FCB *DeviceFcb;
41 struct _NPFS_FCB *RootFcb;
42 } NPFS_VCB, *PNPFS_VCB;
43
44 typedef struct _NPFS_FCB
45 {
46 FCB_TYPE Type;
47 PNPFS_VCB Vcb;
48 UNICODE_STRING PipeName;
49 LIST_ENTRY PipeListEntry;
50 KMUTEX CcbListLock;
51 LIST_ENTRY ServerCcbListHead;
52 LIST_ENTRY ClientCcbListHead;
53 LIST_ENTRY WaiterListHead;
54 LIST_ENTRY EmptyBufferListHead;
55 ULONG PipeType;
56 ULONG ClientReadMode;
57 ULONG ServerReadMode;
58 ULONG CompletionMode;
59 ULONG PipeConfiguration;
60 ULONG MaximumInstances;
61 ULONG CurrentInstances;
62 ULONG InboundQuota;
63 ULONG OutboundQuota;
64 LARGE_INTEGER TimeOut;
65 } NPFS_FCB, *PNPFS_FCB;
66
67
68 typedef struct _NPFS_CCB_DIRECTORY_DATA
69 {
70 UNICODE_STRING SearchPattern;
71 ULONG FileIndex;
72 } NPFS_CCB_DIRECTORY_DATA, *PNPFS_CCB_DIRECTORY_DATA;
73
74
75 typedef struct _NPFS_CCB
76 {
77 LIST_ENTRY CcbListEntry;
78 CCB_TYPE Type;
79 PNPFS_FCB Fcb;
80
81 struct _NPFS_CCB* OtherSide;
82 struct ETHREAD *Thread;
83 KEVENT ConnectEvent;
84 KEVENT ReadEvent;
85 KEVENT WriteEvent;
86 ULONG PipeEnd;
87 ULONG PipeState;
88 ULONG ReadDataAvailable;
89 ULONG WriteQuotaAvailable;
90
91 LIST_ENTRY ReadRequestListHead;
92
93 PVOID Data;
94 PVOID ReadPtr;
95 PVOID WritePtr;
96 ULONG MaxDataLength;
97
98 FAST_MUTEX DataListLock; /* Data queue lock */
99
100 union
101 {
102 NPFS_CCB_DIRECTORY_DATA Directory;
103 } u;
104
105 } NPFS_CCB, *PNPFS_CCB;
106
107 typedef struct _NPFS_CONTEXT
108 {
109 LIST_ENTRY ListEntry;
110 PKEVENT WaitEvent;
111 } NPFS_CONTEXT, *PNPFS_CONTEXT;
112
113 typedef struct _NPFS_THREAD_CONTEXT
114 {
115 ULONG Count;
116 KEVENT Event;
117 PNPFS_VCB Vcb;
118 LIST_ENTRY ListEntry;
119 PVOID WaitObjectArray[MAXIMUM_WAIT_OBJECTS];
120 KWAIT_BLOCK WaitBlockArray[MAXIMUM_WAIT_OBJECTS];
121 PIRP WaitIrpArray[MAXIMUM_WAIT_OBJECTS];
122 } NPFS_THREAD_CONTEXT, *PNPFS_THREAD_CONTEXT;
123
124 typedef struct _NPFS_WAITER_ENTRY
125 {
126 LIST_ENTRY Entry;
127 PNPFS_CCB Ccb;
128 } NPFS_WAITER_ENTRY, *PNPFS_WAITER_ENTRY;
129
130
131 extern NPAGED_LOOKASIDE_LIST NpfsPipeDataLookasideList;
132
133
134 #define KeLockMutex(x) KeWaitForSingleObject(x, \
135 UserRequest, \
136 KernelMode, \
137 FALSE, \
138 NULL);
139
140 #define KeUnlockMutex(x) KeReleaseMutex(x, FALSE);
141
142 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
143
144 DRIVER_DISPATCH NpfsCreate;
145 NTSTATUS NTAPI NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
146
147 DRIVER_DISPATCH NpfsCreateNamedPipe;
148 NTSTATUS NTAPI NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp);
149
150 DRIVER_DISPATCH NpfsCleanup;
151 NTSTATUS NTAPI NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
152
153 DRIVER_DISPATCH NpfsClose;
154 NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
155
156 DRIVER_DISPATCH NpfsDirectoryControl;
157 NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
158
159 DRIVER_DISPATCH NpfsRead;
160 NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
161
162 DRIVER_DISPATCH NpfsWrite;
163 NTSTATUS NTAPI NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
164
165 DRIVER_DISPATCH NpfsFlushBuffers;
166 NTSTATUS NTAPI NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
167
168 DRIVER_DISPATCH NpfsFileSystemControl;
169 NTSTATUS NTAPI NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
170
171 DRIVER_DISPATCH NpfsQueryInformation;
172 NTSTATUS NTAPI NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
173
174 DRIVER_DISPATCH NpfsSetInformation;
175 NTSTATUS NTAPI NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
176
177 DRIVER_DISPATCH NpfsQueryVolumeInformation;
178 NTSTATUS NTAPI NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject, PIRP Irp);
179
180 NTSTATUS NTAPI
181 DriverEntry(PDRIVER_OBJECT DriverObject,
182 PUNICODE_STRING RegistryPath);
183
184 PNPFS_FCB
185 NpfsFindPipe(PNPFS_VCB Vcb,
186 PUNICODE_STRING PipeName);
187
188 FCB_TYPE
189 NpfsGetFcb(PFILE_OBJECT FileObject,
190 PNPFS_FCB *Fcb);
191
192 CCB_TYPE
193 NpfsGetCcb(PFILE_OBJECT FileObject,
194 PNPFS_CCB *Ccb);
195
196 #endif /* __DRIVERS_FS_NP_NPFS_H */