[CDFS]
[reactos.git] / reactos / 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 typedef struct
157 {
158 ERESOURCE VcbResource;
159 ERESOURCE DirResource;
160
161 KSPIN_LOCK FcbListLock;
162 LIST_ENTRY FcbListHead;
163
164 PVPB Vpb;
165 PDEVICE_OBJECT VolumeDevice;
166 PDEVICE_OBJECT StorageDevice;
167 PFILE_OBJECT StreamFileObject;
168
169 CDINFO CdInfo;
170
171 /* Notifications */
172 LIST_ENTRY NotifyList;
173 PNOTIFY_SYNC NotifySync;
174 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
175
176
177 #define FCB_CACHE_INITIALIZED 0x0001
178 #define FCB_IS_VOLUME_STREAM 0x0002
179 #define FCB_IS_VOLUME 0x0004
180
181 #define MAX_PATH 260
182
183 typedef struct _CDFS_SHORT_NAME
184 {
185 LIST_ENTRY Entry;
186 LARGE_INTEGER StreamOffset;
187 UNICODE_STRING Name;
188 WCHAR NameBuffer[13];
189 } CDFS_SHORT_NAME, *PCDFS_SHORT_NAME;
190
191 typedef struct _FCB
192 {
193 FSRTL_COMMON_FCB_HEADER RFCB;
194 SECTION_OBJECT_POINTERS SectionObjectPointers;
195 ERESOURCE MainResource;
196 ERESOURCE PagingIoResource;
197
198 PFILE_OBJECT FileObject;
199 PDEVICE_EXTENSION DevExt;
200
201 UNICODE_STRING ShortNameU;
202
203 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
204 UNICODE_STRING PathName; /* path+filename 260 max */
205 WCHAR PathNameBuffer[MAX_PATH]; /* Buffer for PathName */
206 WCHAR ShortNameBuffer[13];
207
208 LIST_ENTRY FcbListEntry;
209 struct _FCB* ParentFcb;
210
211 ULONG DirIndex;
212
213 LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */
214 /* LowPart: Directory record offset in the parent directory file */
215
216 LONG RefCount;
217 ULONG Flags;
218
219 DIR_RECORD Entry;
220
221 ERESOURCE NameListResource;
222 LIST_ENTRY ShortNameList;
223 FILE_LOCK FileLock;
224 } FCB, *PFCB;
225
226
227 typedef struct _CCB
228 {
229 LIST_ENTRY NextCCB;
230 PFILE_OBJECT PtrFileObject;
231 LARGE_INTEGER CurrentByteOffset;
232 /* for DirectoryControl */
233 ULONG Entry;
234 ULONG Offset;
235 /* for DirectoryControl */
236 UNICODE_STRING DirectorySearchPattern;
237 ULONG LastCluster;
238 ULONG LastOffset;
239 } CCB, *PCCB;
240
241 #define CDFS_TAG 'sfdC'
242 #define CDFS_CCB_TAG 'ccdC'
243 #define CDFS_NONPAGED_FCB_TAG 'nfdC'
244 #define CDFS_SHORT_NAME_TAG 'sgdC'
245 #define CDFS_SEARCH_PATTERN_TAG 'eedC'
246 #define CDFS_FILENAME_TAG 'nFdC'
247
248 typedef struct _CDFS_GLOBAL_DATA
249 {
250 PDRIVER_OBJECT DriverObject;
251 PDEVICE_OBJECT CdFsDeviceObject;
252 PDEVICE_OBJECT HddFsDeviceObject;
253 ULONG Flags;
254 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
255 FAST_IO_DISPATCH FastIoDispatch;
256 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
257 } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
258
259 #define IRPCONTEXT_CANWAIT 0x1
260 #define IRPCONTEXT_COMPLETE 0x2
261 #define IRPCONTEXT_QUEUE 0x4
262
263 typedef struct _CDFS_IRP_CONTEXT
264 {
265 // NTFSIDENTIFIER Identifier;
266 ULONG Flags;
267 PIO_STACK_LOCATION Stack;
268 UCHAR MajorFunction;
269 UCHAR MinorFunction;
270 WORK_QUEUE_ITEM WorkQueueItem;
271 PIRP Irp;
272 BOOLEAN IsTopLevel;
273 PDEVICE_OBJECT DeviceObject;
274 PFILE_OBJECT FileObject;
275 NTSTATUS SavedExceptionCode;
276 CCHAR PriorityBoost;
277 } CDFS_IRP_CONTEXT, *PCDFS_IRP_CONTEXT;
278
279
280 extern PCDFS_GLOBAL_DATA CdfsGlobalData;
281
282 /* cdfs.c */
283
284 NTSTATUS
285 NTAPI
286 DriverEntry(
287 PDRIVER_OBJECT DriverObject,
288 PUNICODE_STRING RegistryPath);
289
290 /* cleanup.c */
291
292 NTSTATUS
293 NTAPI
294 CdfsCleanup(
295 PCDFS_IRP_CONTEXT IrpContext);
296
297
298 /* close.c */
299
300 NTSTATUS
301 NTAPI
302 CdfsClose(
303 PCDFS_IRP_CONTEXT IrpContext);
304
305 NTSTATUS
306 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
307 PFILE_OBJECT FileObject);
308
309
310 /* common.c */
311
312 NTSTATUS
313 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
314 IN ULONG DiskSector,
315 IN ULONG SectorCount,
316 IN OUT PUCHAR Buffer,
317 IN BOOLEAN Override);
318
319 NTSTATUS
320 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
321 IN ULONG CtlCode,
322 IN PVOID InputBuffer,
323 IN ULONG InputBufferSize,
324 IN OUT PVOID OutputBuffer,
325 IN OUT PULONG pOutputBufferSize,
326 IN BOOLEAN Override);
327
328 /* create.c */
329
330 NTSTATUS
331 NTAPI
332 CdfsCreate(
333 PCDFS_IRP_CONTEXT IrpContext);
334
335 /* devctrl.c */
336
337 NTSTATUS NTAPI
338 CdfsDeviceControl(
339 PCDFS_IRP_CONTEXT IrpContext);
340
341 /* dirctl.c */
342
343 NTSTATUS
344 NTAPI
345 CdfsDirectoryControl(
346 PCDFS_IRP_CONTEXT IrpContext);
347
348 /* dispatch.c */
349
350 DRIVER_DISPATCH CdfsFsdDispatch;
351 NTSTATUS
352 NTAPI
353 CdfsFsdDispatch(
354 PDEVICE_OBJECT DeviceObject,
355 PIRP Irp);
356
357 /* fastio.c */
358
359 BOOLEAN
360 NTAPI
361 CdfsAcquireForLazyWrite(IN PVOID Context,
362 IN BOOLEAN Wait);
363
364 VOID
365 NTAPI
366 CdfsReleaseFromLazyWrite(IN PVOID Context);
367
368 FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible;
369 FAST_IO_READ CdfsFastIoRead;
370 FAST_IO_WRITE CdfsFastIoWrite;
371
372 /* fcb.c */
373
374 PFCB
375 CdfsCreateFCB(PCWSTR FileName);
376
377 VOID
378 CdfsDestroyFCB(PFCB Fcb);
379
380 BOOLEAN
381 CdfsFCBIsDirectory(PFCB Fcb);
382
383 BOOLEAN
384 CdfsFCBIsRoot(PFCB Fcb);
385
386 VOID
387 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
388 PFCB Fcb);
389
390 VOID
391 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
392 PFCB Fcb);
393
394 VOID
395 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
396 PFCB Fcb);
397
398 PFCB
399 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
400 PUNICODE_STRING FileName);
401
402 NTSTATUS
403 CdfsFCBInitializeCache(PVCB Vcb,
404 PFCB Fcb);
405
406 PFCB
407 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
408
409 PFCB
410 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
411
412 NTSTATUS
413 CdfsMakeFCBFromDirEntry(PVCB Vcb,
414 PFCB DirectoryFCB,
415 PWSTR LongName,
416 PWSTR ShortName,
417 PDIR_RECORD Record,
418 ULONG DirectorySector,
419 ULONG DirectoryOffset,
420 PFCB * fileFCB);
421
422 NTSTATUS
423 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
424 PFCB Fcb,
425 PFILE_OBJECT FileObject);
426
427 NTSTATUS
428 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
429 PFCB DirectoryFcb,
430 PUNICODE_STRING FileToFind,
431 PFCB *FoundFCB);
432
433 NTSTATUS
434 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
435 PFCB *pParentFCB,
436 PFCB *pFCB,
437 PUNICODE_STRING FileName);
438
439
440 /* finfo.c */
441
442 NTSTATUS
443 NTAPI
444 CdfsQueryInformation(
445 PCDFS_IRP_CONTEXT IrpContext);
446
447 NTSTATUS
448 NTAPI
449 CdfsSetInformation(
450 PCDFS_IRP_CONTEXT IrpContext);
451
452
453 /* fsctl.c */
454
455 NTSTATUS NTAPI
456 CdfsFileSystemControl(
457 PCDFS_IRP_CONTEXT IrpContext);
458
459
460 /* misc.c */
461
462 BOOLEAN
463 CdfsIsIrpTopLevel(
464 PIRP Irp);
465
466 PCDFS_IRP_CONTEXT
467 CdfsAllocateIrpContext(
468 PDEVICE_OBJECT DeviceObject,
469 PIRP Irp);
470
471 VOID
472 CdfsSwapString(PWCHAR Out,
473 PUCHAR In,
474 ULONG Count);
475
476 VOID
477 CdfsDateTimeToSystemTime(PFCB Fcb,
478 PLARGE_INTEGER SystemTime);
479
480 VOID
481 CdfsFileFlagsToAttributes(PFCB Fcb,
482 PULONG FileAttributes);
483
484 VOID
485 CdfsShortNameCacheGet
486 (PFCB DirectoryFcb,
487 PLARGE_INTEGER StreamOffset,
488 PUNICODE_STRING LongName,
489 PUNICODE_STRING ShortName);
490
491 BOOLEAN
492 CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
493 IN PDIR_RECORD Record);
494
495 VOID
496 CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
497 PDIR_RECORD Record,
498 PWSTR Name);
499
500 /* rw.c */
501
502 NTSTATUS
503 NTAPI
504 CdfsRead(
505 PCDFS_IRP_CONTEXT IrpContext);
506
507 NTSTATUS
508 NTAPI
509 CdfsWrite(
510 PCDFS_IRP_CONTEXT IrpContext);
511
512
513 /* volinfo.c */
514
515 NTSTATUS
516 NTAPI
517 CdfsQueryVolumeInformation(
518 PCDFS_IRP_CONTEXT IrpContext);
519
520 NTSTATUS
521 NTAPI
522 CdfsSetVolumeInformation(
523 PCDFS_IRP_CONTEXT IrpContext);
524
525 #endif /* CDFS_H */