6 #define CDFS_BASIC_SECTOR 2048
7 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16
8 #define BLOCKSIZE CDFS_BASIC_SECTOR
9 #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
21 UCHAR RecordLength
; // 1
22 UCHAR ExtAttrRecordLength
; // 2
23 ULONG ExtentLocationL
; // 3-6
24 ULONG ExtentLocationM
; // 7-10
25 ULONG DataLengthL
; // 11-14
26 ULONG DataLengthM
; // 15-18
34 UCHAR FileFlags
; // 26
35 UCHAR FileUnitSize
; // 27
36 UCHAR InterleaveGapSize
; // 28
37 ULONG VolumeSequenceNumber
; // 29-32
38 UCHAR FileIdLength
; // 33
39 UCHAR FileId
[1]; // 34
40 } __attribute__((packed
));
42 typedef struct _DIR_RECORD DIR_RECORD
, *PDIR_RECORD
;
44 /* DIR_RECORD.FileFlags */
45 #define FILE_FLAG_HIDDEN 0x01
46 #define FILE_FLAG_DIRECTORY 0x02
47 #define FILE_FLAG_SYSTEM 0x04
48 #define FILE_FLAG_READONLY 0x10
51 /* Volume Descriptor header*/
55 UCHAR StandardId
[5]; // 2-6
57 } __attribute__((packed
));
59 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
63 /* Primary Volume Descriptor */
67 UCHAR StandardId
[5]; // 2-6
70 UCHAR SystemId
[32]; // 9-40
71 UCHAR VolumeId
[32]; // 41-72
72 UCHAR unused1
[8]; // 73-80
73 ULONG VolumeSpaceSizeL
; // 81-84
74 ULONG VolumeSpaceSizeM
; // 85-88
75 UCHAR unused2
[32]; // 89-120
76 ULONG VolumeSetSize
; // 121-124
77 ULONG VolumeSequenceNumber
; // 125-128
78 ULONG LogicalBlockSize
; // 129-132
79 ULONG PathTableSizeL
; // 133-136
80 ULONG PathTableSizeM
; // 137-140
81 ULONG LPathTablePos
; // 141-144
82 ULONG LOptPathTablePos
; // 145-148
83 ULONG MPathTablePos
; // 149-152
84 ULONG MOptPathTablePos
; // 153-156
85 DIR_RECORD RootDirRecord
; // 157-190
86 UCHAR VolumeSetIdentifier
[128]; // 191-318
87 UCHAR PublisherIdentifier
[128]; // 319-446
91 } __attribute__((packed
));
93 typedef struct _PVD PVD
, *PPVD
;
96 /* Supplementary Volume Descriptor */
100 UCHAR StandardId
[5]; // 2-6
101 UCHAR VdVersion
; // 7
102 UCHAR VolumeFlags
; // 8
103 UCHAR SystemId
[32]; // 9-40
104 UCHAR VolumeId
[32]; // 41-72
105 UCHAR unused1
[8]; // 73-80
106 ULONG VolumeSpaceSizeL
; // 81-84
107 ULONG VolumeSpaceSizeM
; // 85-88
108 UCHAR EscapeSequences
[32]; // 89-120
109 ULONG VolumeSetSize
; // 121-124
110 ULONG VolumeSequenceNumber
; // 125-128
111 ULONG LogicalBlockSize
; // 129-132
112 ULONG PathTableSizeL
; // 133-136
113 ULONG PathTableSizeM
; // 137-140
114 ULONG LPathTablePos
; // 141-144
115 ULONG LOptPathTablePos
; // 145-148
116 ULONG MPathTablePos
; // 149-152
117 ULONG MOptPathTablePos
; // 153-156
118 DIR_RECORD RootDirRecord
; // 157-190
119 UCHAR VolumeSetIdentifier
[128]; // 191-318
120 UCHAR PublisherIdentifier
[128]; // 319-446
123 } __attribute__((packed
));
125 typedef struct _SVD SVD
, *PSVD
;
133 typedef struct _CDINFO
136 ULONG VolumeSpaceSize
;
140 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
];
141 ULONG VolumeLabelLength
;
148 ERESOURCE VcbResource
;
149 ERESOURCE DirResource
;
151 KSPIN_LOCK FcbListLock
;
152 LIST_ENTRY FcbListHead
;
155 PDEVICE_OBJECT VolumeDevice
;
156 PDEVICE_OBJECT StorageDevice
;
157 PFILE_OBJECT StreamFileObject
;
162 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
165 #define FCB_CACHE_INITIALIZED 0x0001
166 #define FCB_IS_VOLUME_STREAM 0x0002
167 #define FCB_IS_VOLUME 0x0004
171 FSRTL_COMMON_FCB_HEADER RFCB
;
172 SECTION_OBJECT_POINTERS SectionObjectPointers
;
174 PFILE_OBJECT FileObject
;
175 PDEVICE_EXTENSION DevExt
;
177 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
178 WCHAR PathName
[MAX_PATH
]; /* path+filename 260 max */
180 USHORT ShortNameLength
;
182 ERESOURCE MainResource
;
184 LIST_ENTRY FcbListEntry
;
185 struct _FCB
* ParentFcb
;
189 LARGE_INTEGER IndexNumber
; /* HighPart: Parent directory start sector */
190 /* LowPart: Directory record offset in the parent directory file */
202 PFILE_OBJECT PtrFileObject
;
203 LARGE_INTEGER CurrentByteOffset
;
204 /* for DirectoryControl */
207 /* for DirectoryControl */
208 PWCHAR DirectorySearchPattern
;
213 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
215 #define TAG_CCB TAG('I', 'C', 'C', 'B')
221 PDRIVER_OBJECT DriverObject
;
222 PDEVICE_OBJECT DeviceObject
;
224 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
226 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
232 CdfsCleanup(PDEVICE_OBJECT DeviceObject
,
239 CdfsClose(PDEVICE_OBJECT DeviceObject
,
243 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
244 PFILE_OBJECT FileObject
);
250 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
252 IN ULONG SectorCount
,
253 IN OUT PUCHAR Buffer
,
254 IN BOOLEAN Override
);
257 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
259 IN PVOID InputBuffer
,
260 IN ULONG InputBufferSize
,
261 IN OUT PVOID OutputBuffer
,
262 IN OUT PULONG pOutputBufferSize
,
263 IN BOOLEAN Override
);
269 CdfsCreate(PDEVICE_OBJECT DeviceObject
,
276 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject
,
283 CdfsCreateFCB(PWCHAR FileName
);
286 CdfsDestroyFCB(PFCB Fcb
);
289 CdfsFCBIsDirectory(PFCB Fcb
);
292 CdfsFCBIsRoot(PFCB Fcb
);
295 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
299 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
303 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
307 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
311 CdfsFCBInitializeCache(PVCB Vcb
,
315 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
318 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
321 CdfsMakeFCBFromDirEntry(PVCB Vcb
,
326 ULONG DirectorySector
,
327 ULONG DirectoryOffset
,
331 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
333 PFILE_OBJECT FileObject
);
336 CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt
,
342 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
345 const PWSTR pFileName
);
351 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
355 CdfsSetInformation(PDEVICE_OBJECT DeviceObject
,
362 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
369 wstrcmpjoki(PWSTR s1
, PWSTR s2
);
372 CdfsSwapString(PWCHAR Out
,
377 CdfsDateTimeToFileTime(PFCB Fcb
,
381 CdfsFileFlagsToAttributes(PFCB Fcb
,
382 PULONG FileAttributes
);
388 CdfsRead(PDEVICE_OBJECT DeviceObject
,
392 CdfsWrite(PDEVICE_OBJECT DeviceObject
,
399 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
,
403 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject
,