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