1 /* $Id: vfat.h 16656 2005-07-20 02:52:52Z ion $ */
4 #include <ddk/ntdddisk.h>
6 #include <reactos/helper.h>
11 #define USE_ROS_CC_AND_FS
16 unsigned char magic0
, res0
, magic1
;
17 unsigned char OEMName
[8];
18 unsigned short BytesPerSector
;
19 unsigned char SectorsPerCluster
;
20 unsigned short ReservedSectors
;
21 unsigned char FATCount
;
22 unsigned short RootEntries
, Sectors
;
24 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
25 unsigned long HiddenSectors
, SectorsHuge
;
26 unsigned char Drive
, Res1
, Sig
;
27 unsigned long VolumeID
;
28 unsigned char VolumeLabel
[11], SysType
[8];
29 unsigned char Res2
[448];
30 unsigned short Signatur1
;
35 unsigned char magic0
, res0
, magic1
; // 0
36 unsigned char OEMName
[8]; // 3
37 unsigned short BytesPerSector
; // 11
38 unsigned char SectorsPerCluster
; // 13
39 unsigned short ReservedSectors
; // 14
40 unsigned char FATCount
; // 16
41 unsigned short RootEntries
, Sectors
; // 17
42 unsigned char Media
; // 21
43 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
44 unsigned long HiddenSectors
, SectorsHuge
; // 28
45 unsigned long FATSectors32
; // 36
46 unsigned short ExtFlag
; // 40
47 unsigned short FSVersion
; // 42
48 unsigned long RootCluster
; // 44
49 unsigned short FSInfoSector
; // 48
50 unsigned short BootBackup
; // 50
51 unsigned char Res3
[12]; // 52
52 unsigned char Drive
; // 64
53 unsigned char Res4
; // 65
54 unsigned char ExtBootSignature
; // 66
55 unsigned long VolumeID
; // 67
56 unsigned char VolumeLabel
[11], SysType
[8]; // 71
57 unsigned char Res2
[420]; // 90
58 unsigned short Signature1
; // 510
61 struct _BootSectorFatX
63 unsigned char SysType
[4]; // 0
64 unsigned long VolumeID
; // 4
65 unsigned long SectorsPerCluster
; // 8
66 unsigned short FATCount
; // 12
67 unsigned long Unknown
; // 14
68 unsigned char Unused
[4078]; // 18
73 unsigned long ExtBootSignature2
; // 0
74 unsigned char Res6
[480]; // 4
75 unsigned long FSINFOSignature
; // 484
76 unsigned long FreeCluster
; // 488
77 unsigned long NextCluster
; // 492
78 unsigned char Res7
[12]; // 496
79 unsigned long Signatur2
; // 508
82 typedef struct _BootSector BootSector
;
88 struct { unsigned char Filename
[8], Ext
[3]; };
89 unsigned char ShortName
[11];
93 unsigned char CreationTimeMs
;
94 unsigned short CreationTime
,CreationDate
,AccessDate
;
95 unsigned short FirstClusterHigh
; // higher
96 unsigned short UpdateTime
; //time create/update
97 unsigned short UpdateDate
; //date create/update
98 unsigned short FirstCluster
;
99 unsigned long FileSize
;
102 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
106 unsigned char FilenameLength
; // 0
107 unsigned char Attrib
; // 1
108 unsigned char Filename
[42]; // 2
109 unsigned long FirstCluster
; // 44
110 unsigned long FileSize
; // 48
111 unsigned short UpdateTime
; // 52
112 unsigned short UpdateDate
; // 54
113 unsigned short CreationTime
; // 56
114 unsigned short CreationDate
; // 58
115 unsigned short AccessTime
; // 60
116 unsigned short AccessDate
; // 62
121 unsigned char id
; // sequence number for slot
122 WCHAR name0_4
[5]; // first 5 characters in name
123 unsigned char attr
; // attribute byte
124 unsigned char reserved
; // always 0
125 unsigned char alias_checksum
; // checksum for 8.3 alias
126 WCHAR name5_10
[6]; // 6 more characters in name
127 unsigned char start
[2]; // starting cluster number
128 WCHAR name11_12
[2]; // last 2 characters in name
131 typedef struct _slot slot
;
135 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
136 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
138 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
140 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
141 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
142 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
144 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
145 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
146 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
147 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
149 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
150 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
151 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
152 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
154 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
155 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
157 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
165 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
167 #define BLOCKSIZE 512
175 #define VCB_VOLUME_LOCKED 0x0001
176 #define VCB_DISMOUNT_PENDING 0x0002
177 #define VCB_IS_FATX 0x0004
178 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
179 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
187 ULONG rootDirectorySectors
;
191 ULONG SectorsPerCluster
;
192 ULONG BytesPerSector
;
193 ULONG BytesPerCluster
;
194 ULONG NumberOfClusters
;
198 } FATINFO
, *PFATINFO
;
201 struct _VFAT_DIRENTRY_CONTEXT
;
203 typedef struct _HASHENTRY
206 struct _VFATFCB
* self
;
207 struct _HASHENTRY
* next
;
211 #define FCB_HASH_TABLE_SIZE 65536
213 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
215 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
216 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
217 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
219 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
221 typedef struct DEVICE_EXTENSION
223 ERESOURCE DirResource
;
224 ERESOURCE FatResource
;
226 KSPIN_LOCK FcbListLock
;
227 LIST_ENTRY FcbListHead
;
229 struct _HASHENTRY
** FcbHashTable
;
231 PDEVICE_OBJECT StorageDevice
;
232 PFILE_OBJECT FATFileObject
;
234 ULONG LastAvailableCluster
;
235 ULONG AvailableClusters
;
236 BOOLEAN AvailableClustersValid
;
238 struct _VFATFCB
* VolumeFcb
;
240 /* Pointers to functions for manipulating FAT. */
241 PGET_NEXT_CLUSTER GetNextCluster
;
242 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
243 PWRITE_CLUSTER WriteCluster
;
244 ULONG CleanShutBitMask
;
246 /* Pointers to functions for manipulating directory entries. */
247 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
251 LIST_ENTRY VolumeListEntry
;
252 } DEVICE_EXTENSION
, VCB
, *PVCB
;
256 PDRIVER_OBJECT DriverObject
;
257 PDEVICE_OBJECT DeviceObject
;
259 ERESOURCE VolumeListLock
;
260 LIST_ENTRY VolumeListHead
;
261 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
262 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
263 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
264 FAST_IO_DISPATCH FastIoDispatch
;
265 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
266 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
268 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
270 #define FCB_CACHE_INITIALIZED 0x0001
271 #define FCB_DELETE_PENDING 0x0002
272 #define FCB_IS_FAT 0x0004
273 #define FCB_IS_PAGE_FILE 0x0008
274 #define FCB_IS_VOLUME 0x0010
275 #define FCB_IS_DIRTY 0x0020
276 #define FCB_IS_FATX_ENTRY 0x0040
278 typedef struct _VFATFCB
280 /* FCB header required by ROS/NT */
281 FSRTL_COMMON_FCB_HEADER RFCB
;
282 SECTION_OBJECT_POINTERS SectionObjectPointers
;
283 ERESOURCE MainResource
;
284 ERESOURCE PagingIoResource
;
285 /* end FCB header required by ROS/NT */
287 /* directory entry for this file or directory */
290 /* Pointer to attributes in entry */
293 /* long file name, points into PathNameBuffer */
294 UNICODE_STRING LongNameU
;
296 /* short file name */
297 UNICODE_STRING ShortNameU
;
299 /* directory name, points into PathNameBuffer */
300 UNICODE_STRING DirNameU
;
302 /* path + long file name 260 max*/
303 UNICODE_STRING PathNameU
;
305 /* buffer for PathNameU */
306 PWCHAR PathNameBuffer
;
308 /* buffer for ShortNameU */
309 WCHAR ShortNameBuffer
[13];
314 /* List of FCB's for this volume */
315 LIST_ENTRY FcbListEntry
;
317 /* pointer to the parent fcb */
318 struct _VFATFCB
* parentFcb
;
320 /* Flags for the fcb */
323 /* pointer to the file object which has initialized the fcb */
324 PFILE_OBJECT FileObject
;
326 /* Directory index for the short name entry */
329 /* Directory index where the long name starts */
332 /* Share access for the file object */
333 SHARE_ACCESS FCBShareAccess
;
335 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
336 ULONG OpenHandleCount
;
338 /* Entry into the hash table for the path + long name */
341 /* Entry into the hash table for the path + short name */
344 /* List of byte-range locks for this file */
348 * Optimalization: caching of last read/write cluster+offset pair. Can't
349 * be in VFATCCB because it must be reset everytime the allocated clusters
352 FAST_MUTEX LastMutex
;
355 } VFATFCB
, *PVFATFCB
;
357 typedef struct _VFATCCB
359 LARGE_INTEGER CurrentByteOffset
;
360 /* for DirectoryControl */
362 /* for DirectoryControl */
363 UNICODE_STRING SearchPattern
;
364 } VFATCCB
, *PVFATCCB
;
367 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
370 #define TAG_CCB TAG('V', 'C', 'C', 'B')
371 #define TAG_FCB TAG('V', 'F', 'C', 'B')
372 #define TAG_IRP TAG('V', 'I', 'R', 'P')
374 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
376 typedef struct __DOSTIME
384 typedef struct __DOSDATE
392 #define IRPCONTEXT_CANWAIT 0x0001
393 #define IRPCONTEXT_PENDINGRETURNED 0x0002
398 PDEVICE_OBJECT DeviceObject
;
399 PDEVICE_EXTENSION DeviceExt
;
401 WORK_QUEUE_ITEM WorkQueueItem
;
402 PIO_STACK_LOCATION Stack
;
405 PFILE_OBJECT FileObject
;
408 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
410 typedef struct _VFAT_DIRENTRY_CONTEXT
415 UNICODE_STRING LongNameU
;
416 UNICODE_STRING ShortNameU
;
417 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
420 /* ------------------------------------------------------ shutdown.c */
422 NTSTATUS STDCALL
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
425 /* -------------------------------------------------------- volume.c */
427 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
429 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
431 /* ------------------------------------------------------ blockdev.c */
433 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
434 IN PLARGE_INTEGER ReadOffset
,
437 IN BOOLEAN Override
);
439 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
440 IN PLARGE_INTEGER ReadOffset
,
442 IN ULONG BufferOffset
,
445 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
446 IN PLARGE_INTEGER WriteOffset
,
447 IN ULONG WriteLength
,
448 IN ULONG BufferOffset
,
451 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
453 IN PVOID InputBuffer
,
454 IN ULONG InputBufferSize
,
455 IN OUT PVOID OutputBuffer
,
456 IN OUT PULONG pOutputBufferSize
,
457 IN BOOLEAN Override
);
459 /* ----------------------------------------------------------- dir.c */
461 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
463 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
466 PLARGE_INTEGER SystemTime
);
468 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
469 PLARGE_INTEGER SystemTime
,
473 /* -------------------------------------------------------- create.c */
475 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
477 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
478 PFILE_OBJECT FileObject
,
479 PVFATFCB
* parentFcb
);
481 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
483 PUNICODE_STRING FileToFindU
,
484 PVFAT_DIRENTRY_CONTEXT DirContext
,
487 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
488 PUNICODE_STRING NameU
);
490 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
493 /* --------------------------------------------------------- close.c */
495 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
497 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
498 PFILE_OBJECT FileObject
);
500 /* ------------------------------------------------------- cleanup.c */
502 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
504 /* --------------------------------------------------------- fastio.c */
507 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
510 VfatAcquireForLazyWrite(IN PVOID Context
,
514 VfatReleaseFromLazyWrite(IN PVOID Context
);
517 VfatAcquireForReadAhead(IN PVOID Context
,
521 VfatReleaseFromReadAhead(IN PVOID Context
);
523 /* --------------------------------------------------------- fsctl.c */
525 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
527 /* --------------------------------------------------------- finfo.c */
529 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
531 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
534 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
536 PDEVICE_EXTENSION DeviceExt
,
537 PLARGE_INTEGER AllocationSize
);
539 /* --------------------------------------------------------- iface.c */
541 NTSTATUS STDCALL
DriverEntry (PDRIVER_OBJECT DriverObject
,
542 PUNICODE_STRING RegistryPath
);
544 /* --------------------------------------------------------- dirwr.c */
546 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
547 PUNICODE_STRING PathNameU
,
550 ULONG RequestedOptions
,
553 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
555 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
558 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
563 /* -------------------------------------------------------- string.c */
566 vfatSplitPathName(PUNICODE_STRING PathNameU
,
567 PUNICODE_STRING DirNameU
,
568 PUNICODE_STRING FileNameU
);
570 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
572 BOOLEAN
wstrcmpjoki (PWSTR s1
,
575 /* ----------------------------------------------------------- fat.c */
577 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
578 ULONG CurrentCluster
,
581 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
584 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
585 ULONG ClusterToWrite
,
589 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
590 ULONG CurrentCluster
,
593 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
596 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
597 ULONG ClusterToWrite
,
601 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
602 ULONG CurrentCluster
,
605 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
608 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
609 ULONG ClusterToWrite
,
613 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
619 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
622 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
623 ULONG CurrentCluster
,
626 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
627 ULONG CurrentCluster
,
630 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
631 PLARGE_INTEGER Clusters
);
634 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
635 ULONG ClusterToWrite
,
638 /* ------------------------------------------------------ direntry.c */
640 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
641 PDIR_ENTRY pDirEntry
);
643 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
645 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
648 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
651 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
654 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
657 /* ----------------------------------------------------------- fcb.c */
659 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
660 PUNICODE_STRING pFileNameU
);
662 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
664 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
666 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
669 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
672 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
675 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
676 PUNICODE_STRING pFileNameU
);
678 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
680 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
682 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
684 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
686 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
688 PFILE_OBJECT fileObject
);
690 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
692 PUNICODE_STRING FileToFindU
,
695 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
696 PVFATFCB
*pParentFCB
,
698 PUNICODE_STRING pFileNameU
);
700 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
701 PVFATFCB directoryFCB
,
702 PVFAT_DIRENTRY_CONTEXT DirContext
,
705 /* ------------------------------------------------------------ rw.c */
707 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
709 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
711 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
713 PULONG CurrentCluster
,
716 /* ----------------------------------------------------------- misc.c */
718 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
720 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
723 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
725 NTSTATUS STDCALL
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
728 PVOID
VfatGetUserBuffer(IN PIRP
);
730 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
734 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
737 /* ------------------------------------------------------------- flush.c */
739 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
741 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);