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
14 /* Volume descriptor types (VdType) */
15 #define BOOT_VOLUME_DESCRIPTOR_TYPE 0
16 #define PRIMARY_VOLUME_DESCRIPTOR_TYPE 1
17 #define SUPPLEMENTARY_VOLUME_DESCRIPTOR_TYPE 2
18 #define VOLUME_PARTITION_DESCRIPTOR_TYPE 3
19 #define VOLUME_DESCRIPTOR_SET_TERMINATOR 255
24 UCHAR RecordLength
; // 1
25 UCHAR ExtAttrRecordLength
; // 2
26 ULONG ExtentLocationL
; // 3-6
27 ULONG ExtentLocationM
; // 7-10
28 ULONG DataLengthL
; // 11-14
29 ULONG DataLengthM
; // 15-18
37 UCHAR FileFlags
; // 26
38 UCHAR FileUnitSize
; // 27
39 UCHAR InterleaveGapSize
; // 28
40 ULONG VolumeSequenceNumber
; // 29-32
41 UCHAR FileIdLength
; // 33
42 UCHAR FileId
[1]; // 34
46 typedef struct _DIR_RECORD DIR_RECORD
, *PDIR_RECORD
;
48 /* DIR_RECORD.FileFlags */
49 #define FILE_FLAG_HIDDEN 0x01
50 #define FILE_FLAG_DIRECTORY 0x02
51 #define FILE_FLAG_SYSTEM 0x04
52 #define FILE_FLAG_READONLY 0x10
55 /* Volume Descriptor header*/
60 UCHAR StandardId
[5]; // 2-6
64 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
68 /* Primary Volume Descriptor */
72 UCHAR StandardId
[5]; // 2-6
75 UCHAR SystemId
[32]; // 9-40
76 UCHAR VolumeId
[32]; // 41-72
77 UCHAR unused1
[8]; // 73-80
78 ULONG VolumeSpaceSizeL
; // 81-84
79 ULONG VolumeSpaceSizeM
; // 85-88
80 UCHAR unused2
[32]; // 89-120
81 ULONG VolumeSetSize
; // 121-124
82 ULONG VolumeSequenceNumber
; // 125-128
83 ULONG LogicalBlockSize
; // 129-132
84 ULONG PathTableSizeL
; // 133-136
85 ULONG PathTableSizeM
; // 137-140
86 ULONG LPathTablePos
; // 141-144
87 ULONG LOptPathTablePos
; // 145-148
88 ULONG MPathTablePos
; // 149-152
89 ULONG MOptPathTablePos
; // 153-156
90 DIR_RECORD RootDirRecord
; // 157-190
91 UCHAR VolumeSetIdentifier
[128]; // 191-318
92 UCHAR PublisherIdentifier
[128]; // 319-446
97 typedef struct _PVD PVD
, *PPVD
;
100 /* Supplementary Volume Descriptor */
104 UCHAR StandardId
[5]; // 2-6
105 UCHAR VdVersion
; // 7
106 UCHAR VolumeFlags
; // 8
107 UCHAR SystemId
[32]; // 9-40
108 UCHAR VolumeId
[32]; // 41-72
109 UCHAR unused1
[8]; // 73-80
110 ULONG VolumeSpaceSizeL
; // 81-84
111 ULONG VolumeSpaceSizeM
; // 85-88
112 UCHAR EscapeSequences
[32]; // 89-120
113 ULONG VolumeSetSize
; // 121-124
114 ULONG VolumeSequenceNumber
; // 125-128
115 ULONG LogicalBlockSize
; // 129-132
116 ULONG PathTableSizeL
; // 133-136
117 ULONG PathTableSizeM
; // 137-140
118 ULONG LPathTablePos
; // 141-144
119 ULONG LOptPathTablePos
; // 145-148
120 ULONG MPathTablePos
; // 149-152
121 ULONG MOptPathTablePos
; // 153-156
122 DIR_RECORD RootDirRecord
; // 157-190
123 UCHAR VolumeSetIdentifier
[128]; // 191-318
124 UCHAR PublisherIdentifier
[128]; // 319-446
130 typedef struct _SVD SVD
, *PSVD
;
138 typedef struct _CDINFO
141 ULONG VolumeSpaceSize
;
145 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
];
146 ULONG VolumeLabelLength
;
153 ERESOURCE VcbResource
;
154 ERESOURCE DirResource
;
156 KSPIN_LOCK FcbListLock
;
157 LIST_ENTRY FcbListHead
;
160 PDEVICE_OBJECT VolumeDevice
;
161 PDEVICE_OBJECT StorageDevice
;
162 PFILE_OBJECT StreamFileObject
;
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
178 FSRTL_COMMON_FCB_HEADER RFCB
;
179 SECTION_OBJECT_POINTERS SectionObjectPointers
;
180 ERESOURCE MainResource
;
181 ERESOURCE PagingIoResource
;
183 PFILE_OBJECT FileObject
;
184 PDEVICE_EXTENSION DevExt
;
186 UNICODE_STRING ShortNameU
;
188 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
189 WCHAR PathName
[MAX_PATH
]; /* path+filename 260 max */
190 WCHAR ShortNameBuffer
[13];
192 LIST_ENTRY FcbListEntry
;
193 struct _FCB
* ParentFcb
;
197 LARGE_INTEGER IndexNumber
; /* HighPart: Parent directory start sector */
198 /* LowPart: Directory record offset in the parent directory file */
210 PFILE_OBJECT PtrFileObject
;
211 LARGE_INTEGER CurrentByteOffset
;
212 /* for DirectoryControl */
215 /* for DirectoryControl */
216 UNICODE_STRING DirectorySearchPattern
;
222 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
225 #define TAG_CCB TAG('I', 'C', 'C', 'B')
231 PDRIVER_OBJECT DriverObject
;
232 PDEVICE_OBJECT DeviceObject
;
234 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
235 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
237 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
243 CdfsCleanup(PDEVICE_OBJECT DeviceObject
,
250 CdfsClose(PDEVICE_OBJECT DeviceObject
,
254 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
255 PFILE_OBJECT FileObject
);
261 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
263 IN ULONG SectorCount
,
264 IN OUT PUCHAR Buffer
,
265 IN BOOLEAN Override
);
268 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
270 IN PVOID InputBuffer
,
271 IN ULONG InputBufferSize
,
272 IN OUT PVOID OutputBuffer
,
273 IN OUT PULONG pOutputBufferSize
,
274 IN BOOLEAN Override
);
280 CdfsCreate(PDEVICE_OBJECT DeviceObject
,
287 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject
,
294 CdfsCreateFCB(PCWSTR FileName
);
297 CdfsDestroyFCB(PFCB Fcb
);
300 CdfsFCBIsDirectory(PFCB Fcb
);
303 CdfsFCBIsRoot(PFCB Fcb
);
306 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
310 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
314 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
318 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
319 PUNICODE_STRING FileName
);
322 CdfsFCBInitializeCache(PVCB Vcb
,
326 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
329 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
332 CdfsMakeFCBFromDirEntry(PVCB Vcb
,
337 ULONG DirectorySector
,
338 ULONG DirectoryOffset
,
342 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
344 PFILE_OBJECT FileObject
);
347 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt
,
349 PUNICODE_STRING FileToFind
,
353 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
356 PUNICODE_STRING FileName
);
362 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
366 CdfsSetInformation(PDEVICE_OBJECT DeviceObject
,
373 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
380 CdfsSwapString(PWCHAR Out
,
385 CdfsDateTimeToSystemTime(PFCB Fcb
,
386 PLARGE_INTEGER SystemTime
);
389 CdfsFileFlagsToAttributes(PFCB Fcb
,
390 PULONG FileAttributes
);
396 CdfsRead(PDEVICE_OBJECT DeviceObject
,
400 CdfsWrite(PDEVICE_OBJECT DeviceObject
,
407 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
,
411 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject
,
417 DriverEntry(PDRIVER_OBJECT DriverObject
,
418 PUNICODE_STRING RegistryPath
);
421 CdfsAcquireForLazyWrite(IN PVOID Context
,
425 CdfsReleaseFromLazyWrite(IN PVOID Context
);