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
;
47 /* Volume Descriptor header*/
51 UCHAR StandardId
[5]; // 2-6
53 } __attribute__((packed
));
55 typedef struct _VD_HEADER VD_HEADER
, *PVD_HEADER
;
59 /* Primary Volume Descriptor */
63 UCHAR StandardId
[5]; // 2-6
66 UCHAR SystemId
[32]; // 9-40
67 UCHAR VolumeId
[32]; // 41-72
68 UCHAR unused1
[8]; // 73-80
69 ULONG VolumeSpaceSizeL
; // 81-84
70 ULONG VolumeSpaceSizeM
; // 85-88
71 UCHAR unused2
[32]; // 89-120
72 ULONG VolumeSetSize
; // 121-124
73 ULONG VolumeSequenceNumber
; // 125-128
74 ULONG LogicalBlockSize
; // 129-132
75 ULONG PathTableSizeL
; // 133-136
76 ULONG PathTableSizeM
; // 137-140
77 ULONG LPathTablePos
; // 141-144
78 ULONG LOptPathTablePos
; // 145-148
79 ULONG MPathTablePos
; // 149-152
80 ULONG MOptPathTablePos
; // 153-156
81 DIR_RECORD RootDirRecord
; // 157-190
82 UCHAR VolumeSetIdentifier
[128]; // 191-318
83 UCHAR PublisherIdentifier
[128]; // 319-446
87 } __attribute__((packed
));
89 typedef struct _PVD PVD
, *PPVD
;
92 /* Supplementary Volume Descriptor */
96 UCHAR StandardId
[5]; // 2-6
98 UCHAR VolumeFlags
; // 8
99 UCHAR SystemId
[32]; // 9-40
100 UCHAR VolumeId
[32]; // 41-72
101 UCHAR unused1
[8]; // 73-80
102 ULONG VolumeSpaceSizeL
; // 81-84
103 ULONG VolumeSpaceSizeM
; // 85-88
104 UCHAR EscapeSequences
[32]; // 89-120
105 ULONG VolumeSetSize
; // 121-124
106 ULONG VolumeSequenceNumber
; // 125-128
107 ULONG LogicalBlockSize
; // 129-132
108 ULONG PathTableSizeL
; // 133-136
109 ULONG PathTableSizeM
; // 137-140
110 ULONG LPathTablePos
; // 141-144
111 ULONG LOptPathTablePos
; // 145-148
112 ULONG MPathTablePos
; // 149-152
113 ULONG MOptPathTablePos
; // 153-156
114 DIR_RECORD RootDirRecord
; // 157-190
115 UCHAR VolumeSetIdentifier
[128]; // 191-318
116 UCHAR PublisherIdentifier
[128]; // 319-446
119 } __attribute__((packed
));
121 typedef struct _SVD SVD
, *PSVD
;
129 typedef struct _CDINFO
132 ULONG VolumeSpaceSize
;
136 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
];
137 ULONG VolumeLabelLength
;
144 ERESOURCE VcbResource
;
145 ERESOURCE DirResource
;
147 KSPIN_LOCK FcbListLock
;
148 LIST_ENTRY FcbListHead
;
151 PDEVICE_OBJECT VolumeDevice
;
152 PDEVICE_OBJECT StorageDevice
;
153 PFILE_OBJECT StreamFileObject
;
158 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
, VCB
, *PVCB
;
161 #define FCB_CACHE_INITIALIZED 0x0001
162 #define FCB_IS_VOLUME_STREAM 0x0002
163 #define FCB_IS_VOLUME 0x0004
167 FSRTL_COMMON_FCB_HEADER RFCB
;
168 SECTION_OBJECT_POINTERS SectionObjectPointers
;
170 PFILE_OBJECT FileObject
;
171 PDEVICE_EXTENSION DevExt
;
173 WCHAR
*ObjectName
; /* point on filename (250 chars max) in PathName */
174 WCHAR PathName
[MAX_PATH
]; /* path+filename 260 max */
176 USHORT ShortNameLength
;
178 ERESOURCE MainResource
;
180 LIST_ENTRY FcbListEntry
;
181 struct _FCB
* ParentFcb
;
197 PFILE_OBJECT PtrFileObject
;
198 LARGE_INTEGER CurrentByteOffset
;
199 /* for DirectoryControl */
202 /* for DirectoryControl */
203 PWCHAR DirectorySearchPattern
;
208 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
210 #define TAG_CCB TAG('I', 'C', 'C', 'B')
216 PDRIVER_OBJECT DriverObject
;
217 PDEVICE_OBJECT DeviceObject
;
219 } CDFS_GLOBAL_DATA
, *PCDFS_GLOBAL_DATA
;
221 extern PCDFS_GLOBAL_DATA CdfsGlobalData
;
227 CdfsCleanup(PDEVICE_OBJECT DeviceObject
,
234 CdfsClose(PDEVICE_OBJECT DeviceObject
,
238 CdfsCloseFile(PDEVICE_EXTENSION DeviceExt
,
239 PFILE_OBJECT FileObject
);
245 CdfsReadSectors(IN PDEVICE_OBJECT DeviceObject
,
247 IN ULONG SectorCount
,
248 IN OUT PUCHAR Buffer
,
249 IN BOOLEAN Override
);
252 CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
254 IN PVOID InputBuffer
,
255 IN ULONG InputBufferSize
,
256 IN OUT PVOID OutputBuffer
,
257 IN OUT PULONG pOutputBufferSize
,
258 IN BOOLEAN Override
);
264 CdfsCreate(PDEVICE_OBJECT DeviceObject
,
271 CdfsDirectoryControl(PDEVICE_OBJECT DeviceObject
,
278 CdfsCreateFCB(PWCHAR FileName
);
281 CdfsDestroyFCB(PFCB Fcb
);
284 CdfsFCBIsDirectory(PFCB Fcb
);
287 CdfsFCBIsRoot(PFCB Fcb
);
290 CdfsGrabFCB(PDEVICE_EXTENSION Vcb
,
294 CdfsReleaseFCB(PDEVICE_EXTENSION Vcb
,
298 CdfsAddFCBToTable(PDEVICE_EXTENSION Vcb
,
302 CdfsGrabFCBFromTable(PDEVICE_EXTENSION Vcb
,
306 CdfsFCBInitializeCache(PVCB Vcb
,
310 CdfsMakeRootFCB(PDEVICE_EXTENSION Vcb
);
313 CdfsOpenRootFCB(PDEVICE_EXTENSION Vcb
);
318 CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb
,
320 PFILE_OBJECT FileObject
);
326 CdfsGetFCBForFile(PDEVICE_EXTENSION Vcb
,
329 const PWSTR pFileName
);
335 CdfsQueryInformation(PDEVICE_OBJECT DeviceObject
,
339 CdfsSetInformation(PDEVICE_OBJECT DeviceObject
,
346 CdfsFileSystemControl(PDEVICE_OBJECT DeviceObject
,
353 wstrcmpjoki(PWSTR s1
, PWSTR s2
);
356 CdfsSwapString(PWCHAR Out
,
361 CdfsDateTimeToFileTime(PFCB Fcb
,
365 CdfsFileFlagsToAttributes(PFCB Fcb
,
366 PULONG FileAttributes
);
372 CdfsRead(PDEVICE_OBJECT DeviceObject
,
376 CdfsWrite(PDEVICE_OBJECT DeviceObject
,
383 CdfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject
,
387 CdfsSetVolumeInformation(PDEVICE_OBJECT DeviceObject
,