3 typedef struct _FAT_SCAN_CONTEXT
*PFAT_SCAN_CONTEXT
;
4 typedef struct _FAT_IO_CONTEXT
*PFAT_IO_CONTEXT
;
5 typedef struct _FAT_IRP_CONTEXT
*PFAT_IRP_CONTEXT
;
8 typedef NTSTATUS (*PFAT_OPERATION_HANDLER
) (PFAT_IRP_CONTEXT
);
11 typedef CSHORT FAT_NODE_TYPE
;
12 typedef FAT_NODE_TYPE
*PFAT_NODE_TYPE
;
14 #define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
17 #define FAT_NTC_VCB (CSHORT) '00VF'
18 #define FAT_NTC_FCB (CSHORT) 'CF'
19 #define FAT_NTC_DCB (CSHORT) 'DF'
20 #define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
21 #define FAT_NTC_CCB (CSHORT) 'BCC'
22 #define FAT_NTC_IRP_CONTEXT (CSHORT) 'PRI'
24 typedef struct _FAT_GLOBAL_DATA
27 PEPROCESS SystemProcess
;
28 PDRIVER_OBJECT DriverObject
;
29 PDEVICE_OBJECT DiskDeviceObject
;
30 LIST_ENTRY VcbListHead
;
31 NPAGED_LOOKASIDE_LIST NonPagedFcbList
;
32 NPAGED_LOOKASIDE_LIST ResourceList
;
33 NPAGED_LOOKASIDE_LIST IrpContextList
;
34 FAST_IO_DISPATCH FastIoDispatch
;
35 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
36 CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks
;
37 BOOLEAN Win31FileSystem
;
38 BOOLEAN ShutdownStarted
;
39 /* Jan 1, 1980 System Time */
40 LARGE_INTEGER DefaultFileTime
;
43 ULONG AsyncCloseCount
;
44 ULONG DelayedCloseCount
;
45 LIST_ENTRY AsyncCloseList
;
46 LIST_ENTRY DelayedCloseList
;
47 PIO_WORKITEM FatCloseItem
;
50 BOOLEAN AsyncCloseActive
;
52 /* FullFAT integration */
57 typedef struct _FAT_PAGE_CONTEXT
59 PFILE_OBJECT FileObject
;
60 LARGE_INTEGER EndOfData
;
62 LARGE_INTEGER EndOfPage
;
67 } FAT_PAGE_CONTEXT
, *PFAT_PAGE_CONTEXT
;
69 #define FatPinSetupContext(xContext, xFcb, CanWait) \
71 (xContext)->FileObject = (xFcb)->StreamFileObject; \
72 (xContext)->EndOfData = (xFcb)->Header.FileSize; \
73 (xContext)->Offset.QuadPart = -1LL; \
74 (xContext)->Bcb = NULL; \
75 (xContext)->CanWait = CanWait; \
78 #define FatPinCleanupContext(xContext) \
79 if ((xContext)->Bcb != NULL) { \
80 CcUnpinData((xContext)->Bcb); \
81 (xContext)->Bcb = NULL; \
84 #define FatPinEndOfPage(xContext, xType) \
85 Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
87 #define FatPinIsLastPage(xContext) \
88 ((xContext)->ValidLength != PAGE_SIZE)
90 #define IRPCONTEXT_CANWAIT 0x0001
91 #define IRPCONTEXT_PENDINGRETURNED 0x0002
92 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
93 #define IRPCONTEXT_WRITETHROUGH 0x0008
94 #define IRPCONTEXT_TOPLEVEL 0x0010
96 typedef struct _FAT_IRP_CONTEXT
98 /* Type and size of this record (must be FAT_NTC_IRP_CONTEXT) */
99 FAT_NODE_TYPE NodeTypeCode
;
103 PDEVICE_OBJECT DeviceObject
;
106 PFILE_OBJECT FileObject
;
110 FAT_PAGE_CONTEXT Page
;
111 struct _FAT_IO_CONTEXT
*FatIoContext
;
112 WORK_QUEUE_ITEM WorkQueueItem
;
113 PFAT_OPERATION_HANDLER QueuedOperationHandler
;
114 PIO_STACK_LOCATION Stack
;
118 typedef struct _FAT_IO_CONTEXT
125 PFILE_OBJECT FileObject
;
132 PERESOURCE PagingIoResource
;
133 ERESOURCE_THREAD ResourceThreadId
;
137 PIRP AssociatedIrp
[0];
140 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, BOOLEAN
);
141 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, BOOLEAN
);
142 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, ULONG
, BOOLEAN
);
143 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, ULONG
, BOOLEAN
);
145 typedef struct _FAT_METHODS
{
146 PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun
;
147 PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun
;
148 PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun
;
149 PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun
;
150 } FAT_METHODS
, *PFAT_METHODS
;
152 #define VCB_STATE_FLAG_LOCKED 0x001
153 #define VCB_STATE_FLAG_DIRTY 0x002
154 #define VCB_STATE_MOUNTED_DIRTY 0x004
155 #define VCB_STATE_CREATE_IN_PROGRESS 0x008
156 #define VCB_STATE_FLAG_CLOSE_IN_PROGRESS 0x010
157 #define VCB_STATE_FLAG_DELETED_FCB 0x020
158 #define VCB_STATE_FLAG_DISMOUNT_IN_PROGRESS 0x040
159 #define VCB_STATE_FLAG_DEFERRED_FLUSH 0x080
160 #define VCB_STATE_FLAG_WRITE_PROTECTED 0x100
162 typedef enum _VCB_CONDITION
169 /* Volume Control Block */
172 FSRTL_ADVANCED_FCB_HEADER Header
;
173 FAST_MUTEX HeaderMutex
;
174 SECTION_OBJECT_POINTERS SectionObjectPointers
;
176 PFILE_OBJECT StreamFileObject
;
177 PDEVICE_OBJECT TargetDeviceObject
;
181 VCB_CONDITION Condition
;
183 struct _CLOSE_CONTEXT
*CloseContext
;
184 LIST_ENTRY AsyncCloseList
;
185 LIST_ENTRY DelayedCloseList
;
187 /* Direct volume access */
188 SHARE_ACCESS ShareAccess
;
189 PFILE_OBJECT FileObjectWithVcbLocked
;
191 /* Notifications support */
192 PNOTIFY_SYNC NotifySync
;
193 LIST_ENTRY NotifyList
;
195 /* Volume Characteristics: */
197 BIOS_PARAMETER_BLOCK Bpb
;
198 ULONG BytesPerClusterLog
;
199 ULONG BytesPerCluster
;
206 ULONG RootDirentSectors
;
207 LONGLONG BeyondLastClusterInFat
;
210 /* Root Directory Control block */
211 struct _FCB
*RootDcb
;
214 ULONG DirectOpenCount
;
217 ULONG InternalOpenCount
;
218 ULONG ResidualOpenCount
;
219 ULONG DirectAccessOpenCount
;
220 ULONG MediaChangeCount
;
222 /* FullFAT integration */
226 #define VcbToVolumeDeviceObject(xVcb) \
227 CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
229 #define VcbToDeviceObject(xVcb) \
230 &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
233 #define SectorsToBytes(xVcb, xSectrors) \
234 ((xVcb)->Bpb.BytesPerSector * (xSectrors))
236 #define BytesToSectors(xVcb, xBytes) \
237 ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
239 #define SectorsToClusters(xVcb, xSectors) \
240 ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
242 #define VCB_FAT_BITMAP_SIZE 0x10000
243 #define VcbFatBitmapIndex(xCluster) ((xCluster)/VCB_FAT_BITMAP_SIZE)
245 /* Volume Device Object */
246 typedef struct _VOLUME_DEVICE_OBJECT
248 DEVICE_OBJECT DeviceObject
;
250 FSRTL_COMMON_FCB_HEADER VolumeHeader
;
251 VCB Vcb
; /* Must be the last entry! */
253 } VOLUME_DEVICE_OBJECT
, *PVOLUME_DEVICE_OBJECT
;
255 typedef enum _TYPE_OF_OPEN
267 // Short name always exists in FAT
269 enum _FCB_NAME_TYPE
{
274 typedef struct _FCB_NAME_LINK
{
276 RTL_SPLAY_LINKS Links
;
280 UNICODE_STRING String
;
283 } FCB_NAME_LINK
, *PFCB_NAME_LINK
;
285 typedef enum _FCB_CONDITION
292 #define FCB_STATE_HAS_NAMES 0x01
293 #define FCB_STATE_HAS_UNICODE_NAME 0x02
294 #define FCB_STATE_PAGEFILE 0x04
295 #define FCB_STATE_DELAY_CLOSE 0x08
296 #define FCB_STATE_TRUNCATE_ON_CLOSE 0x10
297 #define FCB_STATE_DELETE_ON_CLOSE 0x20
301 FSRTL_ADVANCED_FCB_HEADER Header
;
303 * Later we might want to move the next four fields
304 * into a separate structureif we decide to split
305 * FCB into paged and non paged parts
306 * (as it is done in MS implementation
308 FAST_MUTEX HeaderMutex
; // nonpaged!
309 SECTION_OBJECT_POINTERS SectionObjectPointers
;
310 ERESOURCE Resource
; // nonpaged!
311 ERESOURCE PagingIoResource
; // nonpaged!
313 /* First cluster in the fat allocation chain */
314 ULONG FirstClusterOfFile
;
315 /* A list of all FCBs of that DCB */
316 LIST_ENTRY ParentDcbLinks
;
317 /* Reference to the Parent Dcb*/
318 struct _FCB
*ParentFcb
;
319 /* Pointer to a Vcb */
324 FCB_CONDITION Condition
;
326 SHARE_ACCESS ShareAccess
;
328 /* Links into FCB Tree */
329 FCB_NAME_LINK ShortName
;
330 FCB_NAME_LINK LongName
;
331 /* Buffer for the short name */
332 CHAR ShortNameBuffer
[0xc];
334 UNICODE_STRING FullFileName
;
335 /* Long name with exact case */
336 UNICODE_STRING ExactCaseLongName
;
337 /* Hint for the filename length */
338 ULONG FileNameLength
;
339 /* A copy of fat attribute byte */
340 UCHAR DirentFatFlags
;
341 /* File basic info */
342 FILE_BASIC_INFORMATION BasicInfo
;
343 /* FullFAT file handle */
345 /* The file has outstanding async writes */
346 ULONG OutstandingAsyncWrites
;
347 /* The outstanding async writes sync event */
348 PKEVENT OutstandingAsyncEvent
;
352 ULONG NonCachedUncleanCount
;
357 /* File and Op locks */
364 LIST_ENTRY ParentDcbList
; /* A list of all FCBs/DCBs opened under this DCB */
365 ULONG DirectoryFileOpenCount
; /* Sector-based access to the dir */
366 PFILE_OBJECT DirectoryFile
;
367 /* Directory data stream (just handy to have it). */
368 //PFILE_OBJECT StreamFileObject;
370 PRTL_SPLAY_LINKS SplayLinksAnsi
;
371 PRTL_SPLAY_LINKS SplayLinksUnicode
;
376 typedef struct _FAT_ENUM_DIRENT_CONTEXT
*PFAT_ENUM_DIRENT_CONTEXT
;
377 typedef struct _FAT_ENUM_DIR_CONTEXT
*PFAT_ENUM_DIR_CONTEXT
;
379 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE
) (PFAT_ENUM_DIR_CONTEXT
, PDIR_ENTRY
, PVOID
);
381 typedef struct _FAT_ENUM_DIRENT_CONTEXT
383 FAT_PAGE_CONTEXT Page
;
385 /* Copy dirent to dirinfo */
386 PFAT_COPY_DIRENT_ROUTINE CopyDirent
;
387 LONGLONG BytesPerClusterMask
;
389 /* Info buffer characteristics */
395 PUNICODE_STRING FileName
;
398 /* Lfn buffer/length offsets */
401 } FAT_ENUM_DIRENT_CONTEXT
;
403 typedef struct _FAT_FIND_DIRENT_CONTEXT
405 FAT_PAGE_CONTEXT Page
;
406 UNICODE_STRING ShortName
;
407 WCHAR ShortNameBuffer
[0x18];
409 PUNICODE_STRING FileName
;
410 BOOLEAN Valid8dot3Name
;
411 } FAT_FIND_DIRENT_CONTEXT
, *PFAT_FIND_DIRENT_CONTEXT
;
413 typedef struct _CLOSE_CONTEXT
415 LIST_ENTRY GlobalLinks
;
420 TYPE_OF_OPEN TypeOfOpen
;
422 } CLOSE_CONTEXT
, *PCLOSE_CONTEXT
;
429 LARGE_INTEGER CurrentByteOffset
;
431 UNICODE_STRING SearchPattern
;
433 CLOSE_CONTEXT CloseContext
;
436 typedef enum _FILE_TIME_INDEX
438 FileCreationTime
= 0,
444 #define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
445 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
446 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
447 #define CCB_DASD_IO 0x08
448 #define CCB_READ_ONLY 0x10
449 #define CCB_DELETE_ON_CLOSE 0x20
450 #define CCB_COMPLETE_DISMOUNT 0x40
451 #define CCB_CLOSE_CONTEXT 0x80
453 extern FAT_GLOBAL_DATA FatGlobalData
;