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