branch update for HEAD-2003050101
[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   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 NTSTATUS
225 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
226                 IN ULONG DiskSector,
227                 IN ULONG SectorCount,
228                 IN OUT PUCHAR Buffer);
229
230 int CdfsStrcmpi( wchar_t *str1, wchar_t *str2 );
231 void CdfsWstrcpy( wchar_t *str1, wchar_t *str2, int max );
232
233 /* cleanup.c */
234
235 NTSTATUS STDCALL
236 CdfsCleanup(PDEVICE_OBJECT DeviceObject,
237             PIRP Irp);
238
239 /* close.c */
240
241 NTSTATUS STDCALL
242 CdfsClose(PDEVICE_OBJECT DeviceObject,
243           PIRP Irp);
244
245 NTSTATUS
246 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
247               PFILE_OBJECT FileObject);
248
249 /* common.c */
250
251 NTSTATUS
252 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
253                 IN ULONG DiskSector,
254                 IN ULONG SectorCount,
255                 IN OUT PUCHAR Buffer);
256
257 NTSTATUS
258 CdfsReadRawSectors(IN PDEVICE_OBJECT DeviceObject,
259                    IN ULONG DiskSector,
260                    IN ULONG SectorCount,
261                    IN OUT PUCHAR Buffer);
262
263 NTSTATUS
264 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
265                      IN ULONG CtlCode,
266                      IN PVOID InputBuffer,
267                      IN ULONG InputBufferSize,
268                      IN OUT PVOID OutputBuffer, 
269                      IN OUT PULONG pOutputBufferSize);
270
271 /* create.c */
272
273 NTSTATUS STDCALL
274 CdfsCreate(PDEVICE_OBJECT DeviceObject,
275            PIRP Irp);
276
277
278 /* dirctl.c */
279
280 NTSTATUS STDCALL
281 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject,
282                      PIRP Irp);
283
284
285 /* fcb.c */
286
287 PFCB
288 CdfsCreateFCB(PWCHAR FileName);
289
290 VOID
291 CdfsDestroyFCB(PFCB Fcb);
292
293 BOOLEAN
294 CdfsFCBIsDirectory(PFCB Fcb);
295
296 BOOLEAN
297 CdfsFCBIsRoot(PFCB Fcb);
298
299 VOID
300 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
301             PFCB Fcb);
302
303 VOID
304 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
305                PFCB Fcb);
306
307 VOID
308 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
309                   PFCB Fcb);
310
311 PFCB
312 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
313                      PWSTR FileName);
314
315 NTSTATUS
316 CdfsFCBInitializeCache(PVCB Vcb,
317                        PFCB Fcb);
318
319 PFCB
320 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
321
322 PFCB
323 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
324
325
326
327 NTSTATUS
328 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
329                           PFCB Fcb,
330                           PFILE_OBJECT FileObject);
331
332
333
334
335 NTSTATUS
336 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
337                   PFCB *pParentFCB,
338                   PFCB *pFCB,
339                   const PWSTR pFileName);
340
341
342 /* finfo.c */
343
344 NTSTATUS STDCALL
345 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject,
346                      PIRP Irp);
347
348 NTSTATUS STDCALL
349 CdfsSetInformation(PDEVICE_OBJECT DeviceObject,
350                    PIRP Irp);
351
352 /* fsctl.c */
353
354 NTSTATUS STDCALL
355 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
356                       PIRP Irp);
357
358 /* misc.c */
359
360 BOOLEAN
361 wstrcmpjoki(PWSTR s1, PWSTR s2);
362
363 VOID
364 CdfsSwapString(PWCHAR Out,
365                PUCHAR In,
366                ULONG Count);
367
368 VOID
369 CdfsDateTimeToFileTime(PFCB Fcb,
370                        TIME *FileTime);
371
372 VOID
373 CdfsFileFlagsToAttributes(PFCB Fcb,
374                           PULONG FileAttributes);
375
376 /* rw.c */
377
378 NTSTATUS STDCALL
379 CdfsRead(PDEVICE_OBJECT DeviceObject,
380         PIRP Irp);
381
382 NTSTATUS STDCALL
383 CdfsWrite(PDEVICE_OBJECT DeviceObject,
384           PIRP Irp);
385
386
387 /* volinfo.c */
388
389 NTSTATUS STDCALL
390 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
391                            PIRP Irp);
392
393 NTSTATUS STDCALL
394 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject,
395                          PIRP Irp);
396
397 #endif //CDFS_H