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