[STORAHCI] Merge Storport Miniport driver by Aman Priyadarshi in GSoC.
[reactos.git] / reactos / drivers / filesystems / cdfs / cdfs.h
1 #ifndef CDFS_H
2 #define CDFS_H
3
4 #include <ntifs.h>
5 #include <ntddcdrm.h>
6 #include <pseh/pseh2.h>
7
8 #ifdef __GNUC__
9 #define INIT_SECTION __attribute__((section ("INIT")))
10 #else
11 #define INIT_SECTION /* Done via alloc_text for MSC */
12 #endif
13
14 #define CDFS_BASIC_SECTOR 2048
15 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
16 #define BLOCKSIZE CDFS_BASIC_SECTOR
17 #define CDFS_MAX_NAME_LEN 256
18
19 /* Volume descriptor types (VdType) */
20 #define BOOT_VOLUME_DESCRIPTOR_TYPE 0
21 #define PRIMARY_VOLUME_DESCRIPTOR_TYPE 1
22 #define SUPPLEMENTARY_VOLUME_DESCRIPTOR_TYPE 2
23 #define VOLUME_PARTITION_DESCRIPTOR_TYPE 3
24 #define VOLUME_DESCRIPTOR_SET_TERMINATOR 255
25
26 #include <pshpack1.h>
27 struct _DIR_RECORD
28 {
29 UCHAR RecordLength; // 1
30 UCHAR ExtAttrRecordLength; // 2
31 ULONG ExtentLocationL; // 3-6
32 ULONG ExtentLocationM; // 7-10
33 ULONG DataLengthL; // 11-14
34 ULONG DataLengthM; // 15-18
35 UCHAR Year; // 19
36 UCHAR Month; // 20
37 UCHAR Day; // 21
38 UCHAR Hour; // 22
39 UCHAR Minute; // 23
40 UCHAR Second; // 24
41 UCHAR TimeZone; // 25
42 UCHAR FileFlags; // 26
43 UCHAR FileUnitSize; // 27
44 UCHAR InterleaveGapSize; // 28
45 ULONG VolumeSequenceNumber; // 29-32
46 UCHAR FileIdLength; // 33
47 UCHAR FileId[1]; // 34
48 };
49 #include <poppack.h>
50
51 typedef struct _DIR_RECORD DIR_RECORD, *PDIR_RECORD;
52
53 /* DIR_RECORD.FileFlags */
54 #define FILE_FLAG_HIDDEN 0x01
55 #define FILE_FLAG_DIRECTORY 0x02
56 #define FILE_FLAG_SYSTEM 0x04
57 #define FILE_FLAG_READONLY 0x10
58
59
60 /* Volume Descriptor header*/
61 #include <pshpack1.h>
62 struct _VD_HEADER
63 {
64 UCHAR VdType; // 1
65 UCHAR StandardId[5]; // 2-6
66 UCHAR VdVersion; // 7
67 };
68
69 typedef struct _VD_HEADER VD_HEADER, *PVD_HEADER;
70
71
72
73 /* Primary Volume Descriptor */
74 struct _PVD
75 {
76 UCHAR VdType; // 1
77 UCHAR StandardId[5]; // 2-6
78 UCHAR VdVersion; // 7
79 UCHAR unused0; // 8
80 UCHAR SystemId[32]; // 9-40
81 UCHAR VolumeId[32]; // 41-72
82 UCHAR unused1[8]; // 73-80
83 ULONG VolumeSpaceSizeL; // 81-84
84 ULONG VolumeSpaceSizeM; // 85-88
85 UCHAR unused2[32]; // 89-120
86 ULONG VolumeSetSize; // 121-124
87 ULONG VolumeSequenceNumber; // 125-128
88 ULONG LogicalBlockSize; // 129-132
89 ULONG PathTableSizeL; // 133-136
90 ULONG PathTableSizeM; // 137-140
91 ULONG LPathTablePos; // 141-144
92 ULONG LOptPathTablePos; // 145-148
93 ULONG MPathTablePos; // 149-152
94 ULONG MOptPathTablePos; // 153-156
95 DIR_RECORD RootDirRecord; // 157-190
96 UCHAR VolumeSetIdentifier[128]; // 191-318
97 UCHAR PublisherIdentifier[128]; // 319-446
98
99 /* more data ... */
100
101 };
102 typedef struct _PVD PVD, *PPVD;
103
104
105 /* Supplementary Volume Descriptor */
106 struct _SVD
107 {
108 UCHAR VdType; // 1
109 UCHAR StandardId[5]; // 2-6
110 UCHAR VdVersion; // 7
111 UCHAR VolumeFlags; // 8
112 UCHAR SystemId[32]; // 9-40
113 UCHAR VolumeId[32]; // 41-72
114 UCHAR unused1[8]; // 73-80
115 ULONG VolumeSpaceSizeL; // 81-84
116 ULONG VolumeSpaceSizeM; // 85-88
117 UCHAR EscapeSequences[32]; // 89-120
118 ULONG VolumeSetSize; // 121-124
119 ULONG VolumeSequenceNumber; // 125-128
120 ULONG LogicalBlockSize; // 129-132
121 ULONG PathTableSizeL; // 133-136
122 ULONG PathTableSizeM; // 137-140
123 ULONG LPathTablePos; // 141-144
124 ULONG LOptPathTablePos; // 145-148
125 ULONG MPathTablePos; // 149-152
126 ULONG MOptPathTablePos; // 153-156
127 DIR_RECORD RootDirRecord; // 157-190
128 UCHAR VolumeSetIdentifier[128]; // 191-318
129 UCHAR PublisherIdentifier[128]; // 319-446
130
131 // more data ...
132 };
133 #include <poppack.h>
134
135 typedef struct _SVD SVD, *PSVD;
136
137
138
139
140
141
142
143 typedef struct _CDINFO
144 {
145 ULONG VolumeOffset;
146 ULONG VolumeSpaceSize;
147 ULONG JolietLevel;
148 ULONG RootStart;
149 ULONG RootSize;
150 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
151 USHORT VolumeLabelLength;
152 ULONG SerialNumber;
153 } CDINFO, *PCDINFO;
154
155
156 typedef struct
157 {
158 ERESOURCE VcbResource;
159 ERESOURCE DirResource;
160
161 KSPIN_LOCK FcbListLock;
162 LIST_ENTRY FcbListHead;
163
164 PVPB Vpb;
165 PDEVICE_OBJECT VolumeDevice;
166 PDEVICE_OBJECT StorageDevice;
167 PFILE_OBJECT StreamFileObject;
168
169 CDINFO CdInfo;
170
171 /* Notifications */
172 LIST_ENTRY NotifyList;
173 PNOTIFY_SYNC NotifySync;
174 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
175
176
177 #define FCB_CACHE_INITIALIZED 0x0001
178 #define FCB_IS_VOLUME_STREAM 0x0002
179 #define FCB_IS_VOLUME 0x0004
180
181 #define MAX_PATH 260
182
183 typedef struct _CDFS_SHORT_NAME
184 {
185 LIST_ENTRY Entry;
186 LARGE_INTEGER StreamOffset;
187 UNICODE_STRING Name;
188 WCHAR NameBuffer[13];
189 } CDFS_SHORT_NAME, *PCDFS_SHORT_NAME;
190
191 typedef struct _FCB
192 {
193 FSRTL_COMMON_FCB_HEADER RFCB;
194 SECTION_OBJECT_POINTERS SectionObjectPointers;
195 ERESOURCE MainResource;
196 ERESOURCE PagingIoResource;
197
198 PFILE_OBJECT FileObject;
199 PDEVICE_EXTENSION DevExt;
200
201 UNICODE_STRING ShortNameU;
202
203 WCHAR *ObjectName; /* point on filename (250 chars max) in PathName */
204 UNICODE_STRING PathName; /* path+filename 260 max */
205 WCHAR PathNameBuffer[MAX_PATH]; /* Buffer for PathName */
206 WCHAR ShortNameBuffer[13];
207
208 LIST_ENTRY FcbListEntry;
209 struct _FCB* ParentFcb;
210
211 ULONG DirIndex;
212
213 LARGE_INTEGER IndexNumber; /* HighPart: Parent directory start sector */
214 /* LowPart: Directory record offset in the parent directory file */
215
216 LONG RefCount;
217 ULONG Flags;
218
219 DIR_RECORD Entry;
220
221 ERESOURCE NameListResource;
222 LIST_ENTRY ShortNameList;
223 FILE_LOCK FileLock;
224 } FCB, *PFCB;
225
226
227 typedef struct _CCB
228 {
229 LIST_ENTRY NextCCB;
230 PFILE_OBJECT PtrFileObject;
231 LARGE_INTEGER CurrentByteOffset;
232 /* for DirectoryControl */
233 ULONG Entry;
234 ULONG Offset;
235 /* for DirectoryControl */
236 UNICODE_STRING DirectorySearchPattern;
237 ULONG LastCluster;
238 ULONG LastOffset;
239 } CCB, *PCCB;
240
241 #define CDFS_TAG 'sfdC'
242 #define CDFS_CCB_TAG 'ccdC'
243 #define CDFS_NONPAGED_FCB_TAG 'nfdC'
244 #define CDFS_SHORT_NAME_TAG 'sgdC'
245 #define CDFS_SEARCH_PATTERN_TAG 'eedC'
246 #define CDFS_FILENAME_TAG 'nFdC'
247
248 typedef struct _CDFS_GLOBAL_DATA
249 {
250 PDRIVER_OBJECT DriverObject;
251 PDEVICE_OBJECT DeviceObject;
252 ULONG Flags;
253 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
254 FAST_IO_DISPATCH FastIoDispatch;
255 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
256 } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
257
258 #define IRPCONTEXT_CANWAIT 0x1
259 #define IRPCONTEXT_COMPLETE 0x2
260 #define IRPCONTEXT_QUEUE 0x4
261
262 typedef struct _CDFS_IRP_CONTEXT
263 {
264 // NTFSIDENTIFIER Identifier;
265 ULONG Flags;
266 PIO_STACK_LOCATION Stack;
267 UCHAR MajorFunction;
268 UCHAR MinorFunction;
269 WORK_QUEUE_ITEM WorkQueueItem;
270 PIRP Irp;
271 BOOLEAN IsTopLevel;
272 PDEVICE_OBJECT DeviceObject;
273 PFILE_OBJECT FileObject;
274 NTSTATUS SavedExceptionCode;
275 CCHAR PriorityBoost;
276 } CDFS_IRP_CONTEXT, *PCDFS_IRP_CONTEXT;
277
278
279 extern PCDFS_GLOBAL_DATA CdfsGlobalData;
280
281 /* cdfs.c */
282
283 NTSTATUS
284 NTAPI
285 DriverEntry(
286 PDRIVER_OBJECT DriverObject,
287 PUNICODE_STRING RegistryPath);
288
289 /* cleanup.c */
290
291 NTSTATUS
292 NTAPI
293 CdfsCleanup(
294 PCDFS_IRP_CONTEXT IrpContext);
295
296
297 /* close.c */
298
299 NTSTATUS
300 NTAPI
301 CdfsClose(
302 PCDFS_IRP_CONTEXT IrpContext);
303
304 NTSTATUS
305 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt,
306 PFILE_OBJECT FileObject);
307
308
309 /* common.c */
310
311 NTSTATUS
312 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject,
313 IN ULONG DiskSector,
314 IN ULONG SectorCount,
315 IN OUT PUCHAR Buffer,
316 IN BOOLEAN Override);
317
318 NTSTATUS
319 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
320 IN ULONG CtlCode,
321 IN PVOID InputBuffer,
322 IN ULONG InputBufferSize,
323 IN OUT PVOID OutputBuffer,
324 IN OUT PULONG pOutputBufferSize,
325 IN BOOLEAN Override);
326
327 /* create.c */
328
329 NTSTATUS
330 NTAPI
331 CdfsCreate(
332 PCDFS_IRP_CONTEXT IrpContext);
333
334 /* devctrl.c */
335
336 NTSTATUS NTAPI
337 CdfsDeviceControl(
338 PCDFS_IRP_CONTEXT IrpContext);
339
340 /* dirctl.c */
341
342 NTSTATUS
343 NTAPI
344 CdfsDirectoryControl(
345 PCDFS_IRP_CONTEXT IrpContext);
346
347 /* dispatch.c */
348
349 DRIVER_DISPATCH CdfsFsdDispatch;
350 NTSTATUS
351 NTAPI
352 CdfsFsdDispatch(
353 PDEVICE_OBJECT DeviceObject,
354 PIRP Irp);
355
356 /* fastio.c */
357
358 BOOLEAN
359 NTAPI
360 CdfsAcquireForLazyWrite(IN PVOID Context,
361 IN BOOLEAN Wait);
362
363 VOID
364 NTAPI
365 CdfsReleaseFromLazyWrite(IN PVOID Context);
366
367 FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible;
368 FAST_IO_READ CdfsFastIoRead;
369 FAST_IO_WRITE CdfsFastIoWrite;
370
371 /* fcb.c */
372
373 PFCB
374 CdfsCreateFCB(PCWSTR FileName);
375
376 VOID
377 CdfsDestroyFCB(PFCB Fcb);
378
379 BOOLEAN
380 CdfsFCBIsDirectory(PFCB Fcb);
381
382 BOOLEAN
383 CdfsFCBIsRoot(PFCB Fcb);
384
385 VOID
386 CdfsGrabFCB(PDEVICE_EXTENSION Vcb,
387 PFCB Fcb);
388
389 VOID
390 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb,
391 PFCB Fcb);
392
393 VOID
394 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb,
395 PFCB Fcb);
396
397 PFCB
398 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb,
399 PUNICODE_STRING FileName);
400
401 NTSTATUS
402 CdfsFCBInitializeCache(PVCB Vcb,
403 PFCB Fcb);
404
405 PFCB
406 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb);
407
408 PFCB
409 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb);
410
411 NTSTATUS
412 CdfsMakeFCBFromDirEntry(PVCB Vcb,
413 PFCB DirectoryFCB,
414 PWSTR LongName,
415 PWSTR ShortName,
416 PDIR_RECORD Record,
417 ULONG DirectorySector,
418 ULONG DirectoryOffset,
419 PFCB * fileFCB);
420
421 NTSTATUS
422 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
423 PFCB Fcb,
424 PFILE_OBJECT FileObject);
425
426 NTSTATUS
427 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
428 PFCB DirectoryFcb,
429 PUNICODE_STRING FileToFind,
430 PFCB *FoundFCB);
431
432 NTSTATUS
433 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb,
434 PFCB *pParentFCB,
435 PFCB *pFCB,
436 PUNICODE_STRING FileName);
437
438
439 /* finfo.c */
440
441 NTSTATUS
442 NTAPI
443 CdfsQueryInformation(
444 PCDFS_IRP_CONTEXT IrpContext);
445
446 NTSTATUS
447 NTAPI
448 CdfsSetInformation(
449 PCDFS_IRP_CONTEXT IrpContext);
450
451
452 /* fsctl.c */
453
454 NTSTATUS NTAPI
455 CdfsFileSystemControl(
456 PCDFS_IRP_CONTEXT IrpContext);
457
458
459 /* misc.c */
460
461 BOOLEAN
462 CdfsIsIrpTopLevel(
463 PIRP Irp);
464
465 PCDFS_IRP_CONTEXT
466 CdfsAllocateIrpContext(
467 PDEVICE_OBJECT DeviceObject,
468 PIRP Irp);
469
470 VOID
471 CdfsSwapString(PWCHAR Out,
472 PUCHAR In,
473 ULONG Count);
474
475 VOID
476 CdfsDateTimeToSystemTime(PFCB Fcb,
477 PLARGE_INTEGER SystemTime);
478
479 VOID
480 CdfsFileFlagsToAttributes(PFCB Fcb,
481 PULONG FileAttributes);
482
483 VOID
484 CdfsShortNameCacheGet
485 (PFCB DirectoryFcb,
486 PLARGE_INTEGER StreamOffset,
487 PUNICODE_STRING LongName,
488 PUNICODE_STRING ShortName);
489
490 BOOLEAN
491 CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt,
492 IN PDIR_RECORD Record);
493
494 VOID
495 CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt,
496 PDIR_RECORD Record,
497 PWSTR Name);
498
499 /* rw.c */
500
501 NTSTATUS
502 NTAPI
503 CdfsRead(
504 PCDFS_IRP_CONTEXT IrpContext);
505
506 NTSTATUS
507 NTAPI
508 CdfsWrite(
509 PCDFS_IRP_CONTEXT IrpContext);
510
511
512 /* volinfo.c */
513
514 NTSTATUS
515 NTAPI
516 CdfsQueryVolumeInformation(
517 PCDFS_IRP_CONTEXT IrpContext);
518
519 NTSTATUS
520 NTAPI
521 CdfsSetVolumeInformation(
522 PCDFS_IRP_CONTEXT IrpContext);
523
524 #endif /* CDFS_H */