4 typedef struct _FAT_SCAN_CONTEXT
*PFAT_SCAN_CONTEXT
;
5 typedef struct _FAT_IO_CONTEXT
*PFAT_IO_CONTEXT
;
6 typedef struct _FAT_IRP_CONTEXT
*PFAT_IRP_CONTEXT
;
9 typedef NTSTATUS (*PFAT_OPERATION_HANDLER
) (PFAT_IRP_CONTEXT
);
12 typedef CSHORT FAT_NODE_TYPE
;
13 typedef FAT_NODE_TYPE
*PFAT_NODE_TYPE
;
15 #define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
18 #define FAT_NTC_VCB (CSHORT) '00VF'
19 #define FAT_NTC_FCB (CSHORT) 'CF'
20 #define FAT_NTC_DCB (CSHORT) 'DF'
21 #define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
22 #define FAT_NTC_CCB (CSHORT) 'BCC'
24 typedef struct _FAT_GLOBAL_DATA
27 PDRIVER_OBJECT DriverObject
;
28 PDEVICE_OBJECT DiskDeviceObject
;
29 LIST_ENTRY VcbListHead
;
30 NPAGED_LOOKASIDE_LIST NonPagedFcbList
;
31 NPAGED_LOOKASIDE_LIST ResourceList
;
32 NPAGED_LOOKASIDE_LIST IrpContextList
;
33 FAST_IO_DISPATCH FastIoDispatch
;
34 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
35 CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks
;
36 BOOLEAN Win31FileSystem
;
37 /* Jan 1, 1980 System Time */
38 LARGE_INTEGER DefaultFileTime
;
40 /* FullFAT integration */
45 typedef struct _FAT_PAGE_CONTEXT
47 PFILE_OBJECT FileObject
;
48 LARGE_INTEGER EndOfData
;
50 LARGE_INTEGER EndOfPage
;
55 } FAT_PAGE_CONTEXT
, *PFAT_PAGE_CONTEXT
;
57 #define FatPinSetupContext(xContext, xFcb, CanWait) \
59 (xContext)->FileObject = (xFcb)->StreamFileObject; \
60 (xContext)->EndOfData = (xFcb)->Header.FileSize; \
61 (xContext)->Offset.QuadPart = -1LL; \
62 (xContext)->Bcb = NULL; \
63 (xContext)->CanWait = CanWait; \
66 #define FatPinCleanupContext(xContext) \
67 if ((xContext)->Bcb != NULL) { \
68 CcUnpinData((xContext)->Bcb); \
69 (xContext)->Bcb = NULL; \
72 #define FatPinEndOfPage(xContext, xType) \
73 Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
75 #define FatPinIsLastPage(xContext) \
76 ((xContext)->ValidLength != PAGE_SIZE)
78 #define IRPCONTEXT_CANWAIT 0x0001
79 #define IRPCONTEXT_PENDINGRETURNED 0x0002
80 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
81 #define IRPCONTEXT_WRITETHROUGH 0x0008
82 #define IRPCONTEXT_TOPLEVEL 0x0010
84 typedef struct _FAT_IRP_CONTEXT
87 PDEVICE_OBJECT DeviceObject
;
90 PFILE_OBJECT FileObject
;
94 FAT_PAGE_CONTEXT Page
;
95 struct _FAT_IO_CONTEXT
*FatIoContext
;
96 WORK_QUEUE_ITEM WorkQueueItem
;
97 PFAT_OPERATION_HANDLER QueuedOperationHandler
;
98 PIO_STACK_LOCATION Stack
;
102 typedef struct _FAT_IO_CONTEXT
109 PFILE_OBJECT FileObject
;
116 PERESOURCE PagingIoResource
;
117 ERESOURCE_THREAD ResourceThreadId
;
121 PIRP AssociatedIrp
[0];
124 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, BOOLEAN
);
125 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, BOOLEAN
);
126 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, ULONG
, BOOLEAN
);
127 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, ULONG
, BOOLEAN
);
129 typedef struct _FAT_METHODS
{
130 PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun
;
131 PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun
;
132 PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun
;
133 PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun
;
134 } FAT_METHODS
, *PFAT_METHODS
;
136 #define VCB_STATE_FLAG_LOCKED 0x01
138 typedef enum _VCB_CONDITION
145 /* Volume Control Block */
148 FSRTL_ADVANCED_FCB_HEADER Header
;
149 FAST_MUTEX HeaderMutex
;
150 SECTION_OBJECT_POINTERS SectionObjectPointers
;
152 PFILE_OBJECT StreamFileObject
;
153 PDEVICE_OBJECT TargetDeviceObject
;
157 VCB_CONDITION Condition
;
160 /* Notifications support */
161 PNOTIFY_SYNC NotifySync
;
162 LIST_ENTRY NotifyList
;
164 /* Volume Characteristics: */
166 BIOS_PARAMETER_BLOCK Bpb
;
167 ULONG BytesPerClusterLog
;
168 ULONG BytesPerCluster
;
175 ULONG RootDirentSectors
;
176 LONGLONG BeyondLastClusterInFat
;
179 /* Root Directory Control block */
180 struct _FCB
*RootDcb
;
182 ULONG MediaChangeCount
;
184 /* FullFAT integration */
188 #define VcbToVolumeDeviceObject(xVcb) \
189 CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
191 #define VcbToDeviceObject(xVcb) \
192 &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
195 #define SectorsToBytes(xVcb, xSectrors) \
196 ((xVcb)->Bpb.BytesPerSector * (xSectrors))
198 #define BytesToSectors(xVcb, xBytes) \
199 ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
201 #define SectorsToClusters(xVcb, xSectors) \
202 ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
204 #define VCB_FAT_BITMAP_SIZE 0x10000
205 #define VcbFatBitmapIndex(xCluster) ((xCluster)/VCB_FAT_BITMAP_SIZE)
207 /* Volume Device Object */
208 typedef struct _VOLUME_DEVICE_OBJECT
210 DEVICE_OBJECT DeviceObject
;
212 FSRTL_COMMON_FCB_HEADER VolumeHeader
;
213 VCB Vcb
; /* Must be the last entry! */
215 } VOLUME_DEVICE_OBJECT
, *PVOLUME_DEVICE_OBJECT
;
217 // Short name always exists in FAT
219 enum _FCB_NAME_TYPE
{
224 typedef struct _FCB_NAME_LINK
{
226 RTL_SPLAY_LINKS Links
;
230 UNICODE_STRING String
;
233 } FCB_NAME_LINK
, *PFCB_NAME_LINK
;
235 typedef enum _FCB_CONDITION
244 FSRTL_ADVANCED_FCB_HEADER Header
;
246 * Later we might want to move the next four fields
247 * into a separate structureif we decide to split
248 * FCB into paged and non paged parts
249 * (as it is done in MS implementation
251 FAST_MUTEX HeaderMutex
; // nonpaged!
252 SECTION_OBJECT_POINTERS SectionObjectPointers
;
253 ERESOURCE Resource
; // nonpaged!
254 ERESOURCE PagingIoResource
; // nonpaged!
257 /* First cluster in the fat allocation chain */
258 ULONG FirstClusterOfFile
;
259 /* A list of all FCBs of that DCB */
260 LIST_ENTRY ParentDcbLinks
;
261 /* Reference to the Parent Dcb*/
262 struct _FCB
*ParentFcb
;
263 /* Pointer to a Vcb */
268 FCB_CONDITION Condition
;
269 /* Mcb mapping Vbo->Lbo */
272 /* Links into FCB Trie */
273 FCB_NAME_LINK FileName
;
274 /* Buffer for the short name */
275 WCHAR ShortNameBuffer
[0xc];
277 UNICODE_STRING FullFileName
;
278 /* A copy of fat attribute byte */
279 UCHAR DirentFatFlags
;
280 /* File basic info */
281 FILE_BASIC_INFORMATION BasicInfo
;
286 /* A list of all FCBs/DCBs opened under this DCB */
287 LIST_ENTRY ParentDcbList
;
288 /* Directory data stream (just handy to have it). */
289 PFILE_OBJECT StreamFileObject
;
290 /* Bitmap to search for free dirents. */
291 RTL_BITMAP FreeBitmap
;
293 PRTL_SPLAY_LINKS SplayLinksAnsi
;
294 PRTL_SPLAY_LINKS SplayLinksUnicode
;
299 typedef struct _FAT_ENUM_DIRENT_CONTEXT
*PFAT_ENUM_DIRENT_CONTEXT
;
300 typedef struct _FAT_ENUM_DIR_CONTEXT
*PFAT_ENUM_DIR_CONTEXT
;
302 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE
) (PFAT_ENUM_DIR_CONTEXT
, PDIR_ENTRY
, PVOID
);
304 typedef struct _FAT_ENUM_DIRENT_CONTEXT
306 FAT_PAGE_CONTEXT Page
;
308 /* Copy dirent to dirinfo */
309 PFAT_COPY_DIRENT_ROUTINE CopyDirent
;
310 LONGLONG BytesPerClusterMask
;
312 /* Info buffer characteristics */
318 PUNICODE_STRING FileName
;
321 /* Lfn buffer/length offsets */
324 } FAT_ENUM_DIRENT_CONTEXT
;
326 typedef struct _FAT_FIND_DIRENT_CONTEXT
328 FAT_PAGE_CONTEXT Page
;
329 UNICODE_STRING ShortName
;
330 WCHAR ShortNameBuffer
[0x18];
332 PUNICODE_STRING FileName
;
333 BOOLEAN Valid8dot3Name
;
334 } FAT_FIND_DIRENT_CONTEXT
, *PFAT_FIND_DIRENT_CONTEXT
;
341 LARGE_INTEGER CurrentByteOffset
;
343 UNICODE_STRING SearchPattern
;
347 typedef enum _TYPE_OF_OPEN
358 #define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
359 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
360 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
361 #define CCB_DASD_IO 0x10
362 extern FAT_GLOBAL_DATA FatGlobalData
;