Sync to trunk head (r47736)
[reactos.git] / drivers / filesystems / fastfat_new / fatstruc.h
1 #pragma once
2
3 typedef struct _FAT_SCAN_CONTEXT *PFAT_SCAN_CONTEXT;
4 typedef struct _FAT_IO_CONTEXT *PFAT_IO_CONTEXT;
5 typedef struct _FAT_IRP_CONTEXT *PFAT_IRP_CONTEXT;
6 typedef PVOID PBCB;
7
8 typedef NTSTATUS (*PFAT_OPERATION_HANDLER) (PFAT_IRP_CONTEXT);
9
10 /* Node type stuff */
11 typedef CSHORT FAT_NODE_TYPE;
12 typedef FAT_NODE_TYPE *PFAT_NODE_TYPE;
13
14 #define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
15
16 /* Node type codes */
17 #define FAT_NTC_VCB (CSHORT) '00VF'
18 #define FAT_NTC_FCB (CSHORT) 'CF'
19 #define FAT_NTC_DCB (CSHORT) 'DF'
20 #define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
21 #define FAT_NTC_CCB (CSHORT) 'BCC'
22
23 typedef struct _FAT_GLOBAL_DATA
24 {
25 ERESOURCE Resource;
26 PDRIVER_OBJECT DriverObject;
27 PDEVICE_OBJECT DiskDeviceObject;
28 LIST_ENTRY VcbListHead;
29 NPAGED_LOOKASIDE_LIST NonPagedFcbList;
30 NPAGED_LOOKASIDE_LIST ResourceList;
31 NPAGED_LOOKASIDE_LIST IrpContextList;
32 FAST_IO_DISPATCH FastIoDispatch;
33 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
34 CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks;
35 BOOLEAN Win31FileSystem;
36 /* Jan 1, 1980 System Time */
37 LARGE_INTEGER DefaultFileTime;
38
39 /* FullFAT integration */
40 FF_IOMAN *Ioman;
41 FF_ERROR FF_Error;
42 } FAT_GLOBAL_DATA;
43
44 typedef struct _FAT_PAGE_CONTEXT
45 {
46 PFILE_OBJECT FileObject;
47 LARGE_INTEGER EndOfData;
48 LARGE_INTEGER Offset;
49 LARGE_INTEGER EndOfPage;
50 SIZE_T ValidLength;
51 PVOID Buffer;
52 PBCB Bcb;
53 BOOLEAN CanWait;
54 } FAT_PAGE_CONTEXT, *PFAT_PAGE_CONTEXT;
55
56 #define FatPinSetupContext(xContext, xFcb, CanWait) \
57 { \
58 (xContext)->FileObject = (xFcb)->StreamFileObject; \
59 (xContext)->EndOfData = (xFcb)->Header.FileSize; \
60 (xContext)->Offset.QuadPart = -1LL; \
61 (xContext)->Bcb = NULL; \
62 (xContext)->CanWait = CanWait; \
63 }
64
65 #define FatPinCleanupContext(xContext) \
66 if ((xContext)->Bcb != NULL) { \
67 CcUnpinData((xContext)->Bcb); \
68 (xContext)->Bcb = NULL; \
69 } \
70
71 #define FatPinEndOfPage(xContext, xType) \
72 Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
73
74 #define FatPinIsLastPage(xContext) \
75 ((xContext)->ValidLength != PAGE_SIZE)
76
77 #define IRPCONTEXT_CANWAIT 0x0001
78 #define IRPCONTEXT_PENDINGRETURNED 0x0002
79 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
80 #define IRPCONTEXT_WRITETHROUGH 0x0008
81 #define IRPCONTEXT_TOPLEVEL 0x0010
82
83 typedef struct _FAT_IRP_CONTEXT
84 {
85 PIRP Irp;
86 PDEVICE_OBJECT DeviceObject;
87 UCHAR MajorFunction;
88 UCHAR MinorFunction;
89 PFILE_OBJECT FileObject;
90 ULONG Flags;
91 struct _VCB *Vcb;
92 ULONG PinCount;
93 FAT_PAGE_CONTEXT Page;
94 struct _FAT_IO_CONTEXT *FatIoContext;
95 WORK_QUEUE_ITEM WorkQueueItem;
96 PFAT_OPERATION_HANDLER QueuedOperationHandler;
97 PIO_STACK_LOCATION Stack;
98 KEVENT Event;
99 } FAT_IRP_CONTEXT;
100
101 typedef struct _FAT_IO_CONTEXT
102 {
103 PMDL ZeroMdl;
104 PIRP Irp;
105 LONG RunCount;
106 SIZE_T Length;
107 LONGLONG Offset;
108 PFILE_OBJECT FileObject;
109
110 union
111 {
112 struct
113 {
114 PERESOURCE Resource;
115 PERESOURCE PagingIoResource;
116 ERESOURCE_THREAD ResourceThreadId;
117 } Async;
118 KEVENT SyncEvent;
119 } Wait;
120 PIRP AssociatedIrp[0];
121 } FAT_IO_CONTEXT;
122
123 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, PULONG, BOOLEAN);
124 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, ULONG, ULONG, BOOLEAN);
125 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, PULONG, ULONG, BOOLEAN);
126 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE) (PFAT_PAGE_CONTEXT, ULONG, ULONG, ULONG, BOOLEAN);
127
128 typedef struct _FAT_METHODS {
129 PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun;
130 PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun;
131 PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun;
132 PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun;
133 } FAT_METHODS, *PFAT_METHODS;
134
135 #define VCB_STATE_FLAG_LOCKED 0x01
136 #define VCB_STATE_FLAG_DIRTY 0x02
137 #define VCB_STATE_MOUNTED_DIRTY 0x04
138 #define VCB_STATE_CREATE_IN_PROGRESS 0x08
139
140 typedef enum _VCB_CONDITION
141 {
142 VcbGood,
143 VcbNotMounted,
144 VcbBad
145 } VCB_CONDITION;
146
147 /* Volume Control Block */
148 typedef struct _VCB
149 {
150 FSRTL_ADVANCED_FCB_HEADER Header;
151 FAST_MUTEX HeaderMutex;
152 SECTION_OBJECT_POINTERS SectionObjectPointers;
153
154 PFILE_OBJECT StreamFileObject;
155 PDEVICE_OBJECT TargetDeviceObject;
156 LIST_ENTRY VcbLinks;
157 PVPB Vpb;
158 ULONG State;
159 VCB_CONDITION Condition;
160 ERESOURCE Resource;
161
162 /* Direct volume access */
163 ULONG DirectOpenCount;
164 SHARE_ACCESS ShareAccess;
165
166 /* Notifications support */
167 PNOTIFY_SYNC NotifySync;
168 LIST_ENTRY NotifyList;
169
170 /* Volume Characteristics: */
171 ULONG SerialNumber;
172 BIOS_PARAMETER_BLOCK Bpb;
173 ULONG BytesPerClusterLog;
174 ULONG BytesPerCluster;
175 ULONG SectorsPerFat;
176 ULONG DataArea;
177 ULONG Sectors;
178 ULONG Clusters;
179 ULONG IndexDepth;
180 ULONG RootDirent;
181 ULONG RootDirentSectors;
182 LONGLONG BeyondLastClusterInFat;
183 FAT_METHODS Methods;
184
185 /* Root Directory Control block */
186 struct _FCB *RootDcb;
187
188 /* Counters */
189 ULONG MediaChangeCount;
190 ULONG OpenFileCount;
191
192 /* FullFAT integration */
193 FF_IOMAN *Ioman;
194 } VCB, *PVCB;
195
196 #define VcbToVolumeDeviceObject(xVcb) \
197 CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
198
199 #define VcbToDeviceObject(xVcb) \
200 &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
201
202
203 #define SectorsToBytes(xVcb, xSectrors) \
204 ((xVcb)->Bpb.BytesPerSector * (xSectrors))
205
206 #define BytesToSectors(xVcb, xBytes) \
207 ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
208
209 #define SectorsToClusters(xVcb, xSectors) \
210 ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
211
212 #define VCB_FAT_BITMAP_SIZE 0x10000
213 #define VcbFatBitmapIndex(xCluster) ((xCluster)/VCB_FAT_BITMAP_SIZE)
214
215 /* Volume Device Object */
216 typedef struct _VOLUME_DEVICE_OBJECT
217 {
218 DEVICE_OBJECT DeviceObject;
219 union {
220 FSRTL_COMMON_FCB_HEADER VolumeHeader;
221 VCB Vcb; /* Must be the last entry! */
222 };
223 } VOLUME_DEVICE_OBJECT, *PVOLUME_DEVICE_OBJECT;
224 //
225 // Short name always exists in FAT
226 //
227 enum _FCB_NAME_TYPE {
228 FcbShortName = 0x0,
229 FcbLongName
230 } FCB_NAME_TYPE;
231
232 typedef struct _FCB_NAME_LINK {
233 struct _FCB *Fcb;
234 RTL_SPLAY_LINKS Links;
235 union
236 {
237 OEM_STRING Ansi;
238 UNICODE_STRING String;
239 } Name;
240 BOOLEAN IsDosName;
241 } FCB_NAME_LINK, *PFCB_NAME_LINK;
242
243 typedef enum _FCB_CONDITION
244 {
245 FcbGood,
246 FcbBad,
247 FcbNeedsToBeVerified
248 } FCB_CONDITION;
249
250 #define FCB_STATE_HAS_NAMES 0x01
251 #define FCB_STATE_HAS_UNICODE_NAME 0x02
252 #define FCB_STATE_PAGEFILE 0x04
253 #define FCB_STATE_DELAY_CLOSE 0x08
254 #define FCB_STATE_TRUNCATE_ON_CLOSE 0x10
255
256 typedef struct _FCB
257 {
258 FSRTL_ADVANCED_FCB_HEADER Header;
259 /*
260 * Later we might want to move the next four fields
261 * into a separate structureif we decide to split
262 * FCB into paged and non paged parts
263 * (as it is done in MS implementation
264 */
265 FAST_MUTEX HeaderMutex; // nonpaged!
266 SECTION_OBJECT_POINTERS SectionObjectPointers;
267 ERESOURCE Resource; // nonpaged!
268 ERESOURCE PagingIoResource; // nonpaged!
269
270 /* First cluster in the fat allocation chain */
271 ULONG FirstClusterOfFile;
272 /* A list of all FCBs of that DCB */
273 LIST_ENTRY ParentDcbLinks;
274 /* Reference to the Parent Dcb*/
275 struct _FCB *ParentFcb;
276 /* Pointer to a Vcb */
277 PVCB Vcb;
278 /* Fcb state */
279 ULONG State;
280 /* Fcb condition */
281 FCB_CONDITION Condition;
282 /* Share access */
283 SHARE_ACCESS ShareAccess;
284 /* Mcb mapping Vbo->Lbo */
285 LARGE_MCB Mcb;
286 ULONG FirstCluster;
287 /* Links into FCB Tree */
288 FCB_NAME_LINK ShortName;
289 FCB_NAME_LINK LongName;
290 /* Buffer for the short name */
291 CHAR ShortNameBuffer[0xc];
292 /* Full file name */
293 UNICODE_STRING FullFileName;
294 /* Long name with exact case */
295 UNICODE_STRING ExactCaseLongName;
296 /* Hint for the filename length */
297 ULONG FileNameLength;
298 /* A copy of fat attribute byte */
299 UCHAR DirentFatFlags;
300 /* File basic info */
301 FILE_BASIC_INFORMATION BasicInfo;
302 /* FullFAT file handle */
303 FF_FILE *FatHandle;
304 /* The file has outstanding async writes */
305 ULONG OutstandingAsyncWrites;
306 /* The outstanding async writes sync event */
307 PKEVENT OutstandingAsyncEvent;
308 /* Counters */
309 ULONG OpenCount;
310 union
311 {
312 struct
313 {
314 /* File and Op locks */
315 FILE_LOCK Lock;
316 OPLOCK Oplock;
317 } Fcb;
318
319 struct
320 {
321 /* A list of all FCBs/DCBs opened under this DCB */
322 LIST_ENTRY ParentDcbList;
323 /* Directory data stream (just handy to have it). */
324 PFILE_OBJECT StreamFileObject;
325 /* Bitmap to search for free dirents. */
326 RTL_BITMAP FreeBitmap;
327 /* Names */
328 PRTL_SPLAY_LINKS SplayLinksAnsi;
329 PRTL_SPLAY_LINKS SplayLinksUnicode;
330 } Dcb;
331 };
332 } FCB, *PFCB;
333
334 typedef struct _FAT_ENUM_DIRENT_CONTEXT *PFAT_ENUM_DIRENT_CONTEXT;
335 typedef struct _FAT_ENUM_DIR_CONTEXT *PFAT_ENUM_DIR_CONTEXT;
336
337 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE) (PFAT_ENUM_DIR_CONTEXT, PDIR_ENTRY, PVOID);
338
339 typedef struct _FAT_ENUM_DIRENT_CONTEXT
340 {
341 FAT_PAGE_CONTEXT Page;
342
343 /* Copy dirent to dirinfo */
344 PFAT_COPY_DIRENT_ROUTINE CopyDirent;
345 LONGLONG BytesPerClusterMask;
346
347 /* Info buffer characteristics */
348 PVOID Buffer;
349 SIZE_T Offset;
350 SIZE_T Length;
351
352 /* Criteria */
353 PUNICODE_STRING FileName;
354 UCHAR CcbFlags;
355
356 /* Lfn buffer/length offsets */
357 ULONG LengthOffset;
358 ULONG NameOffset;
359 } FAT_ENUM_DIRENT_CONTEXT;
360
361 typedef struct _FAT_FIND_DIRENT_CONTEXT
362 {
363 FAT_PAGE_CONTEXT Page;
364 UNICODE_STRING ShortName;
365 WCHAR ShortNameBuffer[0x18];
366 /* Criteria */
367 PUNICODE_STRING FileName;
368 BOOLEAN Valid8dot3Name;
369 } FAT_FIND_DIRENT_CONTEXT, *PFAT_FIND_DIRENT_CONTEXT;
370
371 typedef struct _CCB
372 {
373 CSHORT NodeTypeCode;
374 CSHORT NodeByteSize;
375
376 LARGE_INTEGER CurrentByteOffset;
377 ULONG Entry;
378 UNICODE_STRING SearchPattern;
379 UCHAR Flags;
380 } CCB, *PCCB;
381
382 typedef enum _TYPE_OF_OPEN
383 {
384 UnopenedFileObject,
385 UserFileOpen,
386 UserDirectoryOpen,
387 UserVolumeOpen,
388 VirtualVolumeFile,
389 DirectoryFile,
390 EaFile
391 } TYPE_OF_OPEN;
392
393 typedef enum _FILE_TIME_INDEX
394 {
395 FileCreationTime = 0,
396 FileLastAccessTime,
397 FileLastWriteTime,
398 FileChangeTime
399 } FILE_TIME_INDEX;
400
401 #define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
402 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
403 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
404 #define CCB_DASD_IO 0x10
405 extern FAT_GLOBAL_DATA FatGlobalData;