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