1 /* $Id: vfat.h 16656 2005-07-20 02:52:52Z ion $ */
4 #include <ddk/ntdddisk.h>
9 #define USE_ROS_CC_AND_FS
14 unsigned char magic0
, res0
, magic1
;
15 unsigned char OEMName
[8];
16 unsigned short BytesPerSector
;
17 unsigned char SectorsPerCluster
;
18 unsigned short ReservedSectors
;
19 unsigned char FATCount
;
20 unsigned short RootEntries
, Sectors
;
22 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
23 unsigned long HiddenSectors
, SectorsHuge
;
24 unsigned char Drive
, Res1
, Sig
;
25 unsigned long VolumeID
;
26 unsigned char VolumeLabel
[11], SysType
[8];
27 unsigned char Res2
[448];
28 unsigned short Signatur1
;
33 unsigned char magic0
, res0
, magic1
; // 0
34 unsigned char OEMName
[8]; // 3
35 unsigned short BytesPerSector
; // 11
36 unsigned char SectorsPerCluster
; // 13
37 unsigned short ReservedSectors
; // 14
38 unsigned char FATCount
; // 16
39 unsigned short RootEntries
, Sectors
; // 17
40 unsigned char Media
; // 21
41 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
42 unsigned long HiddenSectors
, SectorsHuge
; // 28
43 unsigned long FATSectors32
; // 36
44 unsigned short ExtFlag
; // 40
45 unsigned short FSVersion
; // 42
46 unsigned long RootCluster
; // 44
47 unsigned short FSInfoSector
; // 48
48 unsigned short BootBackup
; // 50
49 unsigned char Res3
[12]; // 52
50 unsigned char Drive
; // 64
51 unsigned char Res4
; // 65
52 unsigned char ExtBootSignature
; // 66
53 unsigned long VolumeID
; // 67
54 unsigned char VolumeLabel
[11], SysType
[8]; // 71
55 unsigned char Res2
[420]; // 90
56 unsigned short Signature1
; // 510
59 struct _BootSectorFatX
61 unsigned char SysType
[4]; // 0
62 unsigned long VolumeID
; // 4
63 unsigned long SectorsPerCluster
; // 8
64 unsigned short FATCount
; // 12
65 unsigned long Unknown
; // 14
66 unsigned char Unused
[4078]; // 18
71 unsigned long ExtBootSignature2
; // 0
72 unsigned char Res6
[480]; // 4
73 unsigned long FSINFOSignature
; // 484
74 unsigned long FreeCluster
; // 488
75 unsigned long NextCluster
; // 492
76 unsigned char Res7
[12]; // 496
77 unsigned long Signatur2
; // 508
80 typedef struct _BootSector BootSector
;
86 struct { unsigned char Filename
[8], Ext
[3]; };
87 unsigned char ShortName
[11];
91 unsigned char CreationTimeMs
;
92 unsigned short CreationTime
,CreationDate
,AccessDate
;
93 unsigned short FirstClusterHigh
; // higher
94 unsigned short UpdateTime
; //time create/update
95 unsigned short UpdateDate
; //date create/update
96 unsigned short FirstCluster
;
97 unsigned long FileSize
;
100 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
104 unsigned char FilenameLength
; // 0
105 unsigned char Attrib
; // 1
106 unsigned char Filename
[42]; // 2
107 unsigned long FirstCluster
; // 44
108 unsigned long FileSize
; // 48
109 unsigned short UpdateTime
; // 52
110 unsigned short UpdateDate
; // 54
111 unsigned short CreationTime
; // 56
112 unsigned short CreationDate
; // 58
113 unsigned short AccessTime
; // 60
114 unsigned short AccessDate
; // 62
119 unsigned char id
; // sequence number for slot
120 WCHAR name0_4
[5]; // first 5 characters in name
121 unsigned char attr
; // attribute byte
122 unsigned char reserved
; // always 0
123 unsigned char alias_checksum
; // checksum for 8.3 alias
124 WCHAR name5_10
[6]; // 6 more characters in name
125 unsigned char start
[2]; // starting cluster number
126 WCHAR name11_12
[2]; // last 2 characters in name
129 typedef struct _slot slot
;
133 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
134 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
136 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
138 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
139 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
140 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
142 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
143 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
144 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
145 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
147 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
148 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
149 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
150 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
152 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
153 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
155 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
163 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
165 #define BLOCKSIZE 512
173 #define VCB_VOLUME_LOCKED 0x0001
174 #define VCB_DISMOUNT_PENDING 0x0002
175 #define VCB_IS_FATX 0x0004
176 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
177 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
185 ULONG rootDirectorySectors
;
189 ULONG SectorsPerCluster
;
190 ULONG BytesPerSector
;
191 ULONG BytesPerCluster
;
192 ULONG NumberOfClusters
;
196 } FATINFO
, *PFATINFO
;
199 struct _VFAT_DIRENTRY_CONTEXT
;
201 typedef struct _HASHENTRY
204 struct _VFATFCB
* self
;
205 struct _HASHENTRY
* next
;
209 #define FCB_HASH_TABLE_SIZE 65536
211 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
213 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
214 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
215 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
217 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
219 typedef struct DEVICE_EXTENSION
221 ERESOURCE DirResource
;
222 ERESOURCE FatResource
;
224 KSPIN_LOCK FcbListLock
;
225 LIST_ENTRY FcbListHead
;
227 struct _HASHENTRY
** FcbHashTable
;
229 PDEVICE_OBJECT StorageDevice
;
230 PFILE_OBJECT FATFileObject
;
232 ULONG LastAvailableCluster
;
233 ULONG AvailableClusters
;
234 BOOLEAN AvailableClustersValid
;
236 struct _VFATFCB
* VolumeFcb
;
238 /* Pointers to functions for manipulating FAT. */
239 PGET_NEXT_CLUSTER GetNextCluster
;
240 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
241 PWRITE_CLUSTER WriteCluster
;
242 ULONG CleanShutBitMask
;
244 /* Pointers to functions for manipulating directory entries. */
245 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
249 LIST_ENTRY VolumeListEntry
;
250 } DEVICE_EXTENSION
, VCB
, *PVCB
;
254 PDRIVER_OBJECT DriverObject
;
255 PDEVICE_OBJECT DeviceObject
;
257 ERESOURCE VolumeListLock
;
258 LIST_ENTRY VolumeListHead
;
259 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
260 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
261 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
262 FAST_IO_DISPATCH FastIoDispatch
;
263 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
264 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
266 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
268 #define FCB_CACHE_INITIALIZED 0x0001
269 #define FCB_DELETE_PENDING 0x0002
270 #define FCB_IS_FAT 0x0004
271 #define FCB_IS_PAGE_FILE 0x0008
272 #define FCB_IS_VOLUME 0x0010
273 #define FCB_IS_DIRTY 0x0020
274 #define FCB_IS_FATX_ENTRY 0x0040
276 typedef struct _VFATFCB
278 /* FCB header required by ROS/NT */
279 FSRTL_COMMON_FCB_HEADER RFCB
;
280 SECTION_OBJECT_POINTERS SectionObjectPointers
;
281 ERESOURCE MainResource
;
282 ERESOURCE PagingIoResource
;
283 /* end FCB header required by ROS/NT */
285 /* directory entry for this file or directory */
288 /* Pointer to attributes in entry */
291 /* long file name, points into PathNameBuffer */
292 UNICODE_STRING LongNameU
;
294 /* short file name */
295 UNICODE_STRING ShortNameU
;
297 /* directory name, points into PathNameBuffer */
298 UNICODE_STRING DirNameU
;
300 /* path + long file name 260 max*/
301 UNICODE_STRING PathNameU
;
303 /* buffer for PathNameU */
304 PWCHAR PathNameBuffer
;
306 /* buffer for ShortNameU */
307 WCHAR ShortNameBuffer
[13];
312 /* List of FCB's for this volume */
313 LIST_ENTRY FcbListEntry
;
315 /* pointer to the parent fcb */
316 struct _VFATFCB
* parentFcb
;
318 /* Flags for the fcb */
321 /* pointer to the file object which has initialized the fcb */
322 PFILE_OBJECT FileObject
;
324 /* Directory index for the short name entry */
327 /* Directory index where the long name starts */
330 /* Share access for the file object */
331 SHARE_ACCESS FCBShareAccess
;
333 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
334 ULONG OpenHandleCount
;
336 /* Entry into the hash table for the path + long name */
339 /* Entry into the hash table for the path + short name */
342 /* List of byte-range locks for this file */
346 * Optimalization: caching of last read/write cluster+offset pair. Can't
347 * be in VFATCCB because it must be reset everytime the allocated clusters
350 FAST_MUTEX LastMutex
;
353 } VFATFCB
, *PVFATFCB
;
355 typedef struct _VFATCCB
357 LARGE_INTEGER CurrentByteOffset
;
358 /* for DirectoryControl */
360 /* for DirectoryControl */
361 UNICODE_STRING SearchPattern
;
362 } VFATCCB
, *PVFATCCB
;
364 #define TAG_CCB 'BCCV'
365 #define TAG_FCB 'BCFV'
366 #define TAG_IRP 'PRIV'
368 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
370 typedef struct __DOSTIME
378 typedef struct __DOSDATE
386 #define IRPCONTEXT_CANWAIT 0x0001
387 #define IRPCONTEXT_PENDINGRETURNED 0x0002
392 PDEVICE_OBJECT DeviceObject
;
393 PDEVICE_EXTENSION DeviceExt
;
395 WORK_QUEUE_ITEM WorkQueueItem
;
396 PIO_STACK_LOCATION Stack
;
399 PFILE_OBJECT FileObject
;
402 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
404 typedef struct _VFAT_DIRENTRY_CONTEXT
409 UNICODE_STRING LongNameU
;
410 UNICODE_STRING ShortNameU
;
411 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
414 /* ------------------------------------------------------ shutdown.c */
416 NTSTATUS NTAPI
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
419 /* -------------------------------------------------------- volume.c */
421 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
423 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
425 /* ------------------------------------------------------ blockdev.c */
427 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
428 IN PLARGE_INTEGER ReadOffset
,
431 IN BOOLEAN Override
);
433 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
434 IN PLARGE_INTEGER ReadOffset
,
436 IN ULONG BufferOffset
,
439 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
440 IN PLARGE_INTEGER WriteOffset
,
441 IN ULONG WriteLength
,
442 IN ULONG BufferOffset
,
445 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
447 IN PVOID InputBuffer
,
448 IN ULONG InputBufferSize
,
449 IN OUT PVOID OutputBuffer
,
450 IN OUT PULONG pOutputBufferSize
,
451 IN BOOLEAN Override
);
453 /* ----------------------------------------------------------- dir.c */
455 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
457 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
460 PLARGE_INTEGER SystemTime
);
462 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
463 PLARGE_INTEGER SystemTime
,
467 /* -------------------------------------------------------- create.c */
469 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
471 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
472 PFILE_OBJECT FileObject
,
473 PVFATFCB
* parentFcb
);
475 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
477 PUNICODE_STRING FileToFindU
,
478 PVFAT_DIRENTRY_CONTEXT DirContext
,
481 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
482 PUNICODE_STRING NameU
);
484 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
487 /* --------------------------------------------------------- close.c */
489 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
491 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
492 PFILE_OBJECT FileObject
);
494 /* ------------------------------------------------------- cleanup.c */
496 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
498 /* --------------------------------------------------------- fastio.c */
501 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
504 VfatAcquireForLazyWrite(IN PVOID Context
,
508 VfatReleaseFromLazyWrite(IN PVOID Context
);
511 VfatAcquireForReadAhead(IN PVOID Context
,
515 VfatReleaseFromReadAhead(IN PVOID Context
);
517 /* --------------------------------------------------------- fsctl.c */
519 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
521 /* --------------------------------------------------------- finfo.c */
523 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
525 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
528 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
530 PDEVICE_EXTENSION DeviceExt
,
531 PLARGE_INTEGER AllocationSize
);
533 /* --------------------------------------------------------- iface.c */
535 NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject
,
536 PUNICODE_STRING RegistryPath
);
538 /* --------------------------------------------------------- dirwr.c */
540 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
541 PUNICODE_STRING PathNameU
,
544 ULONG RequestedOptions
,
547 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
549 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
552 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
557 /* -------------------------------------------------------- string.c */
560 vfatSplitPathName(PUNICODE_STRING PathNameU
,
561 PUNICODE_STRING DirNameU
,
562 PUNICODE_STRING FileNameU
);
564 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
566 BOOLEAN
wstrcmpjoki (PWSTR s1
,
569 /* ----------------------------------------------------------- fat.c */
571 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
572 ULONG CurrentCluster
,
575 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
578 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
579 ULONG ClusterToWrite
,
583 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
584 ULONG CurrentCluster
,
587 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
590 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
591 ULONG ClusterToWrite
,
595 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
596 ULONG CurrentCluster
,
599 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
602 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
603 ULONG ClusterToWrite
,
607 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
613 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
616 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
617 ULONG CurrentCluster
,
620 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
621 ULONG CurrentCluster
,
624 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
625 PLARGE_INTEGER Clusters
);
628 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
629 ULONG ClusterToWrite
,
632 /* ------------------------------------------------------ direntry.c */
634 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
635 PDIR_ENTRY pDirEntry
);
637 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
639 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
642 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
645 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
648 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
651 /* ----------------------------------------------------------- fcb.c */
653 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
654 PUNICODE_STRING pFileNameU
);
656 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
658 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
660 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
663 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
666 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
669 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
670 PUNICODE_STRING pFileNameU
);
672 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
674 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
676 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
678 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
680 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
682 PFILE_OBJECT fileObject
);
684 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
686 PUNICODE_STRING FileToFindU
,
689 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
690 PVFATFCB
*pParentFCB
,
692 PUNICODE_STRING pFileNameU
);
694 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
695 PVFATFCB directoryFCB
,
696 PVFAT_DIRENTRY_CONTEXT DirContext
,
699 /* ------------------------------------------------------------ rw.c */
701 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
703 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
705 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
707 PULONG CurrentCluster
,
710 /* ----------------------------------------------------------- misc.c */
712 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
714 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
717 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
719 NTSTATUS NTAPI
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
722 PVOID
VfatGetUserBuffer(IN PIRP
);
724 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
728 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
731 /* ------------------------------------------------------------- flush.c */
733 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
735 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);