6 #include <pseh/pseh2.h>
8 #define CDFS_BASIC_SECTOR 2048
9 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
10 #define BLOCKSIZE CDFS_BASIC_SECTOR
11 #define CDFS_MAX_NAME_LEN 256
13 /* Volume descriptor types (VdType) */
14 #define BOOT_VOLUME_DESCRIPTOR_TYPE 0
15 #define PRIMARY_VOLUME_DESCRIPTOR_TYPE 1
16 #define SUPPLEMENTARY_VOLUME_DESCRIPTOR_TYPE 2
17 #define VOLUME_PARTITION_DESCRIPTOR_TYPE 3
18 #define VOLUME_DESCRIPTOR_SET_TERMINATOR 255
23 UCHAR RecordLength
; // 1
24 UCHAR ExtAttrRecordLength
; // 2
25 ULONG ExtentLocationL
; // 3-6
26 ULONG ExtentLocationM
; // 7-10
27 ULONG DataLengthL
; // 11-14
28 ULONG DataLengthM
; // 15-18
36 UCHAR FileFlags
; // 26
37 UCHAR FileUnitSize
; // 27
38 UCHAR InterleaveGapSize
; // 28
39 ULONG VolumeSequenceNumber
; // 29-32
40 UCHAR FileIdLength
; // 33
41 UCHAR FileId
[1]; // 34
45 typedef struct _DIR_RECORD DIR_RECORD
, *PDIR_RECORD
;
47 /* DIR_RECORD.FileFlags */
48 #define FILE_FLAG_HIDDEN 0x01
49 #define FILE_FLAG_DIRECTORY 0x02
50 #define FILE_FLAG_SYSTEM 0x04
51 #define FILE_FLAG_READONLY 0x10
54 /* Volume Descriptor header*/
59 UCHAR StandardId
[5]; // 2-6
63 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
67 /* Primary Volume Descriptor */
71 UCHAR StandardId
[5]; // 2-6
74 UCHAR SystemId
[32]; // 9-40
75 UCHAR VolumeId
[32]; // 41-72
76 UCHAR unused1
[8]; // 73-80
77 ULONG VolumeSpaceSizeL
; // 81-84
78 ULONG VolumeSpaceSizeM
; // 85-88
79 UCHAR unused2
[32]; // 89-120
80 ULONG VolumeSetSize
; // 121-124
81 ULONG VolumeSequenceNumber
; // 125-128
82 ULONG LogicalBlockSize
; // 129-132
83 ULONG PathTableSizeL
; // 133-136
84 ULONG PathTableSizeM
; // 137-140
85 ULONG LPathTablePos
; // 141-144
86 ULONG LOptPathTablePos
; // 145-148
87 ULONG MPathTablePos
; // 149-152
88 ULONG MOptPathTablePos
; // 153-156
89 DIR_RECORD RootDirRecord
; // 157-190
90 UCHAR VolumeSetIdentifier
[128]; // 191-318
91 UCHAR PublisherIdentifier
[128]; // 319-446
96 typedef struct _PVD PVD
, *PPVD
;
99 /* Supplementary Volume Descriptor */
103 UCHAR StandardId
[5]; // 2-6
104 UCHAR VdVersion
; // 7
105 UCHAR VolumeFlags
; // 8
106 UCHAR SystemId
[32]; // 9-40
107 UCHAR VolumeId
[32]; // 41-72
108 UCHAR unused1
[8]; // 73-80
109 ULONG VolumeSpaceSizeL
; // 81-84
110 ULONG VolumeSpaceSizeM
; // 85-88
111 UCHAR EscapeSequences
[32]; // 89-120
112 ULONG VolumeSetSize
; // 121-124
113 ULONG VolumeSequenceNumber
; // 125-128
114 ULONG LogicalBlockSize
; // 129-132
115 ULONG PathTableSizeL
; // 133-136
116 ULONG PathTableSizeM
; // 137-140
117 ULONG LPathTablePos
; // 141-144
118 ULONG LOptPathTablePos
; // 145-148
119 ULONG MPathTablePos
; // 149-152
120 ULONG MOptPathTablePos
; // 153-156
121 DIR_RECORD RootDirRecord
; // 157-190
122 UCHAR VolumeSetIdentifier
[128]; // 191-318
123 UCHAR PublisherIdentifier
[128]; // 319-446
129 typedef struct _SVD SVD
, *PSVD
;
137 typedef struct _CDINFO
140 ULONG VolumeSpaceSize
;
144 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
145 USHORT VolumeLabelLength
;
152 ERESOURCE VcbResource
;
153 ERESOURCE DirResource
;
155 KSPIN_LOCK FcbListLock
;
156 LIST_ENTRY FcbListHead
;
159 PDEVICE_OBJECT VolumeDevice
;
160 PDEVICE_OBJECT StorageDevice
;
161 PFILE_OBJECT StreamFileObject
;
166 LIST_ENTRY NotifyList
;
167 PNOTIFY_SYNC NotifySync
;
168 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
171 #define FCB_CACHE_INITIALIZED 0x0001
172 #define FCB_IS_VOLUME_STREAM 0x0002
173 #define FCB_IS_VOLUME 0x0004
177 typedef struct _CDFS_SHORT_NAME
180 LARGE_INTEGER StreamOffset
;
182 WCHAR NameBuffer
[13];
183 } CDFS_SHORT_NAME
, *PCDFS_SHORT_NAME
;
187 FSRTL_COMMON_FCB_HEADER RFCB
;
188 SECTION_OBJECT_POINTERS SectionObjectPointers
;
189 ERESOURCE MainResource
;
190 ERESOURCE PagingIoResource
;
192 PFILE_OBJECT FileObject
;
193 PDEVICE_EXTENSION DevExt
;
195 UNICODE_STRING ShortNameU
;
197 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
198 UNICODE_STRING PathName
; /* path+filename 260 max */
199 WCHAR PathNameBuffer
[MAX_PATH
]; /* Buffer for PathName */
200 WCHAR ShortNameBuffer
[13];
202 LIST_ENTRY FcbListEntry
;
203 struct _FCB
* ParentFcb
;
207 LARGE_INTEGER IndexNumber
; /* HighPart: Parent directory start sector */
208 /* LowPart: Directory record offset in the parent directory file */
215 ERESOURCE NameListResource
;
216 LIST_ENTRY ShortNameList
;
223 PFILE_OBJECT PtrFileObject
;
224 LARGE_INTEGER CurrentByteOffset
;
225 /* for DirectoryControl */
228 /* for DirectoryControl */
229 UNICODE_STRING DirectorySearchPattern
;
234 #define CDFS_TAG 'sfdC'
235 #define CDFS_CCB_TAG 'ccdC'
236 #define CDFS_NONPAGED_FCB_TAG 'nfdC'
237 #define CDFS_SHORT_NAME_TAG 'sgdC'
238 #define CDFS_SEARCH_PATTERN_TAG 'eedC'
239 #define CDFS_FILENAME_TAG 'nFdC'
241 typedef struct _CDFS_GLOBAL_DATA
243 PDRIVER_OBJECT DriverObject
;
244 PDEVICE_OBJECT DeviceObject
;
246 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
247 FAST_IO_DISPATCH FastIoDispatch
;
248 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
249 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
251 #define IRPCONTEXT_CANWAIT 0x1
252 #define IRPCONTEXT_COMPLETE 0x2
253 #define IRPCONTEXT_QUEUE 0x4
255 typedef struct _CDFS_IRP_CONTEXT
257 // NTFSIDENTIFIER Identifier;
259 PIO_STACK_LOCATION Stack
;
262 WORK_QUEUE_ITEM WorkQueueItem
;
265 PDEVICE_OBJECT DeviceObject
;
266 PFILE_OBJECT FileObject
;
267 NTSTATUS SavedExceptionCode
;
269 } CDFS_IRP_CONTEXT
, *PCDFS_IRP_CONTEXT
;
272 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
279 PDRIVER_OBJECT DriverObject
,
280 PUNICODE_STRING RegistryPath
);
287 PCDFS_IRP_CONTEXT IrpContext
);
295 PCDFS_IRP_CONTEXT IrpContext
);
298 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
299 PFILE_OBJECT FileObject
);
305 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
307 IN ULONG SectorCount
,
308 IN OUT PUCHAR Buffer
,
309 IN BOOLEAN Override
);
312 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
314 IN PVOID InputBuffer
,
315 IN ULONG InputBufferSize
,
316 IN OUT PVOID OutputBuffer
,
317 IN OUT PULONG pOutputBufferSize
,
318 IN BOOLEAN Override
);
325 PCDFS_IRP_CONTEXT IrpContext
);
331 PCDFS_IRP_CONTEXT IrpContext
);
337 CdfsDirectoryControl(
338 PCDFS_IRP_CONTEXT IrpContext
);
342 DRIVER_DISPATCH CdfsFsdDispatch
;
346 PDEVICE_OBJECT DeviceObject
,
353 CdfsAcquireForLazyWrite(IN PVOID Context
,
358 CdfsReleaseFromLazyWrite(IN PVOID Context
);
360 FAST_IO_CHECK_IF_POSSIBLE CdfsFastIoCheckIfPossible
;
361 FAST_IO_READ CdfsFastIoRead
;
362 FAST_IO_WRITE CdfsFastIoWrite
;
367 CdfsCreateFCB(PCWSTR FileName
);
370 CdfsDestroyFCB(PFCB Fcb
);
373 CdfsFCBIsDirectory(PFCB Fcb
);
376 CdfsFCBIsRoot(PFCB Fcb
);
379 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
383 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
387 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
391 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
392 PUNICODE_STRING FileName
);
395 CdfsFCBInitializeCache(PVCB Vcb
,
399 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
402 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
405 CdfsMakeFCBFromDirEntry(PVCB Vcb
,
410 ULONG DirectorySector
,
411 ULONG DirectoryOffset
,
415 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
417 PFILE_OBJECT FileObject
);
420 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt
,
422 PUNICODE_STRING FileToFind
,
426 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
429 PUNICODE_STRING FileName
);
436 CdfsQueryInformation(
437 PCDFS_IRP_CONTEXT IrpContext
);
442 PCDFS_IRP_CONTEXT IrpContext
);
448 CdfsFileSystemControl(
449 PCDFS_IRP_CONTEXT IrpContext
);
459 CdfsAllocateIrpContext(
460 PDEVICE_OBJECT DeviceObject
,
464 CdfsSwapString(PWCHAR Out
,
469 CdfsDateTimeToSystemTime(PFCB Fcb
,
470 PLARGE_INTEGER SystemTime
);
473 CdfsFileFlagsToAttributes(PFCB Fcb
,
474 PULONG FileAttributes
);
477 CdfsShortNameCacheGet
479 PLARGE_INTEGER StreamOffset
,
480 PUNICODE_STRING LongName
,
481 PUNICODE_STRING ShortName
);
488 PCDFS_IRP_CONTEXT IrpContext
);
493 PCDFS_IRP_CONTEXT IrpContext
);
500 CdfsQueryVolumeInformation(
501 PCDFS_IRP_CONTEXT IrpContext
);
505 CdfsSetVolumeInformation(
506 PCDFS_IRP_CONTEXT IrpContext
);