7 #define CDFS_BASIC_SECTOR 2048
8 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
9 #define BLOCKSIZE CDFS_BASIC_SECTOR
10 #define CDFS_MAX_NAME_LEN 256
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
22 UCHAR RecordLength
; // 1
23 UCHAR ExtAttrRecordLength
; // 2
24 ULONG ExtentLocationL
; // 3-6
25 ULONG ExtentLocationM
; // 7-10
26 ULONG DataLengthL
; // 11-14
27 ULONG DataLengthM
; // 15-18
35 UCHAR FileFlags
; // 26
36 UCHAR FileUnitSize
; // 27
37 UCHAR InterleaveGapSize
; // 28
38 ULONG VolumeSequenceNumber
; // 29-32
39 UCHAR FileIdLength
; // 33
40 UCHAR FileId
[1]; // 34
44 typedef struct _DIR_RECORD DIR_RECORD
, *PDIR_RECORD
;
46 /* DIR_RECORD.FileFlags */
47 #define FILE_FLAG_HIDDEN 0x01
48 #define FILE_FLAG_DIRECTORY 0x02
49 #define FILE_FLAG_SYSTEM 0x04
50 #define FILE_FLAG_READONLY 0x10
53 /* Volume Descriptor header*/
58 UCHAR StandardId
[5]; // 2-6
62 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
66 /* Primary Volume Descriptor */
70 UCHAR StandardId
[5]; // 2-6
73 UCHAR SystemId
[32]; // 9-40
74 UCHAR VolumeId
[32]; // 41-72
75 UCHAR unused1
[8]; // 73-80
76 ULONG VolumeSpaceSizeL
; // 81-84
77 ULONG VolumeSpaceSizeM
; // 85-88
78 UCHAR unused2
[32]; // 89-120
79 ULONG VolumeSetSize
; // 121-124
80 ULONG VolumeSequenceNumber
; // 125-128
81 ULONG LogicalBlockSize
; // 129-132
82 ULONG PathTableSizeL
; // 133-136
83 ULONG PathTableSizeM
; // 137-140
84 ULONG LPathTablePos
; // 141-144
85 ULONG LOptPathTablePos
; // 145-148
86 ULONG MPathTablePos
; // 149-152
87 ULONG MOptPathTablePos
; // 153-156
88 DIR_RECORD RootDirRecord
; // 157-190
89 UCHAR VolumeSetIdentifier
[128]; // 191-318
90 UCHAR PublisherIdentifier
[128]; // 319-446
95 typedef struct _PVD PVD
, *PPVD
;
98 /* Supplementary Volume Descriptor */
102 UCHAR StandardId
[5]; // 2-6
103 UCHAR VdVersion
; // 7
104 UCHAR VolumeFlags
; // 8
105 UCHAR SystemId
[32]; // 9-40
106 UCHAR VolumeId
[32]; // 41-72
107 UCHAR unused1
[8]; // 73-80
108 ULONG VolumeSpaceSizeL
; // 81-84
109 ULONG VolumeSpaceSizeM
; // 85-88
110 UCHAR EscapeSequences
[32]; // 89-120
111 ULONG VolumeSetSize
; // 121-124
112 ULONG VolumeSequenceNumber
; // 125-128
113 ULONG LogicalBlockSize
; // 129-132
114 ULONG PathTableSizeL
; // 133-136
115 ULONG PathTableSizeM
; // 137-140
116 ULONG LPathTablePos
; // 141-144
117 ULONG LOptPathTablePos
; // 145-148
118 ULONG MPathTablePos
; // 149-152
119 ULONG MOptPathTablePos
; // 153-156
120 DIR_RECORD RootDirRecord
; // 157-190
121 UCHAR VolumeSetIdentifier
[128]; // 191-318
122 UCHAR PublisherIdentifier
[128]; // 319-446
128 typedef struct _SVD SVD
, *PSVD
;
136 typedef struct _CDINFO
139 ULONG VolumeSpaceSize
;
143 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
144 USHORT VolumeLabelLength
;
151 ERESOURCE VcbResource
;
152 ERESOURCE DirResource
;
154 KSPIN_LOCK FcbListLock
;
155 LIST_ENTRY FcbListHead
;
158 PDEVICE_OBJECT VolumeDevice
;
159 PDEVICE_OBJECT StorageDevice
;
160 PFILE_OBJECT StreamFileObject
;
165 LIST_ENTRY NotifyList
;
166 PNOTIFY_SYNC NotifySync
;
167 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
170 #define FCB_CACHE_INITIALIZED 0x0001
171 #define FCB_IS_VOLUME_STREAM 0x0002
172 #define FCB_IS_VOLUME 0x0004
176 typedef struct _CDFS_SHORT_NAME
179 LARGE_INTEGER StreamOffset
;
181 WCHAR NameBuffer
[13];
182 } CDFS_SHORT_NAME
, *PCDFS_SHORT_NAME
;
186 FSRTL_COMMON_FCB_HEADER RFCB
;
187 SECTION_OBJECT_POINTERS SectionObjectPointers
;
188 ERESOURCE MainResource
;
189 ERESOURCE PagingIoResource
;
191 PFILE_OBJECT FileObject
;
192 PDEVICE_EXTENSION DevExt
;
194 UNICODE_STRING ShortNameU
;
196 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
197 UNICODE_STRING PathName
; /* path+filename 260 max */
198 WCHAR PathNameBuffer
[MAX_PATH
]; /* Buffer for PathName */
199 WCHAR ShortNameBuffer
[13];
201 LIST_ENTRY FcbListEntry
;
202 struct _FCB
* ParentFcb
;
206 LARGE_INTEGER IndexNumber
; /* HighPart: Parent directory start sector */
207 /* LowPart: Directory record offset in the parent directory file */
214 ERESOURCE NameListResource
;
215 LIST_ENTRY ShortNameList
;
222 PFILE_OBJECT PtrFileObject
;
223 LARGE_INTEGER CurrentByteOffset
;
224 /* for DirectoryControl */
227 /* for DirectoryControl */
228 UNICODE_STRING DirectorySearchPattern
;
233 #define TAG_CCB 'BCCI'
234 #define TAG_FCB 'BCFI'
238 PDRIVER_OBJECT DriverObject
;
239 PDEVICE_OBJECT DeviceObject
;
241 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
242 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
244 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
249 DRIVER_DISPATCH CdfsCleanup
;
253 CdfsCleanup(PDEVICE_OBJECT DeviceObject
,
259 DRIVER_DISPATCH CdfsClose
;
263 CdfsClose(PDEVICE_OBJECT DeviceObject
,
267 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
268 PFILE_OBJECT FileObject
);
274 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
276 IN ULONG SectorCount
,
277 IN OUT PUCHAR Buffer
,
278 IN BOOLEAN Override
);
281 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
283 IN PVOID InputBuffer
,
284 IN ULONG InputBufferSize
,
285 IN OUT PVOID OutputBuffer
,
286 IN OUT PULONG pOutputBufferSize
,
287 IN BOOLEAN Override
);
291 DRIVER_DISPATCH CdfsCreate
;
295 CdfsCreate(PDEVICE_OBJECT DeviceObject
,
300 DRIVER_DISPATCH CdfsDeviceControl
;
303 CdfsDeviceControl(PDEVICE_OBJECT DeviceObject
,
308 DRIVER_DISPATCH CdfsDirectoryControl
;
312 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject
,
319 CdfsCreateFCB(PCWSTR FileName
);
322 CdfsDestroyFCB(PFCB Fcb
);
325 CdfsFCBIsDirectory(PFCB Fcb
);
328 CdfsFCBIsRoot(PFCB Fcb
);
331 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
335 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
339 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
343 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
344 PUNICODE_STRING FileName
);
347 CdfsFCBInitializeCache(PVCB Vcb
,
351 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
354 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
357 CdfsMakeFCBFromDirEntry(PVCB Vcb
,
362 ULONG DirectorySector
,
363 ULONG DirectoryOffset
,
367 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
369 PFILE_OBJECT FileObject
);
372 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt
,
374 PUNICODE_STRING FileToFind
,
378 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
381 PUNICODE_STRING FileName
);
386 DRIVER_DISPATCH CdfsQueryInformation
;
390 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
393 DRIVER_DISPATCH CdfsSetInformation
;
397 CdfsSetInformation(PDEVICE_OBJECT DeviceObject
,
403 DRIVER_DISPATCH CdfsFileSystemControl
;
406 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
413 CdfsSwapString(PWCHAR Out
,
418 CdfsDateTimeToSystemTime(PFCB Fcb
,
419 PLARGE_INTEGER SystemTime
);
422 CdfsFileFlagsToAttributes(PFCB Fcb
,
423 PULONG FileAttributes
);
426 CdfsShortNameCacheGet
428 PLARGE_INTEGER StreamOffset
,
429 PUNICODE_STRING LongName
,
430 PUNICODE_STRING ShortName
);
434 DRIVER_DISPATCH CdfsRead
;
438 CdfsRead(PDEVICE_OBJECT DeviceObject
,
441 DRIVER_DISPATCH CdfsWrite
;
445 CdfsWrite(PDEVICE_OBJECT DeviceObject
,
451 DRIVER_DISPATCH CdfsQueryVolumeInformation
;
455 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
,
458 DRIVER_DISPATCH CdfsSetVolumeInformation
;
462 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject
,
468 DriverEntry(PDRIVER_OBJECT DriverObject
,
469 PUNICODE_STRING RegistryPath
);
472 CdfsAcquireForLazyWrite(IN PVOID Context
,
476 CdfsReleaseFromLazyWrite(IN PVOID Context
);