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