6 #include <pseh/pseh2.h>
9 #define INIT_SECTION __attribute__((section ("INIT")))
11 #define INIT_SECTION /* Done via alloc_text for MSC */
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
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
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
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
51 typedef struct _DIR_RECORD DIR_RECORD
, *PDIR_RECORD
;
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
60 /* Volume Descriptor header*/
65 UCHAR StandardId
[5]; // 2-6
69 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
73 /* Primary Volume Descriptor */
77 UCHAR StandardId
[5]; // 2-6
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
102 typedef struct _PVD PVD
, *PPVD
;
105 /* Supplementary Volume Descriptor */
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
135 typedef struct _SVD SVD
, *PSVD
;
143 typedef struct _CDINFO
146 ULONG VolumeSpaceSize
;
150 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
151 USHORT VolumeLabelLength
;
156 #define VCB_VOLUME_LOCKED 0x0001
160 ERESOURCE VcbResource
;
161 ERESOURCE DirResource
;
163 KSPIN_LOCK FcbListLock
;
164 LIST_ENTRY FcbListHead
;
166 PDEVICE_OBJECT VolumeDevice
;
167 PDEVICE_OBJECT StorageDevice
;
168 PFILE_OBJECT StreamFileObject
;
175 LIST_ENTRY NotifyList
;
176 PNOTIFY_SYNC NotifySync
;
178 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
179 ULONG OpenHandleCount
;
180 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
183 #define FCB_CACHE_INITIALIZED 0x0001
184 #define FCB_IS_VOLUME_STREAM 0x0002
185 #define FCB_IS_VOLUME 0x0004
189 typedef struct _CDFS_SHORT_NAME
192 LARGE_INTEGER StreamOffset
;
194 WCHAR NameBuffer
[13];
195 } CDFS_SHORT_NAME
, *PCDFS_SHORT_NAME
;
199 FSRTL_COMMON_FCB_HEADER RFCB
;
200 SECTION_OBJECT_POINTERS SectionObjectPointers
;
201 ERESOURCE MainResource
;
202 ERESOURCE PagingIoResource
;
204 PFILE_OBJECT FileObject
;
205 PDEVICE_EXTENSION DevExt
;
207 UNICODE_STRING ShortNameU
;
209 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
210 UNICODE_STRING PathName
; /* path+filename 260 max */
211 WCHAR PathNameBuffer
[MAX_PATH
]; /* Buffer for PathName */
212 WCHAR ShortNameBuffer
[13];
214 LIST_ENTRY FcbListEntry
;
215 struct _FCB
* ParentFcb
;
219 LARGE_INTEGER IndexNumber
; /* HighPart: Parent directory start sector */
220 /* LowPart: Directory record offset in the parent directory file */
227 ERESOURCE NameListResource
;
228 LIST_ENTRY ShortNameList
;
236 PFILE_OBJECT PtrFileObject
;
237 LARGE_INTEGER CurrentByteOffset
;
238 /* for DirectoryControl */
241 /* for DirectoryControl */
242 UNICODE_STRING DirectorySearchPattern
;
247 #define CDFS_TAG 'sfdC'
248 #define CDFS_CCB_TAG 'ccdC'
249 #define CDFS_NONPAGED_FCB_TAG 'nfdC'
250 #define CDFS_SHORT_NAME_TAG 'sgdC'
251 #define CDFS_SEARCH_PATTERN_TAG 'eedC'
252 #define CDFS_FILENAME_TAG 'nFdC'
254 typedef struct _CDFS_GLOBAL_DATA
256 PDRIVER_OBJECT DriverObject
;
257 PDEVICE_OBJECT CdFsDeviceObject
;
258 PDEVICE_OBJECT HddFsDeviceObject
;
260 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
261 FAST_IO_DISPATCH FastIoDispatch
;
262 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
263 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
265 #define IRPCONTEXT_CANWAIT 0x1
266 #define IRPCONTEXT_COMPLETE 0x2
267 #define IRPCONTEXT_QUEUE 0x4
269 typedef struct _CDFS_IRP_CONTEXT
271 // NTFSIDENTIFIER Identifier;
273 PIO_STACK_LOCATION Stack
;
276 WORK_QUEUE_ITEM WorkQueueItem
;
279 PDEVICE_OBJECT DeviceObject
;
280 PFILE_OBJECT FileObject
;
281 NTSTATUS SavedExceptionCode
;
283 } CDFS_IRP_CONTEXT
, *PCDFS_IRP_CONTEXT
;
286 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
293 PDRIVER_OBJECT DriverObject
,
294 PUNICODE_STRING RegistryPath
);
301 PCDFS_IRP_CONTEXT IrpContext
);
309 PCDFS_IRP_CONTEXT IrpContext
);
312 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
313 PFILE_OBJECT FileObject
);
319 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
321 IN ULONG SectorCount
,
322 IN OUT PUCHAR Buffer
,
323 IN BOOLEAN Override
);
326 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
328 IN PVOID InputBuffer
,
329 IN ULONG InputBufferSize
,
330 IN OUT PVOID OutputBuffer
,
331 IN OUT PULONG pOutputBufferSize
,
332 IN BOOLEAN Override
);
339 PCDFS_IRP_CONTEXT IrpContext
);
345 PCDFS_IRP_CONTEXT IrpContext
);
351 CdfsDirectoryControl(
352 PCDFS_IRP_CONTEXT IrpContext
);
356 DRIVER_DISPATCH CdfsFsdDispatch
;
360 PDEVICE_OBJECT DeviceObject
,
367 CdfsAcquireForLazyWrite(IN PVOID Context
,
372 CdfsReleaseFromLazyWrite(IN PVOID Context
);
374 FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible
;
375 FAST_IO_READ CdfsFastIoRead
;
376 FAST_IO_WRITE CdfsFastIoWrite
;
381 CdfsCreateFCB(PCWSTR FileName
);
384 CdfsDestroyFCB(PFCB Fcb
);
387 CdfsFCBIsDirectory(PFCB Fcb
);
390 CdfsFCBIsRoot(PFCB Fcb
);
393 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
397 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
401 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
405 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
406 PUNICODE_STRING FileName
);
409 CdfsFCBInitializeCache(PVCB Vcb
,
413 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
416 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
419 CdfsMakeFCBFromDirEntry(PVCB Vcb
,
424 ULONG DirectorySector
,
425 ULONG DirectoryOffset
,
429 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
431 PFILE_OBJECT FileObject
);
434 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt
,
436 PUNICODE_STRING FileToFind
,
440 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
443 PUNICODE_STRING FileName
);
450 CdfsQueryInformation(
451 PCDFS_IRP_CONTEXT IrpContext
);
456 PCDFS_IRP_CONTEXT IrpContext
);
462 CdfsFileSystemControl(
463 PCDFS_IRP_CONTEXT IrpContext
);
473 CdfsAllocateIrpContext(
474 PDEVICE_OBJECT DeviceObject
,
478 CdfsSwapString(PWCHAR Out
,
483 CdfsDateTimeToSystemTime(PFCB Fcb
,
484 PLARGE_INTEGER SystemTime
);
487 CdfsFileFlagsToAttributes(PFCB Fcb
,
488 PULONG FileAttributes
);
491 CdfsShortNameCacheGet
493 PLARGE_INTEGER StreamOffset
,
494 PUNICODE_STRING LongName
,
495 PUNICODE_STRING ShortName
);
498 CdfsIsRecordValid(IN PDEVICE_EXTENSION DeviceExt
,
499 IN PDIR_RECORD Record
);
502 CdfsGetDirEntryName(PDEVICE_EXTENSION DeviceExt
,
511 PCDFS_IRP_CONTEXT IrpContext
);
516 PCDFS_IRP_CONTEXT IrpContext
);
523 CdfsQueryVolumeInformation(
524 PCDFS_IRP_CONTEXT IrpContext
);
528 CdfsSetVolumeInformation(
529 PCDFS_IRP_CONTEXT IrpContext
);