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'
23 typedef struct _FAT_GLOBAL_DATA
26 PDRIVER_OBJECT DriverObject
;
27 PDEVICE_OBJECT DiskDeviceObject
;
28 LIST_ENTRY VcbListHead
;
29 NPAGED_LOOKASIDE_LIST NonPagedFcbList
;
30 NPAGED_LOOKASIDE_LIST ResourceList
;
31 NPAGED_LOOKASIDE_LIST IrpContextList
;
32 FAST_IO_DISPATCH FastIoDispatch
;
33 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
34 CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks
;
35 BOOLEAN Win31FileSystem
;
36 /* Jan 1, 1980 System Time */
37 LARGE_INTEGER DefaultFileTime
;
39 /* FullFAT integration */
44 typedef struct _FAT_PAGE_CONTEXT
46 PFILE_OBJECT FileObject
;
47 LARGE_INTEGER EndOfData
;
49 LARGE_INTEGER EndOfPage
;
54 } FAT_PAGE_CONTEXT
, *PFAT_PAGE_CONTEXT
;
56 #define FatPinSetupContext(xContext, xFcb, CanWait) \
58 (xContext)->FileObject = (xFcb)->StreamFileObject; \
59 (xContext)->EndOfData = (xFcb)->Header.FileSize; \
60 (xContext)->Offset.QuadPart = -1LL; \
61 (xContext)->Bcb = NULL; \
62 (xContext)->CanWait = CanWait; \
65 #define FatPinCleanupContext(xContext) \
66 if ((xContext)->Bcb != NULL) { \
67 CcUnpinData((xContext)->Bcb); \
68 (xContext)->Bcb = NULL; \
71 #define FatPinEndOfPage(xContext, xType) \
72 Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
74 #define FatPinIsLastPage(xContext) \
75 ((xContext)->ValidLength != PAGE_SIZE)
77 #define IRPCONTEXT_CANWAIT 0x0001
78 #define IRPCONTEXT_PENDINGRETURNED 0x0002
79 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
80 #define IRPCONTEXT_WRITETHROUGH 0x0008
81 #define IRPCONTEXT_TOPLEVEL 0x0010
83 typedef struct _FAT_IRP_CONTEXT
86 PDEVICE_OBJECT DeviceObject
;
89 PFILE_OBJECT FileObject
;
93 FAT_PAGE_CONTEXT Page
;
94 struct _FAT_IO_CONTEXT
*FatIoContext
;
95 WORK_QUEUE_ITEM WorkQueueItem
;
96 PFAT_OPERATION_HANDLER QueuedOperationHandler
;
97 PIO_STACK_LOCATION Stack
;
101 typedef struct _FAT_IO_CONTEXT
108 PFILE_OBJECT FileObject
;
115 PERESOURCE PagingIoResource
;
116 ERESOURCE_THREAD ResourceThreadId
;
120 PIRP AssociatedIrp
[0];
123 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, BOOLEAN
);
124 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, BOOLEAN
);
125 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, ULONG
, BOOLEAN
);
126 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, ULONG
, BOOLEAN
);
128 typedef struct _FAT_METHODS
{
129 PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun
;
130 PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun
;
131 PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun
;
132 PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun
;
133 } FAT_METHODS
, *PFAT_METHODS
;
135 #define VCB_STATE_FLAG_LOCKED 0x01
136 #define VCB_STATE_FLAG_DIRTY 0x02
137 #define VCB_STATE_MOUNTED_DIRTY 0x04
138 #define VCB_STATE_CREATE_IN_PROGRESS 0x08
140 typedef enum _VCB_CONDITION
147 /* Volume Control Block */
150 FSRTL_ADVANCED_FCB_HEADER Header
;
151 FAST_MUTEX HeaderMutex
;
152 SECTION_OBJECT_POINTERS SectionObjectPointers
;
154 PFILE_OBJECT StreamFileObject
;
155 PDEVICE_OBJECT TargetDeviceObject
;
159 VCB_CONDITION Condition
;
162 /* Direct volume access */
163 ULONG DirectOpenCount
;
164 SHARE_ACCESS ShareAccess
;
166 /* Notifications support */
167 PNOTIFY_SYNC NotifySync
;
168 LIST_ENTRY NotifyList
;
170 /* Volume Characteristics: */
172 BIOS_PARAMETER_BLOCK Bpb
;
173 ULONG BytesPerClusterLog
;
174 ULONG BytesPerCluster
;
181 ULONG RootDirentSectors
;
182 LONGLONG BeyondLastClusterInFat
;
185 /* Root Directory Control block */
186 struct _FCB
*RootDcb
;
189 ULONG MediaChangeCount
;
192 /* FullFAT integration */
196 #define VcbToVolumeDeviceObject(xVcb) \
197 CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
199 #define VcbToDeviceObject(xVcb) \
200 &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
203 #define SectorsToBytes(xVcb, xSectrors) \
204 ((xVcb)->Bpb.BytesPerSector * (xSectrors))
206 #define BytesToSectors(xVcb, xBytes) \
207 ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
209 #define SectorsToClusters(xVcb, xSectors) \
210 ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
212 #define VCB_FAT_BITMAP_SIZE 0x10000
213 #define VcbFatBitmapIndex(xCluster) ((xCluster)/VCB_FAT_BITMAP_SIZE)
215 /* Volume Device Object */
216 typedef struct _VOLUME_DEVICE_OBJECT
218 DEVICE_OBJECT DeviceObject
;
220 FSRTL_COMMON_FCB_HEADER VolumeHeader
;
221 VCB Vcb
; /* Must be the last entry! */
223 } VOLUME_DEVICE_OBJECT
, *PVOLUME_DEVICE_OBJECT
;
225 // Short name always exists in FAT
227 enum _FCB_NAME_TYPE
{
232 typedef struct _FCB_NAME_LINK
{
234 RTL_SPLAY_LINKS Links
;
238 UNICODE_STRING String
;
241 } FCB_NAME_LINK
, *PFCB_NAME_LINK
;
243 typedef enum _FCB_CONDITION
250 #define FCB_STATE_HAS_NAMES 0x01
251 #define FCB_STATE_HAS_UNICODE_NAME 0x02
252 #define FCB_STATE_PAGEFILE 0x04
253 #define FCB_STATE_DELAY_CLOSE 0x08
254 #define FCB_STATE_TRUNCATE_ON_CLOSE 0x10
258 FSRTL_ADVANCED_FCB_HEADER Header
;
260 * Later we might want to move the next four fields
261 * into a separate structureif we decide to split
262 * FCB into paged and non paged parts
263 * (as it is done in MS implementation
265 FAST_MUTEX HeaderMutex
; // nonpaged!
266 SECTION_OBJECT_POINTERS SectionObjectPointers
;
267 ERESOURCE Resource
; // nonpaged!
268 ERESOURCE PagingIoResource
; // nonpaged!
270 /* First cluster in the fat allocation chain */
271 ULONG FirstClusterOfFile
;
272 /* A list of all FCBs of that DCB */
273 LIST_ENTRY ParentDcbLinks
;
274 /* Reference to the Parent Dcb*/
275 struct _FCB
*ParentFcb
;
276 /* Pointer to a Vcb */
281 FCB_CONDITION Condition
;
283 SHARE_ACCESS ShareAccess
;
284 /* Mcb mapping Vbo->Lbo */
287 /* Links into FCB Tree */
288 FCB_NAME_LINK ShortName
;
289 FCB_NAME_LINK LongName
;
290 /* Buffer for the short name */
291 CHAR ShortNameBuffer
[0xc];
293 UNICODE_STRING FullFileName
;
294 /* Long name with exact case */
295 UNICODE_STRING ExactCaseLongName
;
296 /* Hint for the filename length */
297 ULONG FileNameLength
;
298 /* A copy of fat attribute byte */
299 UCHAR DirentFatFlags
;
300 /* File basic info */
301 FILE_BASIC_INFORMATION BasicInfo
;
302 /* FullFAT file handle */
304 /* The file has outstanding async writes */
305 ULONG OutstandingAsyncWrites
;
306 /* The outstanding async writes sync event */
307 PKEVENT OutstandingAsyncEvent
;
314 /* File and Op locks */
321 /* A list of all FCBs/DCBs opened under this DCB */
322 LIST_ENTRY ParentDcbList
;
323 /* Directory data stream (just handy to have it). */
324 PFILE_OBJECT StreamFileObject
;
325 /* Bitmap to search for free dirents. */
326 RTL_BITMAP FreeBitmap
;
328 PRTL_SPLAY_LINKS SplayLinksAnsi
;
329 PRTL_SPLAY_LINKS SplayLinksUnicode
;
334 typedef struct _FAT_ENUM_DIRENT_CONTEXT
*PFAT_ENUM_DIRENT_CONTEXT
;
335 typedef struct _FAT_ENUM_DIR_CONTEXT
*PFAT_ENUM_DIR_CONTEXT
;
337 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE
) (PFAT_ENUM_DIR_CONTEXT
, PDIR_ENTRY
, PVOID
);
339 typedef struct _FAT_ENUM_DIRENT_CONTEXT
341 FAT_PAGE_CONTEXT Page
;
343 /* Copy dirent to dirinfo */
344 PFAT_COPY_DIRENT_ROUTINE CopyDirent
;
345 LONGLONG BytesPerClusterMask
;
347 /* Info buffer characteristics */
353 PUNICODE_STRING FileName
;
356 /* Lfn buffer/length offsets */
359 } FAT_ENUM_DIRENT_CONTEXT
;
361 typedef struct _FAT_FIND_DIRENT_CONTEXT
363 FAT_PAGE_CONTEXT Page
;
364 UNICODE_STRING ShortName
;
365 WCHAR ShortNameBuffer
[0x18];
367 PUNICODE_STRING FileName
;
368 BOOLEAN Valid8dot3Name
;
369 } FAT_FIND_DIRENT_CONTEXT
, *PFAT_FIND_DIRENT_CONTEXT
;
376 LARGE_INTEGER CurrentByteOffset
;
378 UNICODE_STRING SearchPattern
;
382 typedef enum _TYPE_OF_OPEN
393 typedef enum _FILE_TIME_INDEX
395 FileCreationTime
= 0,
401 #define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
402 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
403 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
404 #define CCB_DASD_IO 0x10
405 extern FAT_GLOBAL_DATA FatGlobalData
;