6 #define USE_ROS_CC_AND_FS
8 #define ROUND_DOWN(n, align) \
9 (((ULONG)n) & ~((align) - 1l))
11 #define ROUND_UP(n, align) \
12 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
17 unsigned char magic0
, res0
, magic1
;
18 unsigned char OEMName
[8];
19 unsigned short BytesPerSector
;
20 unsigned char SectorsPerCluster
;
21 unsigned short ReservedSectors
;
22 unsigned char FATCount
;
23 unsigned short RootEntries
, Sectors
;
25 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
26 unsigned long HiddenSectors
, SectorsHuge
;
27 unsigned char Drive
, Res1
, Sig
;
28 unsigned long VolumeID
;
29 unsigned char VolumeLabel
[11], SysType
[8];
30 unsigned char Res2
[448];
31 unsigned short Signatur1
;
36 unsigned char magic0
, res0
, magic1
; // 0
37 unsigned char OEMName
[8]; // 3
38 unsigned short BytesPerSector
; // 11
39 unsigned char SectorsPerCluster
; // 13
40 unsigned short ReservedSectors
; // 14
41 unsigned char FATCount
; // 16
42 unsigned short RootEntries
, Sectors
; // 17
43 unsigned char Media
; // 21
44 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
45 unsigned long HiddenSectors
, SectorsHuge
; // 28
46 unsigned long FATSectors32
; // 36
47 unsigned short ExtFlag
; // 40
48 unsigned short FSVersion
; // 42
49 unsigned long RootCluster
; // 44
50 unsigned short FSInfoSector
; // 48
51 unsigned short BootBackup
; // 50
52 unsigned char Res3
[12]; // 52
53 unsigned char Drive
; // 64
54 unsigned char Res4
; // 65
55 unsigned char ExtBootSignature
; // 66
56 unsigned long VolumeID
; // 67
57 unsigned char VolumeLabel
[11], SysType
[8]; // 71
58 unsigned char Res2
[420]; // 90
59 unsigned short Signature1
; // 510
62 struct _BootSectorFatX
64 unsigned char SysType
[4]; // 0
65 unsigned long VolumeID
; // 4
66 unsigned long SectorsPerCluster
; // 8
67 unsigned short FATCount
; // 12
68 unsigned long Unknown
; // 14
69 unsigned char Unused
[4078]; // 18
74 unsigned long ExtBootSignature2
; // 0
75 unsigned char Res6
[480]; // 4
76 unsigned long FSINFOSignature
; // 484
77 unsigned long FreeCluster
; // 488
78 unsigned long NextCluster
; // 492
79 unsigned char Res7
[12]; // 496
80 unsigned long Signatur2
; // 508
83 typedef struct _BootSector BootSector
;
89 struct { unsigned char Filename
[8], Ext
[3]; };
90 unsigned char ShortName
[11];
94 unsigned char CreationTimeMs
;
95 unsigned short CreationTime
,CreationDate
,AccessDate
;
98 unsigned short FirstClusterHigh
; // FAT32
99 unsigned short ExtendedAttributes
; // FAT12/FAT16
101 unsigned short UpdateTime
; //time create/update
102 unsigned short UpdateDate
; //date create/update
103 unsigned short FirstCluster
;
104 unsigned long FileSize
;
107 #define FAT_EAFILE "EA DATA. SF"
109 typedef struct _EAFileHeader FAT_EA_FILE_HEADER
, *PFAT_EA_FILE_HEADER
;
113 unsigned short Signature
; // ED
114 unsigned short Unknown
[15];
115 unsigned short EASetTable
[240];
118 typedef struct _EASetHeader FAT_EA_SET_HEADER
, *PFAT_EA_SET_HEADER
;
122 unsigned short Signature
; // EA
123 unsigned short Offset
; // relative offset, same value as in the EASetTable
124 unsigned short Unknown1
[2];
125 char TargetFileName
[12];
126 unsigned short Unknown2
[3];
127 unsigned int EALength
;
131 typedef struct _EAHeader FAT_EA_HEADER
, *PFAT_EA_HEADER
;
135 unsigned char Unknown
;
136 unsigned char EANameLength
;
137 unsigned short EAValueLength
;
142 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
146 unsigned char FilenameLength
; // 0
147 unsigned char Attrib
; // 1
148 unsigned char Filename
[42]; // 2
149 unsigned long FirstCluster
; // 44
150 unsigned long FileSize
; // 48
151 unsigned short UpdateTime
; // 52
152 unsigned short UpdateDate
; // 54
153 unsigned short CreationTime
; // 56
154 unsigned short CreationDate
; // 58
155 unsigned short AccessTime
; // 60
156 unsigned short AccessDate
; // 62
161 unsigned char id
; // sequence number for slot
162 WCHAR name0_4
[5]; // first 5 characters in name
163 unsigned char attr
; // attribute byte
164 unsigned char reserved
; // always 0
165 unsigned char alias_checksum
; // checksum for 8.3 alias
166 WCHAR name5_10
[6]; // 6 more characters in name
167 unsigned char start
[2]; // starting cluster number
168 WCHAR name11_12
[2]; // last 2 characters in name
171 typedef struct _slot slot
;
175 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
176 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
178 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
180 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
181 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
182 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
184 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
185 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
186 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
187 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
189 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
190 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
191 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
192 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
194 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
195 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
197 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
205 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
207 #define BLOCKSIZE 512
215 #define VCB_VOLUME_LOCKED 0x0001
216 #define VCB_DISMOUNT_PENDING 0x0002
217 #define VCB_IS_FATX 0x0004
218 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
219 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
227 ULONG rootDirectorySectors
;
231 ULONG SectorsPerCluster
;
232 ULONG BytesPerSector
;
233 ULONG BytesPerCluster
;
234 ULONG NumberOfClusters
;
238 } FATINFO
, *PFATINFO
;
241 struct _VFAT_DIRENTRY_CONTEXT
;
243 typedef struct _HASHENTRY
246 struct _VFATFCB
* self
;
247 struct _HASHENTRY
* next
;
251 #define FCB_HASH_TABLE_SIZE 65536
253 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
255 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
256 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
257 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
259 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
261 typedef struct DEVICE_EXTENSION
263 ERESOURCE DirResource
;
264 ERESOURCE FatResource
;
266 KSPIN_LOCK FcbListLock
;
267 LIST_ENTRY FcbListHead
;
269 struct _HASHENTRY
** FcbHashTable
;
271 PDEVICE_OBJECT StorageDevice
;
272 PFILE_OBJECT FATFileObject
;
274 ULONG LastAvailableCluster
;
275 ULONG AvailableClusters
;
276 BOOLEAN AvailableClustersValid
;
278 struct _VFATFCB
* VolumeFcb
;
280 /* Pointers to functions for manipulating FAT. */
281 PGET_NEXT_CLUSTER GetNextCluster
;
282 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
283 PWRITE_CLUSTER WriteCluster
;
284 ULONG CleanShutBitMask
;
286 /* Pointers to functions for manipulating directory entries. */
287 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
291 LIST_ENTRY VolumeListEntry
;
292 } DEVICE_EXTENSION
, VCB
, *PVCB
;
296 PDRIVER_OBJECT DriverObject
;
297 PDEVICE_OBJECT DeviceObject
;
299 ERESOURCE VolumeListLock
;
300 LIST_ENTRY VolumeListHead
;
301 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
302 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
303 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
304 FAST_IO_DISPATCH FastIoDispatch
;
305 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
306 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
308 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
310 #define FCB_CACHE_INITIALIZED 0x0001
311 #define FCB_DELETE_PENDING 0x0002
312 #define FCB_IS_FAT 0x0004
313 #define FCB_IS_PAGE_FILE 0x0008
314 #define FCB_IS_VOLUME 0x0010
315 #define FCB_IS_DIRTY 0x0020
316 #define FCB_IS_FATX_ENTRY 0x0040
318 typedef struct _VFATFCB
320 /* FCB header required by ROS/NT */
321 FSRTL_COMMON_FCB_HEADER RFCB
;
322 SECTION_OBJECT_POINTERS SectionObjectPointers
;
323 ERESOURCE MainResource
;
324 ERESOURCE PagingIoResource
;
325 /* end FCB header required by ROS/NT */
327 /* directory entry for this file or directory */
330 /* Pointer to attributes in entry */
333 /* long file name, points into PathNameBuffer */
334 UNICODE_STRING LongNameU
;
336 /* short file name */
337 UNICODE_STRING ShortNameU
;
339 /* directory name, points into PathNameBuffer */
340 UNICODE_STRING DirNameU
;
342 /* path + long file name 260 max*/
343 UNICODE_STRING PathNameU
;
345 /* buffer for PathNameU */
346 PWCHAR PathNameBuffer
;
348 /* buffer for ShortNameU */
349 WCHAR ShortNameBuffer
[13];
354 /* List of FCB's for this volume */
355 LIST_ENTRY FcbListEntry
;
357 /* pointer to the parent fcb */
358 struct _VFATFCB
* parentFcb
;
360 /* Flags for the fcb */
363 /* pointer to the file object which has initialized the fcb */
364 PFILE_OBJECT FileObject
;
366 /* Directory index for the short name entry */
369 /* Directory index where the long name starts */
372 /* Share access for the file object */
373 SHARE_ACCESS FCBShareAccess
;
375 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
376 ULONG OpenHandleCount
;
378 /* Entry into the hash table for the path + long name */
381 /* Entry into the hash table for the path + short name */
384 /* List of byte-range locks for this file */
388 * Optimalization: caching of last read/write cluster+offset pair. Can't
389 * be in VFATCCB because it must be reset everytime the allocated clusters
392 FAST_MUTEX LastMutex
;
395 } VFATFCB
, *PVFATFCB
;
397 typedef struct _VFATCCB
399 LARGE_INTEGER CurrentByteOffset
;
400 /* for DirectoryControl */
402 /* for DirectoryControl */
403 UNICODE_STRING SearchPattern
;
404 } VFATCCB
, *PVFATCCB
;
406 #define TAG_CCB 'BCCV'
407 #define TAG_FCB 'BCFV'
408 #define TAG_IRP 'PRIV'
409 #define TAG_VFAT 'TAFV'
411 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
413 typedef struct __DOSTIME
421 typedef struct __DOSDATE
429 #define IRPCONTEXT_CANWAIT 0x0001
430 #define IRPCONTEXT_PENDINGRETURNED 0x0002
435 PDEVICE_OBJECT DeviceObject
;
436 PDEVICE_EXTENSION DeviceExt
;
438 WORK_QUEUE_ITEM WorkQueueItem
;
439 PIO_STACK_LOCATION Stack
;
442 PFILE_OBJECT FileObject
;
445 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
447 typedef struct _VFAT_DIRENTRY_CONTEXT
452 UNICODE_STRING LongNameU
;
453 UNICODE_STRING ShortNameU
;
454 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
457 /* ------------------------------------------------------ shutdown.c */
459 DRIVER_DISPATCH VfatShutdown
;
460 NTSTATUS NTAPI
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
463 /* -------------------------------------------------------- volume.c */
465 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
467 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
469 /* ------------------------------------------------------ blockdev.c */
471 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
472 IN PLARGE_INTEGER ReadOffset
,
475 IN BOOLEAN Override
);
477 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
478 IN PLARGE_INTEGER ReadOffset
,
480 IN ULONG BufferOffset
,
483 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
484 IN PLARGE_INTEGER WriteOffset
,
485 IN ULONG WriteLength
,
486 IN ULONG BufferOffset
,
489 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
491 IN PVOID InputBuffer
,
492 IN ULONG InputBufferSize
,
493 IN OUT PVOID OutputBuffer
,
494 IN OUT PULONG pOutputBufferSize
,
495 IN BOOLEAN Override
);
497 /* ----------------------------------------------------------- dir.c */
499 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
501 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
504 PLARGE_INTEGER SystemTime
);
506 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
507 PLARGE_INTEGER SystemTime
,
511 /* -------------------------------------------------------- create.c */
513 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
515 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
517 PUNICODE_STRING FileToFindU
,
518 PVFAT_DIRENTRY_CONTEXT DirContext
,
521 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
522 PUNICODE_STRING NameU
);
524 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
527 /* --------------------------------------------------------- close.c */
529 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
531 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
532 PFILE_OBJECT FileObject
);
534 /* ------------------------------------------------------- cleanup.c */
536 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
538 /* --------------------------------------------------------- fastio.c */
541 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
544 VfatAcquireForLazyWrite(IN PVOID Context
,
548 VfatReleaseFromLazyWrite(IN PVOID Context
);
551 VfatAcquireForReadAhead(IN PVOID Context
,
555 VfatReleaseFromReadAhead(IN PVOID Context
);
557 /* --------------------------------------------------------- fsctl.c */
559 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
561 /* --------------------------------------------------------- finfo.c */
563 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
565 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
568 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
570 PDEVICE_EXTENSION DeviceExt
,
571 PLARGE_INTEGER AllocationSize
);
573 /* --------------------------------------------------------- iface.c */
575 NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject
,
576 PUNICODE_STRING RegistryPath
);
578 /* --------------------------------------------------------- dirwr.c */
580 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
581 PUNICODE_STRING PathNameU
,
584 ULONG RequestedOptions
,
587 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
589 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
592 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
597 /* -------------------------------------------------------- string.c */
600 vfatSplitPathName(PUNICODE_STRING PathNameU
,
601 PUNICODE_STRING DirNameU
,
602 PUNICODE_STRING FileNameU
);
604 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
606 BOOLEAN
wstrcmpjoki (PWSTR s1
,
609 /* ----------------------------------------------------------- fat.c */
611 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
612 ULONG CurrentCluster
,
615 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
618 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
619 ULONG ClusterToWrite
,
623 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
624 ULONG CurrentCluster
,
627 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
630 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
631 ULONG ClusterToWrite
,
635 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
636 ULONG CurrentCluster
,
639 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
642 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
643 ULONG ClusterToWrite
,
647 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
653 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
656 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
657 ULONG CurrentCluster
,
660 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
661 ULONG CurrentCluster
,
664 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
665 PLARGE_INTEGER Clusters
);
668 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
669 ULONG ClusterToWrite
,
672 /* ------------------------------------------------------ direntry.c */
674 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
675 PDIR_ENTRY pDirEntry
);
677 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
679 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
682 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
685 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
688 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
691 /* ----------------------------------------------------------- fcb.c */
693 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
694 PUNICODE_STRING pFileNameU
);
696 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
698 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
700 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
703 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
706 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
709 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
710 PUNICODE_STRING pFileNameU
);
712 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
714 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
716 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
718 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
720 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
722 PFILE_OBJECT fileObject
);
724 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
726 PUNICODE_STRING FileToFindU
,
729 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
730 PVFATFCB
*pParentFCB
,
732 PUNICODE_STRING pFileNameU
);
734 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
735 PVFATFCB directoryFCB
,
736 PVFAT_DIRENTRY_CONTEXT DirContext
,
739 /* ------------------------------------------------------------ rw.c */
741 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
743 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
745 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
747 PULONG CurrentCluster
,
750 /* ----------------------------------------------------------- misc.c */
752 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
754 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
757 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
759 DRIVER_DISPATCH VfatBuildRequest
;
760 NTSTATUS NTAPI
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
763 PVOID
VfatGetUserBuffer(IN PIRP
);
765 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
769 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
772 /* ------------------------------------------------------------- flush.c */
774 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
776 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);