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'
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
;
40 typedef struct _FAT_PAGE_CONTEXT
42 PFILE_OBJECT FileObject
;
43 LARGE_INTEGER EndOfData
;
45 LARGE_INTEGER EndOfPage
;
50 } FAT_PAGE_CONTEXT
, *PFAT_PAGE_CONTEXT
;
52 #define FatPinSetupContext(xContext, xFcb, CanWait) \
54 (xContext)->FileObject = (xFcb)->StreamFileObject; \
55 (xContext)->EndOfData = (xFcb)->Header.FileSize; \
56 (xContext)->Offset.QuadPart = -1LL; \
57 (xContext)->Bcb = NULL; \
58 (xContext)->CanWait = CanWait; \
61 #define FatPinCleanupContext(xContext) \
62 if ((xContext)->Bcb != NULL) { \
63 CcUnpinData((xContext)->Bcb); \
64 (xContext)->Bcb = NULL; \
67 #define FatPinEndOfPage(xContext, xType) \
68 Add2Ptr((xContext)->Buffer, (xContext)->ValidLength, xType)
70 #define FatPinIsLastPage(xContext) \
71 ((xContext)->ValidLength != PAGE_SIZE)
73 #define IRPCONTEXT_CANWAIT 0x0001
74 #define IRPCONTEXT_PENDINGRETURNED 0x0002
75 #define IRPCONTEXT_STACK_IO_CONTEXT 0x0004
76 #define IRPCONTEXT_WRITETHROUGH 0x0008
77 #define IRPCONTEXT_TOPLEVEL 0x0010
79 typedef struct _FAT_IRP_CONTEXT
82 PDEVICE_OBJECT DeviceObject
;
85 PFILE_OBJECT FileObject
;
89 FAT_PAGE_CONTEXT Page
;
90 struct _FAT_IO_CONTEXT
*FatIoContext
;
91 WORK_QUEUE_ITEM WorkQueueItem
;
92 PFAT_OPERATION_HANDLER QueuedOperationHandler
;
93 PIO_STACK_LOCATION Stack
;
97 typedef struct _FAT_IO_CONTEXT
104 PFILE_OBJECT FileObject
;
111 PERESOURCE PagingIoResource
;
112 ERESOURCE_THREAD ResourceThreadId
;
116 PIRP AssociatedIrp
[0];
119 typedef ULONG (*PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, BOOLEAN
);
120 typedef ULONG (*PFAT_SETFAT_CONTINOUS_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, BOOLEAN
);
121 typedef ULONG (*PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, PULONG
, ULONG
, BOOLEAN
);
122 typedef ULONG (*PFAT_SETFAT_VALUE_RUN_ROUTINE
) (PFAT_PAGE_CONTEXT
, ULONG
, ULONG
, ULONG
, BOOLEAN
);
124 typedef struct _FAT_METHODS
{
125 PFAT_SCANFAT_FOR_CONTINOUS_RUN_ROUTINE ScanContinousRun
;
126 PFAT_SETFAT_CONTINOUS_RUN_ROUTINE SetContinousRun
;
127 PFAT_SCANFAT_FOR_VALUE_RUN_ROUTINE ScanValueRun
;
128 PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun
;
129 } FAT_METHODS
, *PFAT_METHODS
;
131 #define VCB_STATE_FLAG_LOCKED 0x01
133 typedef enum _VCB_CONDITION
140 /* Volume Control Block */
143 FSRTL_ADVANCED_FCB_HEADER Header
;
144 FAST_MUTEX HeaderMutex
;
145 SECTION_OBJECT_POINTERS SectionObjectPointers
;
147 PFILE_OBJECT StreamFileObject
;
148 PDEVICE_OBJECT TargetDeviceObject
;
152 VCB_CONDITION Condition
;
155 /* Notifications support */
156 PNOTIFY_SYNC NotifySync
;
157 LIST_ENTRY NotifyList
;
159 /* Volume Characteristics: */
161 BIOS_PARAMETER_BLOCK Bpb
;
162 ULONG BytesPerClusterLog
;
163 ULONG BytesPerCluster
;
170 ULONG RootDirentSectors
;
171 LONGLONG BeyondLastClusterInFat
;
173 /* Root Directory Fcb: */
174 struct _FCB
*RootFcb
;
176 ULONG MediaChangeCount
;
179 #define VcbToVolumeDeviceObject(xVcb) \
180 CONTAINING_RECORD((xVcb), VOLUME_DEVICE_OBJECT, Vcb))
182 #define VcbToDeviceObject(xVcb) \
183 &(VcbToVolumeDeviceObject(xVcb)->DeviceObject)
186 #define SectorsToBytes(xVcb, xSectrors) \
187 ((xVcb)->Bpb.BytesPerSector * (xSectrors))
189 #define BytesToSectors(xVcb, xBytes) \
190 ((xBytes + (xVcb)->Bpb.BytesPerSector - 1) / (xVcb)->Bpb.BytesPerSector)
192 #define SectorsToClusters(xVcb, xSectors) \
193 ((xSectors + (xVcb)->Bpb.SectorsPerCluster - 1) / (xVcb)->Bpb.SectorsPerCluster)
195 #define VCB_FAT_BITMAP_SIZE 0x10000
196 #define VcbFatBitmapIndex(xCluster) ((xCluster)/VCB_FAT_BITMAP_SIZE)
198 /* Volume Device Object */
199 typedef struct _VOLUME_DEVICE_OBJECT
201 DEVICE_OBJECT DeviceObject
;
203 FSRTL_COMMON_FCB_HEADER VolumeHeader
;
204 VCB Vcb
; /* Must be the last entry! */
206 } VOLUME_DEVICE_OBJECT
, *PVOLUME_DEVICE_OBJECT
;
208 // Short name always exists in FAT
210 enum _FCB_NAME_TYPE
{
215 typedef struct _FCB_NAME_LINK
{
216 RTL_SPLAY_LINKS Links
;
217 UNICODE_STRING String
;
219 } FCB_NAME_LINK
, *PFCB_NAME_LINK
;
223 FSRTL_ADVANCED_FCB_HEADER Header
;
225 * Later we might want to move the next four fields
226 * into a separate structureif we decide to split
227 * FCB into paged and non paged parts
228 * (as it is done in MS implementation
230 FAST_MUTEX HeaderMutex
;
231 SECTION_OBJECT_POINTERS SectionObjectPointers
;
233 ERESOURCE PagingIoResource
;
236 /* Reference to the Parent Dcb*/
237 struct _FCB
*ParentFcb
;
238 /* Pointer to a Vcb */
240 /* Mcb mapping Vbo->Lbo */
243 /* Links into FCB Trie */
244 FCB_NAME_LINK FileName
[0x2];
245 /* Buffer for the short name */
246 WCHAR ShortNameBuffer
[0xc];
248 UNICODE_STRING FullFileName
;
249 /* File basic info */
250 FILE_BASIC_INFORMATION BasicInfo
;
255 /* Directory data stream (just handy to have it). */
256 PFILE_OBJECT StreamFileObject
;
257 /* Bitmap to search for free dirents. */
258 /* RTL_BITMAP Bitmap; */
259 PRTL_SPLAY_LINKS SplayLinks
;
264 typedef struct _FAT_ENUM_DIRENT_CONTEXT
*PFAT_ENUM_DIRENT_CONTEXT
;
265 typedef struct _FAT_ENUM_DIR_CONTEXT
*PFAT_ENUM_DIR_CONTEXT
;
267 typedef ULONG (*PFAT_COPY_DIRENT_ROUTINE
) (PFAT_ENUM_DIR_CONTEXT
, PDIR_ENTRY
, PVOID
);
269 typedef struct _FAT_ENUM_DIRENT_CONTEXT
271 FAT_PAGE_CONTEXT Page
;
273 /* Copy dirent to dirinfo */
274 PFAT_COPY_DIRENT_ROUTINE CopyDirent
;
275 LONGLONG BytesPerClusterMask
;
277 /* Info buffer characteristics */
283 PUNICODE_STRING FileName
;
286 /* Lfn buffer/length offsets */
289 } FAT_ENUM_DIRENT_CONTEXT
;
291 typedef struct _FAT_FIND_DIRENT_CONTEXT
293 FAT_PAGE_CONTEXT Page
;
294 UNICODE_STRING ShortName
;
295 WCHAR ShortNameBuffer
[0x18];
297 PUNICODE_STRING FileName
;
298 BOOLEAN Valid8dot3Name
;
299 } FAT_FIND_DIRENT_CONTEXT
, *PFAT_FIND_DIRENT_CONTEXT
;
303 LARGE_INTEGER CurrentByteOffset
;
305 UNICODE_STRING SearchPattern
;
309 typedef enum _TYPE_OF_OPEN
320 #define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
321 #define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02
322 #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04
323 #define CCB_DASD_IO 0x10
324 extern FAT_GLOBAL_DATA FatGlobalData
;