:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / 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 DirResource;
145 //  ERESOURCE FatResource;
146
147   KSPIN_LOCK FcbListLock;
148   LIST_ENTRY FcbListHead;
149
150   PVPB Vpb;
151   PDEVICE_OBJECT StorageDevice;
152   PFILE_OBJECT StreamFileObject;
153
154   CDINFO CdInfo;
155
156
157 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
158
159
160 #define FCB_CACHE_INITIALIZED   0x0001
161 #define FCB_IS_VOLUME_STREAM    0x0002
162 #define FCB_IS_VOLUME           0x0004
163
164 typedef struct _FCB
165 {
166   REACTOS_COMMON_FCB_HEADER RFCB;
167   SECTION_OBJECT_POINTERS SectionObjectPointers;
168
169   PFILE_OBJECT FileObject;
170   PDEVICE_EXTENSION DevExt;
171
172   WCHAR *ObjectName;            /* point on filename (250 chars max) in PathName */
173   WCHAR PathName[MAX_PATH];     /* path+filename 260 max */
174   WCHAR ShortName[13];
175   USHORT ShortNameLength;
176
177 //  ERESOURCE PagingIoResource;
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   PFCB           Fcb;
197   LIST_ENTRY     NextCCB;
198   PFILE_OBJECT   PtrFileObject;
199   LARGE_INTEGER  CurrentByteOffset;
200   /* for DirectoryControl */
201   ULONG Entry;
202   ULONG Offset;
203   /* for DirectoryControl */
204   PWCHAR DirectorySearchPattern;
205   ULONG LastCluster;
206   ULONG LastOffset;
207 } CCB, *PCCB;
208
209 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
210
211 #define TAG_CCB TAG('I', 'C', 'C', 'B')
212
213
214
215 typedef struct
216 {
217   PDRIVER_OBJECT DriverObject;
218   PDEVICE_OBJECT DeviceObject;
219   ULONG Flags;
220 } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
221
222 extern PCDFS_GLOBAL_DATA CdfsGlobalData;
223
224
225 NTSTATUS
226 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
227                 IN ULONG DiskSector,
228                 IN ULONG SectorCount,
229                 IN OUT PUCHAR Buffer);
230
231 int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
232 void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
233
234 /* cleanup.c */
235
236 NTSTATUS STDCALL
237 CdfsCleanup(PDEVICE_OBJECT DeviceObject,
238             PIRP Irp);
239
240 /* close.c */
241
242 NTSTATUS STDCALL
243 CdfsClose(PDEVICE_OBJECT DeviceObject,
244           PIRP Irp);
245
246 NTSTATUS
247 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
248               PFILE_OBJECT FileObject);
249
250 /* common.c */
251
252 NTSTATUS
253 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
254                 IN ULONG DiskSector,
255                 IN ULONG SectorCount,
256                 IN OUT PUCHAR Buffer);
257
258 NTSTATUS
259 CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
260                    IN ULONG DiskSector,
261                    IN ULONG SectorCount,
262                    IN OUT PUCHAR Buffer);
263
264 NTSTATUS
265 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
266                      IN ULONG CtlCode,
267                      IN PVOID InputBuffer,
268                      IN ULONG InputBufferSize,
269                      IN OUT PVOID OutputBuffer, 
270                      IN OUT PULONG pOutputBufferSize);
271
272 /* create.c */
273
274 NTSTATUS STDCALL
275 CdfsCreate(PDEVICE_OBJECT DeviceObject,
276            PIRP Irp);
277
278
279 /* dirctl.c */
280
281 NTSTATUS STDCALL
282 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
283                      PIRP Irp);
284
285
286 /* fcb.c */
287
288 PFCB
289 CdfsCreateFCB(PWCHAR FileName);
290
291 VOID
292 CdfsDestroyFCB(PFCB Fcb);
293
294 BOOLEAN
295 CdfsFCBIsDirectory(PFCB Fcb);
296
297 BOOLEAN
298 CdfsFCBIsRoot(PFCB Fcb);
299
300 VOID
301 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
302             PFCB Fcb);
303
304 VOID
305 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
306                PFCB Fcb);
307
308 VOID
309 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
310                   PFCB Fcb);
311
312 PFCB
313 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
314                      PWSTR FileName);
315
316 NTSTATUS
317 CdfsFCBInitializeCache(PVCB Vcb,
318                        PFCB Fcb);
319
320 PFCB
321 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
322
323 PFCB
324 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
325
326
327
328 NTSTATUS
329 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
330                           PFCB Fcb,
331                           PFILE_OBJECT FileObject);
332
333
334
335
336 NTSTATUS
337 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
338                   PFCB *pParentFCB,
339                   PFCB *pFCB,
340                   const PWSTR pFileName);
341
342
343 /* finfo.c */
344
345 NTSTATUS STDCALL
346 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject,
347                      PIRP Irp);
348
349 NTSTATUS STDCALL
350 CdfsSetInformation(PDEVICE_OBJECT DeviceObject,
351                    PIRP Irp);
352
353 /* fsctl.c */
354
355 NTSTATUS STDCALL
356 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
357                       PIRP Irp);
358
359 /* misc.c */
360
361 BOOLEAN
362 wstrcmpjoki(PWSTR s1, PWSTR s2);
363
364 VOID
365 CdfsSwapString(PWCHAR Out,
366                PUCHAR In,
367                ULONG Count);
368
369 VOID
370 CdfsDateTimeToFileTime(PFCB Fcb,
371                        TIME *FileTime);
372
373 VOID
374 CdfsFileFlagsToAttributes(PFCB Fcb,
375                           PULONG FileAttributes);
376
377 /* rw.c */
378
379 NTSTATUS STDCALL
380 CdfsRead(PDEVICE_OBJECT DeviceObject,
381         PIRP Irp);
382
383 NTSTATUS STDCALL
384 CdfsWrite(PDEVICE_OBJECT DeviceObject,
385           PIRP Irp);
386
387
388 /* volinfo.c */
389
390 NTSTATUS STDCALL
391 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
392                            PIRP Irp);
393
394 NTSTATUS STDCALL
395 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
396                          PIRP Irp);
397
398 #endif //CDFS_H