5a344137d617739e06e2a8ae05d437b989b6b860
[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 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
164
165
166 #define FCB_CACHE_INITIALIZED 0x0001
167 #define FCB_IS_VOLUME_STREAM 0x0002
168 #define FCB_IS_VOLUME 0x0004
169
170 #define MAX_PATH 260
171
172 typedef struct _CDFS_SHORT_NAME
173 {
174 LIST_ENTRY Entry;
175 LARGE_INTEGER StreamOffset;
176 UNICODE_STRING Name;
177 WCHAR NameBuffer[13];
178 } CDFS_SHORT_NAME, *PCDFS_SHORT_NAME;
179
180 typedef struct _FCB
181 {
182 FSRTL_COMMON_FCB_HEADER RFCB;
183 SECTION_OBJECT_POINTERS SectionObjectPointers;
184 ERESOURCE MainResource;
185 ERESOURCE PagingIoResource;
186
187 PFILE_OBJECT FileObject;
188 PDEVICE_EXTENSION DevExt;
189
190 UNICODE_STRING ShortNameU;
191
192 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
193 WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
194 WCHAR ShortNameBuffer[13];
195
196 LIST_ENTRY FcbListEntry;
197 struct _FCB* ParentFcb;
198
199 ULONG DirIndex;
200
201 LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */
202 /* LowPart: Directory record offset in the parent directory file */
203
204 LONG RefCount;
205 ULONG Flags;
206
207 DIR_RECORD Entry;
208
209 ERESOURCE NameListResource;
210 LIST_ENTRY ShortNameList;
211 } FCB, *PFCB;
212
213
214 typedef struct _CCB
215 {
216 LIST_ENTRY NextCCB;
217 PFILE_OBJECT PtrFileObject;
218 LARGE_INTEGER CurrentByteOffset;
219 /* for DirectoryControl */
220 ULONG Entry;
221 ULONG Offset;
222 /* for DirectoryControl */
223 UNICODE_STRING DirectorySearchPattern;
224 ULONG LastCluster;
225 ULONG LastOffset;
226 } CCB, *PCCB;
227
228 #define TAG_CCB 'BCCI'
229 #define TAG_FCB 'BCFI'
230
231 typedef struct
232 {
233 PDRIVER_OBJECT DriverObject;
234 PDEVICE_OBJECT DeviceObject;
235 ULONG Flags;
236 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
237 } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
238
239 extern PCDFS_GLOBAL_DATA CdfsGlobalData;
240
241
242 /* cleanup.c */
243
244 DRIVER_DISPATCH CdfsCleanup;
245
246 NTSTATUS
247 NTAPI
248 CdfsCleanup(PDEVICE_OBJECT DeviceObject,
249 PIRP Irp);
250
251
252 /* close.c */
253
254 DRIVER_DISPATCH CdfsClose;
255
256 NTSTATUS
257 NTAPI
258 CdfsClose(PDEVICE_OBJECT DeviceObject,
259 PIRP Irp);
260
261 NTSTATUS
262 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
263 PFILE_OBJECT FileObject);
264
265
266 /* common.c */
267
268 NTSTATUS
269 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
270 IN ULONG DiskSector,
271 IN ULONG SectorCount,
272 IN OUT PUCHAR Buffer,
273 IN BOOLEAN Override);
274
275 NTSTATUS
276 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
277 IN ULONG CtlCode,
278 IN PVOID InputBuffer,
279 IN ULONG InputBufferSize,
280 IN OUT PVOID OutputBuffer,
281 IN OUT PULONG pOutputBufferSize,
282 IN BOOLEAN Override);
283
284 /* create.c */
285
286 DRIVER_DISPATCH CdfsCreate;
287
288 NTSTATUS
289 NTAPI
290 CdfsCreate(PDEVICE_OBJECT DeviceObject,
291 PIRP Irp);
292
293 /* devctrl.c */
294
295 DRIVER_DISPATCH CdfsDeviceControl;
296
297 NTSTATUS NTAPI
298 CdfsDeviceControl(PDEVICE_OBJECT DeviceObject,
299 PIRP Irp);
300
301 /* dirctl.c */
302
303 DRIVER_DISPATCH CdfsDirectoryControl;
304
305 NTSTATUS
306 NTAPI
307 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
308 PIRP Irp);
309
310
311 /* fcb.c */
312
313 PFCB
314 CdfsCreateFCB(PCWSTR FileName);
315
316 VOID
317 CdfsDestroyFCB(PFCB Fcb);
318
319 BOOLEAN
320 CdfsFCBIsDirectory(PFCB Fcb);
321
322 BOOLEAN
323 CdfsFCBIsRoot(PFCB Fcb);
324
325 VOID
326 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
327 PFCB Fcb);
328
329 VOID
330 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
331 PFCB Fcb);
332
333 VOID
334 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
335 PFCB Fcb);
336
337 PFCB
338 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
339 PUNICODE_STRING FileName);
340
341 NTSTATUS
342 CdfsFCBInitializeCache(PVCB Vcb,
343 PFCB Fcb);
344
345 PFCB
346 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
347
348 PFCB
349 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
350
351 NTSTATUS
352 CdfsMakeFCBFromDirEntry(PVCB Vcb,
353 PFCB DirectoryFCB,
354 PWSTR LongName,
355 PWSTR ShortName,
356 PDIR_RECORD Record,
357 ULONG DirectorySector,
358 ULONG DirectoryOffset,
359 PFCB * fileFCB);
360
361 NTSTATUS
362 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
363 PFCB Fcb,
364 PFILE_OBJECT FileObject);
365
366 NTSTATUS
367 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
368 PFCB DirectoryFcb,
369 PUNICODE_STRING FileToFind,
370 PFCB *FoundFCB);
371
372 NTSTATUS
373 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
374 PFCB *pParentFCB,
375 PFCB *pFCB,
376 PUNICODE_STRING FileName);
377
378
379 /* finfo.c */
380
381 DRIVER_DISPATCH CdfsQueryInformation;
382
383 NTSTATUS
384 NTAPI
385 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject,
386 PIRP Irp);
387
388 DRIVER_DISPATCH CdfsSetInformation;
389
390 NTSTATUS
391 NTAPI
392 CdfsSetInformation(PDEVICE_OBJECT DeviceObject,
393 PIRP Irp);
394
395
396 /* fsctl.c */
397
398 DRIVER_DISPATCH CdfsFileSystemControl;
399
400 NTSTATUS NTAPI
401 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
402 PIRP Irp);
403
404
405 /* misc.c */
406
407 VOID
408 CdfsSwapString(PWCHAR Out,
409 PUCHAR In,
410 ULONG Count);
411
412 VOID
413 CdfsDateTimeToSystemTime(PFCB Fcb,
414 PLARGE_INTEGER SystemTime);
415
416 VOID
417 CdfsFileFlagsToAttributes(PFCB Fcb,
418 PULONG FileAttributes);
419
420 VOID
421 CdfsShortNameCacheGet
422 (PFCB DirectoryFcb,
423 PLARGE_INTEGER StreamOffset,
424 PUNICODE_STRING LongName,
425 PUNICODE_STRING ShortName);
426
427 /* rw.c */
428
429 DRIVER_DISPATCH CdfsRead;
430
431 NTSTATUS
432 NTAPI
433 CdfsRead(PDEVICE_OBJECT DeviceObject,
434 PIRP Irp);
435
436 DRIVER_DISPATCH CdfsWrite;
437
438 NTSTATUS
439 NTAPI
440 CdfsWrite(PDEVICE_OBJECT DeviceObject,
441 PIRP Irp);
442
443
444 /* volinfo.c */
445
446 DRIVER_DISPATCH CdfsQueryVolumeInformation;
447
448 NTSTATUS
449 NTAPI
450 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
451 PIRP Irp);
452
453 DRIVER_DISPATCH CdfsSetVolumeInformation;
454
455 NTSTATUS
456 NTAPI
457 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
458 PIRP Irp);
459
460 /* cdfs.c */
461
462 NTSTATUS NTAPI
463 DriverEntry(PDRIVER_OBJECT DriverObject,
464 PUNICODE_STRING RegistryPath);
465
466 BOOLEAN NTAPI
467 CdfsAcquireForLazyWrite(IN PVOID Context,
468 IN BOOLEAN Wait);
469
470 VOID NTAPI
471 CdfsReleaseFromLazyWrite(IN PVOID Context);
472
473 #endif /* CDFS_H */