[CDFS] Implement volume un/locking.
[reactos.git] / drivers / filesystems / cdfs / cdfs.h
1 #ifndef CDFS_H
2 #define CDFS_H
3
4 #include <ntifs.h>
5 #include <ntddcdrm.h>
6 #include <pseh/pseh2.h>
7
8 #ifdef __GNUC__
9 #define INIT_SECTION __attribute__((section ("INIT")))
10 #else
11 #define INIT_SECTION /* Done via alloc_text for MSC */
12 #endif
13
14 #define CDFS_BASIC_SECTOR 2048
15 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
16 #define BLOCKSIZE CDFS_BASIC_SECTOR
17 #define CDFS_MAX_NAME_LEN 256
18
19 /* Volume descriptor types (VdType) */
20 #define BOOT_VOLUME_DESCRIPTOR_TYPE 0
21 #define PRIMARY_VOLUME_DESCRIPTOR_TYPE 1
22 #define SUPPLEMENTARY_VOLUME_DESCRIPTOR_TYPE 2
23 #define VOLUME_PARTITION_DESCRIPTOR_TYPE 3
24 #define VOLUME_DESCRIPTOR_SET_TERMINATOR 255
25
26 #include <pshpack1.h>
27 struct _DIR_RECORD
28 {
29 UCHAR RecordLength; // 1
30 UCHAR ExtAttrRecordLength; // 2
31 ULONG ExtentLocationL; // 3-6
32 ULONG ExtentLocationM; // 7-10
33 ULONG DataLengthL; // 11-14
34 ULONG DataLengthM; // 15-18
35 UCHAR Year; // 19
36 UCHAR Month; // 20
37 UCHAR Day; // 21
38 UCHAR Hour; // 22
39 UCHAR Minute; // 23
40 UCHAR Second; // 24
41 UCHAR TimeZone; // 25
42 UCHAR FileFlags; // 26
43 UCHAR FileUnitSize; // 27
44 UCHAR InterleaveGapSize; // 28
45 ULONG VolumeSequenceNumber; // 29-32
46 UCHAR FileIdLength; // 33
47 UCHAR FileId[1]; // 34
48 };
49 #include <poppack.h>
50
51 typedef struct _DIR_RECORD DIR_RECORD, *PDIR_RECORD;
52
53 /* DIR_RECORD.FileFlags */
54 #define FILE_FLAG_HIDDEN 0x01
55 #define FILE_FLAG_DIRECTORY 0x02
56 #define FILE_FLAG_SYSTEM 0x04
57 #define FILE_FLAG_READONLY 0x10
58
59
60 /* Volume Descriptor header*/
61 #include <pshpack1.h>
62 struct _VD_HEADER
63 {
64 UCHAR VdType; // 1
65 UCHAR StandardId[5]; // 2-6
66 UCHAR VdVersion; // 7
67 };
68
69 typedef struct _VD_HEADER VD_HEADER, *PVD_HEADER;
70
71
72
73 /* Primary Volume Descriptor */
74 struct _PVD
75 {
76 UCHAR VdType; // 1
77 UCHAR StandardId[5]; // 2-6
78 UCHAR VdVersion; // 7
79 UCHAR unused0; // 8
80 UCHAR SystemId[32]; // 9-40
81 UCHAR VolumeId[32]; // 41-72
82 UCHAR unused1[8]; // 73-80
83 ULONG VolumeSpaceSizeL; // 81-84
84 ULONG VolumeSpaceSizeM; // 85-88
85 UCHAR unused2[32]; // 89-120
86 ULONG VolumeSetSize; // 121-124
87 ULONG VolumeSequenceNumber; // 125-128
88 ULONG LogicalBlockSize; // 129-132
89 ULONG PathTableSizeL; // 133-136
90 ULONG PathTableSizeM; // 137-140
91 ULONG LPathTablePos; // 141-144
92 ULONG LOptPathTablePos; // 145-148
93 ULONG MPathTablePos; // 149-152
94 ULONG MOptPathTablePos; // 153-156
95 DIR_RECORD RootDirRecord; // 157-190
96 UCHAR VolumeSetIdentifier[128]; // 191-318
97 UCHAR PublisherIdentifier[128]; // 319-446
98
99 /* more data ... */
100
101 };
102 typedef struct _PVD PVD, *PPVD;
103
104
105 /* Supplementary Volume Descriptor */
106 struct _SVD
107 {
108 UCHAR VdType; // 1
109 UCHAR StandardId[5]; // 2-6
110 UCHAR VdVersion; // 7
111 UCHAR VolumeFlags; // 8
112 UCHAR SystemId[32]; // 9-40
113 UCHAR VolumeId[32]; // 41-72
114 UCHAR unused1[8]; // 73-80
115 ULONG VolumeSpaceSizeL; // 81-84
116 ULONG VolumeSpaceSizeM; // 85-88
117 UCHAR EscapeSequences[32]; // 89-120
118 ULONG VolumeSetSize; // 121-124
119 ULONG VolumeSequenceNumber; // 125-128
120 ULONG LogicalBlockSize; // 129-132
121 ULONG PathTableSizeL; // 133-136
122 ULONG PathTableSizeM; // 137-140
123 ULONG LPathTablePos; // 141-144
124 ULONG LOptPathTablePos; // 145-148
125 ULONG MPathTablePos; // 149-152
126 ULONG MOptPathTablePos; // 153-156
127 DIR_RECORD RootDirRecord; // 157-190
128 UCHAR VolumeSetIdentifier[128]; // 191-318
129 UCHAR PublisherIdentifier[128]; // 319-446
130
131 // more data ...
132 };
133 #include <poppack.h>
134
135 typedef struct _SVD SVD, *PSVD;
136
137
138
139
140
141
142
143 typedef struct _CDINFO
144 {
145 ULONG VolumeOffset;
146 ULONG VolumeSpaceSize;
147 ULONG JolietLevel;
148 ULONG RootStart;
149 ULONG RootSize;
150 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
151 USHORT VolumeLabelLength;
152 ULONG SerialNumber;
153 } CDINFO, *PCDINFO;
154
155
156 #define VCB_VOLUME_LOCKED 0x0001
157
158 typedef struct
159 {
160 ERESOURCE VcbResource;
161 ERESOURCE DirResource;
162
163 KSPIN_LOCK FcbListLock;
164 LIST_ENTRY FcbListHead;
165
166 PDEVICE_OBJECT VolumeDevice;
167 PDEVICE_OBJECT StorageDevice;
168 PFILE_OBJECT StreamFileObject;
169
170 ULONG Flags;
171
172 CDINFO CdInfo;
173
174 /* Notifications */
175 LIST_ENTRY NotifyList;
176 PNOTIFY_SYNC NotifySync;
177
178 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
179 ULONG OpenHandleCount;
180 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
181
182
183 #define FCB_CACHE_INITIALIZED 0x0001
184 #define FCB_IS_VOLUME_STREAM 0x0002
185 #define FCB_IS_VOLUME 0x0004
186
187 #define MAX_PATH 260
188
189 typedef struct _CDFS_SHORT_NAME
190 {
191 LIST_ENTRY Entry;
192 LARGE_INTEGER StreamOffset;
193 UNICODE_STRING Name;
194 WCHAR NameBuffer[13];
195 } CDFS_SHORT_NAME, *PCDFS_SHORT_NAME;
196
197 typedef struct _FCB
198 {
199 FSRTL_COMMON_FCB_HEADER RFCB;
200 SECTION_OBJECT_POINTERS SectionObjectPointers;
201 ERESOURCE MainResource;
202 ERESOURCE PagingIoResource;
203
204 PFILE_OBJECT FileObject;
205 PDEVICE_EXTENSION DevExt;
206
207 UNICODE_STRING ShortNameU;
208
209 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
210 UNICODE_STRING PathName; /* path+filename 260 max */
211 WCHAR PathNameBuffer[MAX_PATH]; /* Buffer for PathName */
212 WCHAR ShortNameBuffer[13];
213
214 LIST_ENTRY FcbListEntry;
215 struct _FCB* ParentFcb;
216
217 ULONG DirIndex;
218
219 LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */
220 /* LowPart: Directory record offset in the parent directory file */
221
222 LONG RefCount;
223 ULONG Flags;
224
225 DIR_RECORD Entry;
226
227 ERESOURCE NameListResource;
228 LIST_ENTRY ShortNameList;
229 FILE_LOCK FileLock;
230 } FCB, *PFCB;
231
232
233 typedef struct _CCB
234 {
235 LIST_ENTRY NextCCB;
236 PFILE_OBJECT PtrFileObject;
237 LARGE_INTEGER CurrentByteOffset;
238 /* for DirectoryControl */
239 ULONG Entry;
240 ULONG Offset;
241 /* for DirectoryControl */
242 UNICODE_STRING DirectorySearchPattern;
243 ULONG LastCluster;
244 ULONG LastOffset;
245 } CCB, *PCCB;
246
247 #define CDFS_TAG 'sfdC'
248 #define CDFS_CCB_TAG 'ccdC'
249 #define CDFS_NONPAGED_FCB_TAG 'nfdC'
250 #define CDFS_SHORT_NAME_TAG 'sgdC'
251 #define CDFS_SEARCH_PATTERN_TAG 'eedC'
252 #define CDFS_FILENAME_TAG 'nFdC'
253
254 typedef struct _CDFS_GLOBAL_DATA
255 {
256 PDRIVER_OBJECT DriverObject;
257 PDEVICE_OBJECT CdFsDeviceObject;
258 PDEVICE_OBJECT HddFsDeviceObject;
259 ULONG Flags;
260 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
261 FAST_IO_DISPATCH FastIoDispatch;
262 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
263 } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
264
265 #define IRPCONTEXT_CANWAIT 0x1
266 #define IRPCONTEXT_COMPLETE 0x2
267 #define IRPCONTEXT_QUEUE 0x4
268
269 typedef struct _CDFS_IRP_CONTEXT
270 {
271 // NTFSIDENTIFIER Identifier;
272 ULONG Flags;
273 PIO_STACK_LOCATION Stack;
274 UCHAR MajorFunction;
275 UCHAR MinorFunction;
276 WORK_QUEUE_ITEM WorkQueueItem;
277 PIRP Irp;
278 BOOLEAN IsTopLevel;
279 PDEVICE_OBJECT DeviceObject;
280 PFILE_OBJECT FileObject;
281 NTSTATUS SavedExceptionCode;
282 CCHAR PriorityBoost;
283 } CDFS_IRP_CONTEXT, *PCDFS_IRP_CONTEXT;
284
285
286 extern PCDFS_GLOBAL_DATA CdfsGlobalData;
287
288 /* cdfs.c */
289
290 NTSTATUS
291 NTAPI
292 DriverEntry(
293 PDRIVER_OBJECT DriverObject,
294 PUNICODE_STRING RegistryPath);
295
296 /* cleanup.c */
297
298 NTSTATUS
299 NTAPI
300 CdfsCleanup(
301 PCDFS_IRP_CONTEXT IrpContext);
302
303
304 /* close.c */
305
306 NTSTATUS
307 NTAPI
308 CdfsClose(
309 PCDFS_IRP_CONTEXT IrpContext);
310
311 NTSTATUS
312 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
313 PFILE_OBJECT FileObject);
314
315
316 /* common.c */
317
318 NTSTATUS
319 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
320 IN ULONG DiskSector,
321 IN ULONG SectorCount,
322 IN OUT PUCHAR Buffer,
323 IN BOOLEAN Override);
324
325 NTSTATUS
326 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
327 IN ULONG CtlCode,
328 IN PVOID InputBuffer,
329 IN ULONG InputBufferSize,
330 IN OUT PVOID OutputBuffer,
331 IN OUT PULONG pOutputBufferSize,
332 IN BOOLEAN Override);
333
334 /* create.c */
335
336 NTSTATUS
337 NTAPI
338 CdfsCreate(
339 PCDFS_IRP_CONTEXT IrpContext);
340
341 /* devctrl.c */
342
343 NTSTATUS NTAPI
344 CdfsDeviceControl(
345 PCDFS_IRP_CONTEXT IrpContext);
346
347 /* dirctl.c */
348
349 NTSTATUS
350 NTAPI
351 CdfsDirectoryControl(
352 PCDFS_IRP_CONTEXT IrpContext);
353
354 /* dispatch.c */
355
356 DRIVER_DISPATCH CdfsFsdDispatch;
357 NTSTATUS
358 NTAPI
359 CdfsFsdDispatch(
360 PDEVICE_OBJECT DeviceObject,
361 PIRP Irp);
362
363 /* fastio.c */
364
365 BOOLEAN
366 NTAPI
367 CdfsAcquireForLazyWrite(IN PVOID Context,
368 IN BOOLEAN Wait);
369
370 VOID
371 NTAPI
372 CdfsReleaseFromLazyWrite(IN PVOID Context);
373
374 FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible;
375 FAST_IO_READ CdfsFastIoRead;
376 FAST_IO_WRITE CdfsFastIoWrite;
377
378 /* fcb.c */
379
380 PFCB
381 CdfsCreateFCB(PCWSTR FileName);
382
383 VOID
384 CdfsDestroyFCB(PFCB Fcb);
385
386 BOOLEAN
387 CdfsFCBIsDirectory(PFCB Fcb);
388
389 BOOLEAN
390 CdfsFCBIsRoot(PFCB Fcb);
391
392 VOID
393 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
394 PFCB Fcb);
395
396 VOID
397 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
398 PFCB Fcb);
399
400 VOID
401 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
402 PFCB Fcb);
403
404 PFCB
405 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
406 PUNICODE_STRING FileName);
407
408 NTSTATUS
409 CdfsFCBInitializeCache(PVCB Vcb,
410 PFCB Fcb);
411
412 PFCB
413 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
414
415 PFCB
416 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
417
418 NTSTATUS
419 CdfsMakeFCBFromDirEntry(PVCB Vcb,
420 PFCB DirectoryFCB,
421 PWSTR LongName,
422 PWSTR ShortName,
423 PDIR_RECORD Record,
424 ULONG DirectorySector,
425 ULONG DirectoryOffset,
426 PFCB * fileFCB);
427
428 NTSTATUS
429 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
430 PFCB Fcb,
431 PFILE_OBJECT FileObject);
432
433 NTSTATUS
434 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
435 PFCB DirectoryFcb,
436 PUNICODE_STRING FileToFind,
437 PFCB *FoundFCB);
438
439 NTSTATUS
440 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
441 PFCB *pParentFCB,
442 PFCB *pFCB,
443 PUNICODE_STRING FileName);
444
445
446 /* finfo.c */
447
448 NTSTATUS
449 NTAPI
450 CdfsQueryInformation(
451 PCDFS_IRP_CONTEXT IrpContext);
452
453 NTSTATUS
454 NTAPI
455 CdfsSetInformation(
456 PCDFS_IRP_CONTEXT IrpContext);
457
458
459 /* fsctl.c */
460
461 NTSTATUS NTAPI
462 CdfsFileSystemControl(
463 PCDFS_IRP_CONTEXT IrpContext);
464
465
466 /* misc.c */
467
468 BOOLEAN
469 CdfsIsIrpTopLevel(
470 PIRP Irp);
471
472 PCDFS_IRP_CONTEXT
473 CdfsAllocateIrpContext(
474 PDEVICE_OBJECT DeviceObject,
475 PIRP Irp);
476
477 VOID
478 CdfsSwapString(PWCHAR Out,
479 PUCHAR In,
480 ULONG Count);
481
482 VOID
483 CdfsDateTimeToSystemTime(PFCB Fcb,
484 PLARGE_INTEGER SystemTime);
485
486 VOID
487 CdfsFileFlagsToAttributes(PFCB Fcb,
488 PULONG FileAttributes);
489
490 VOID
491 CdfsShortNameCacheGet
492 (PFCB DirectoryFcb,
493 PLARGE_INTEGER StreamOffset,
494 PUNICODE_STRING LongName,
495 PUNICODE_STRING ShortName);
496
497 BOOLEAN
498 CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
499 IN PDIR_RECORD Record);
500
501 VOID
502 CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
503 PDIR_RECORD Record,
504 PWSTR Name);
505
506 /* rw.c */
507
508 NTSTATUS
509 NTAPI
510 CdfsRead(
511 PCDFS_IRP_CONTEXT IrpContext);
512
513 NTSTATUS
514 NTAPI
515 CdfsWrite(
516 PCDFS_IRP_CONTEXT IrpContext);
517
518
519 /* volinfo.c */
520
521 NTSTATUS
522 NTAPI
523 CdfsQueryVolumeInformation(
524 PCDFS_IRP_CONTEXT IrpContext);
525
526 NTSTATUS
527 NTAPI
528 CdfsSetVolumeInformation(
529 PCDFS_IRP_CONTEXT IrpContext);
530
531 #endif /* CDFS_H */