9 #define USE_ROS_CC_AND_FS
11 #define KEBUGCHECK KeBugCheck
12 #define KEBUGCHECKEX KeBugCheckEx
13 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
14 #define ROUND_UP(N, S) ROUND_DOWN((N) + (S) - 1, (S))
20 unsigned char magic0
, res0
, magic1
;
21 unsigned char OEMName
[8];
22 unsigned short BytesPerSector
;
23 unsigned char SectorsPerCluster
;
24 unsigned short ReservedSectors
;
25 unsigned char FATCount
;
26 unsigned short RootEntries
, Sectors
;
28 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
29 unsigned long HiddenSectors
, SectorsHuge
;
30 unsigned char Drive
, Res1
, Sig
;
31 unsigned long VolumeID
;
32 unsigned char VolumeLabel
[11], SysType
[8];
33 unsigned char Res2
[448];
34 unsigned short Signatur1
;
39 unsigned char magic0
, res0
, magic1
; // 0
40 unsigned char OEMName
[8]; // 3
41 unsigned short BytesPerSector
; // 11
42 unsigned char SectorsPerCluster
; // 13
43 unsigned short ReservedSectors
; // 14
44 unsigned char FATCount
; // 16
45 unsigned short RootEntries
, Sectors
; // 17
46 unsigned char Media
; // 21
47 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
48 unsigned long HiddenSectors
, SectorsHuge
; // 28
49 unsigned long FATSectors32
; // 36
50 unsigned short ExtFlag
; // 40
51 unsigned short FSVersion
; // 42
52 unsigned long RootCluster
; // 44
53 unsigned short FSInfoSector
; // 48
54 unsigned short BootBackup
; // 50
55 unsigned char Res3
[12]; // 52
56 unsigned char Drive
; // 64
57 unsigned char Res4
; // 65
58 unsigned char ExtBootSignature
; // 66
59 unsigned long VolumeID
; // 67
60 unsigned char VolumeLabel
[11], SysType
[8]; // 71
61 unsigned char Res2
[420]; // 90
62 unsigned short Signature1
; // 510
65 struct _BootSectorFatX
67 unsigned char SysType
[4]; // 0
68 unsigned long VolumeID
; // 4
69 unsigned long SectorsPerCluster
; // 8
70 unsigned short FATCount
; // 12
71 unsigned long Unknown
; // 14
72 unsigned char Unused
[4078]; // 18
77 unsigned long ExtBootSignature2
; // 0
78 unsigned char Res6
[480]; // 4
79 unsigned long FSINFOSignature
; // 484
80 unsigned long FreeCluster
; // 488
81 unsigned long NextCluster
; // 492
82 unsigned char Res7
[12]; // 496
83 unsigned long Signatur2
; // 508
86 typedef struct _BootSector BootSector
;
92 struct { unsigned char Filename
[8], Ext
[3]; };
93 unsigned char ShortName
[11];
97 unsigned char CreationTimeMs
;
98 unsigned short CreationTime
,CreationDate
,AccessDate
;
99 unsigned short FirstClusterHigh
; // higher
100 unsigned short UpdateTime
; //time create/update
101 unsigned short UpdateDate
; //date create/update
102 unsigned short FirstCluster
;
103 unsigned long FileSize
;
106 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
110 unsigned char FilenameLength
; // 0
111 unsigned char Attrib
; // 1
112 unsigned char Filename
[42]; // 2
113 unsigned long FirstCluster
; // 44
114 unsigned long FileSize
; // 48
115 unsigned short UpdateTime
; // 52
116 unsigned short UpdateDate
; // 54
117 unsigned short CreationTime
; // 56
118 unsigned short CreationDate
; // 58
119 unsigned short AccessTime
; // 60
120 unsigned short AccessDate
; // 62
125 unsigned char id
; // sequence number for slot
126 WCHAR name0_4
[5]; // first 5 characters in name
127 unsigned char attr
; // attribute byte
128 unsigned char reserved
; // always 0
129 unsigned char alias_checksum
; // checksum for 8.3 alias
130 WCHAR name5_10
[6]; // 6 more characters in name
131 unsigned char start
[2]; // starting cluster number
132 WCHAR name11_12
[2]; // last 2 characters in name
135 typedef struct _slot slot
;
139 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
140 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
142 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
144 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
145 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
146 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
148 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
149 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
150 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
151 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
153 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
154 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
155 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
156 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
158 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
159 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
161 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
169 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
171 #define BLOCKSIZE 512
179 #define VCB_VOLUME_LOCKED 0x0001
180 #define VCB_DISMOUNT_PENDING 0x0002
181 #define VCB_IS_FATX 0x0004
182 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
183 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
191 ULONG rootDirectorySectors
;
195 ULONG SectorsPerCluster
;
196 ULONG BytesPerSector
;
197 ULONG BytesPerCluster
;
198 ULONG NumberOfClusters
;
202 } FATINFO
, *PFATINFO
;
205 struct _VFAT_DIRENTRY_CONTEXT
;
207 typedef struct _HASHENTRY
210 struct _VFATFCB
* self
;
211 struct _HASHENTRY
* next
;
215 #define FCB_HASH_TABLE_SIZE 65536
217 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
219 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
220 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
221 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
223 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
225 typedef struct DEVICE_EXTENSION
227 ERESOURCE DirResource
;
228 ERESOURCE FatResource
;
230 KSPIN_LOCK FcbListLock
;
231 LIST_ENTRY FcbListHead
;
233 struct _HASHENTRY
** FcbHashTable
;
235 PDEVICE_OBJECT StorageDevice
;
236 PFILE_OBJECT FATFileObject
;
238 ULONG LastAvailableCluster
;
239 ULONG AvailableClusters
;
240 BOOLEAN AvailableClustersValid
;
242 struct _VFATFCB
* VolumeFcb
;
244 /* Pointers to functions for manipulating FAT. */
245 PGET_NEXT_CLUSTER GetNextCluster
;
246 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
247 PWRITE_CLUSTER WriteCluster
;
248 ULONG CleanShutBitMask
;
250 /* Pointers to functions for manipulating directory entries. */
251 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
255 LIST_ENTRY VolumeListEntry
;
256 } DEVICE_EXTENSION
, VCB
, *PVCB
;
260 PDRIVER_OBJECT DriverObject
;
261 PDEVICE_OBJECT DeviceObject
;
263 ERESOURCE VolumeListLock
;
264 LIST_ENTRY VolumeListHead
;
265 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
266 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
267 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
268 FAST_IO_DISPATCH FastIoDispatch
;
269 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
270 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
272 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
274 #define FCB_CACHE_INITIALIZED 0x0001
275 #define FCB_DELETE_PENDING 0x0002
276 #define FCB_IS_FAT 0x0004
277 #define FCB_IS_PAGE_FILE 0x0008
278 #define FCB_IS_VOLUME 0x0010
279 #define FCB_IS_DIRTY 0x0020
280 #define FCB_IS_FATX_ENTRY 0x0040
282 typedef struct _VFATFCB
284 /* FCB header required by ROS/NT */
285 FSRTL_COMMON_FCB_HEADER RFCB
;
286 SECTION_OBJECT_POINTERS SectionObjectPointers
;
287 ERESOURCE MainResource
;
288 ERESOURCE PagingIoResource
;
289 /* end FCB header required by ROS/NT */
291 /* directory entry for this file or directory */
294 /* Pointer to attributes in entry */
297 /* long file name, points into PathNameBuffer */
298 UNICODE_STRING LongNameU
;
300 /* short file name */
301 UNICODE_STRING ShortNameU
;
303 /* directory name, points into PathNameBuffer */
304 UNICODE_STRING DirNameU
;
306 /* path + long file name 260 max*/
307 UNICODE_STRING PathNameU
;
309 /* buffer for PathNameU */
310 PWCHAR PathNameBuffer
;
312 /* buffer for ShortNameU */
313 WCHAR ShortNameBuffer
[13];
318 /* List of FCB's for this volume */
319 LIST_ENTRY FcbListEntry
;
321 /* pointer to the parent fcb */
322 struct _VFATFCB
* parentFcb
;
324 /* Flags for the fcb */
327 /* pointer to the file object which has initialized the fcb */
328 PFILE_OBJECT FileObject
;
330 /* Directory index for the short name entry */
333 /* Directory index where the long name starts */
336 /* Share access for the file object */
337 SHARE_ACCESS FCBShareAccess
;
339 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
340 ULONG OpenHandleCount
;
342 /* Entry into the hash table for the path + long name */
345 /* Entry into the hash table for the path + short name */
348 /* List of byte-range locks for this file */
352 * Optimalization: caching of last read/write cluster+offset pair. Can't
353 * be in VFATCCB because it must be reset everytime the allocated clusters
356 FAST_MUTEX LastMutex
;
359 } VFATFCB
, *PVFATFCB
;
361 typedef struct _VFATCCB
363 LARGE_INTEGER CurrentByteOffset
;
364 /* for DirectoryControl */
366 /* for DirectoryControl */
367 UNICODE_STRING SearchPattern
;
368 } VFATCCB
, *PVFATCCB
;
371 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
374 #define TAG_CCB TAG('V', 'C', 'C', 'B')
375 #define TAG_FCB TAG('V', 'F', 'C', 'B')
376 #define TAG_IRP TAG('V', 'I', 'R', 'P')
378 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
380 typedef struct __DOSTIME
388 typedef struct __DOSDATE
396 #define IRPCONTEXT_CANWAIT 0x0001
397 #define IRPCONTEXT_PENDINGRETURNED 0x0002
402 PDEVICE_OBJECT DeviceObject
;
403 PDEVICE_EXTENSION DeviceExt
;
405 WORK_QUEUE_ITEM WorkQueueItem
;
406 PIO_STACK_LOCATION Stack
;
409 PFILE_OBJECT FileObject
;
412 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
414 typedef struct _VFAT_DIRENTRY_CONTEXT
419 UNICODE_STRING LongNameU
;
420 UNICODE_STRING ShortNameU
;
421 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
424 /* ------------------------------------------------------ shutdown.c */
426 NTSTATUS NTAPI
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
429 /* -------------------------------------------------------- volume.c */
431 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
433 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
435 /* ------------------------------------------------------ blockdev.c */
437 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
438 IN PLARGE_INTEGER ReadOffset
,
441 IN BOOLEAN Override
);
443 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
444 IN PLARGE_INTEGER ReadOffset
,
446 IN ULONG BufferOffset
,
449 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
450 IN PLARGE_INTEGER WriteOffset
,
451 IN ULONG WriteLength
,
452 IN ULONG BufferOffset
,
455 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
457 IN PVOID InputBuffer
,
458 IN ULONG InputBufferSize
,
459 IN OUT PVOID OutputBuffer
,
460 IN OUT PULONG pOutputBufferSize
,
461 IN BOOLEAN Override
);
463 /* ----------------------------------------------------------- dir.c */
465 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
467 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
470 PLARGE_INTEGER SystemTime
);
472 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
473 PLARGE_INTEGER SystemTime
,
477 /* -------------------------------------------------------- create.c */
479 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
481 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
482 PFILE_OBJECT FileObject
,
483 PVFATFCB
* parentFcb
);
485 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
487 PUNICODE_STRING FileToFindU
,
488 PVFAT_DIRENTRY_CONTEXT DirContext
,
491 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
492 PUNICODE_STRING NameU
);
494 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
497 /* --------------------------------------------------------- close.c */
499 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
501 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
502 PFILE_OBJECT FileObject
);
504 /* ------------------------------------------------------- cleanup.c */
506 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
508 /* --------------------------------------------------------- fastio.c */
511 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
514 VfatAcquireForLazyWrite(IN PVOID Context
,
518 VfatReleaseFromLazyWrite(IN PVOID Context
);
521 VfatAcquireForReadAhead(IN PVOID Context
,
525 VfatReleaseFromReadAhead(IN PVOID Context
);
527 /* --------------------------------------------------------- fsctl.c */
529 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
531 /* --------------------------------------------------------- finfo.c */
533 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
535 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
538 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
540 PDEVICE_EXTENSION DeviceExt
,
541 PLARGE_INTEGER AllocationSize
);
543 /* --------------------------------------------------------- iface.c */
545 NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject
,
546 PUNICODE_STRING RegistryPath
);
548 /* --------------------------------------------------------- dirwr.c */
550 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
551 PUNICODE_STRING PathNameU
,
554 ULONG RequestedOptions
,
557 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
559 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
562 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
567 /* -------------------------------------------------------- string.c */
570 vfatSplitPathName(PUNICODE_STRING PathNameU
,
571 PUNICODE_STRING DirNameU
,
572 PUNICODE_STRING FileNameU
);
574 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
576 BOOLEAN
wstrcmpjoki (PWSTR s1
,
579 /* ----------------------------------------------------------- fat.c */
581 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
582 ULONG CurrentCluster
,
585 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
588 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
589 ULONG ClusterToWrite
,
593 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
594 ULONG CurrentCluster
,
597 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
600 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
601 ULONG ClusterToWrite
,
605 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
606 ULONG CurrentCluster
,
609 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
612 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
613 ULONG ClusterToWrite
,
617 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
623 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
626 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
627 ULONG CurrentCluster
,
630 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
631 ULONG CurrentCluster
,
634 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
635 PLARGE_INTEGER Clusters
);
638 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
639 ULONG ClusterToWrite
,
642 /* ------------------------------------------------------ direntry.c */
644 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
645 PDIR_ENTRY pDirEntry
);
647 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
649 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
652 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
655 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
658 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
661 /* ----------------------------------------------------------- fcb.c */
663 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
664 PUNICODE_STRING pFileNameU
);
666 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
668 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
670 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
673 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
676 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
679 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
680 PUNICODE_STRING pFileNameU
);
682 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
684 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
686 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
688 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
690 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
692 PFILE_OBJECT fileObject
);
694 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
696 PUNICODE_STRING FileToFindU
,
699 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
700 PVFATFCB
*pParentFCB
,
702 PUNICODE_STRING pFileNameU
);
704 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
705 PVFATFCB directoryFCB
,
706 PVFAT_DIRENTRY_CONTEXT DirContext
,
709 /* ------------------------------------------------------------ rw.c */
711 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
713 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
715 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
717 PULONG CurrentCluster
,
720 /* ----------------------------------------------------------- misc.c */
722 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
724 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
727 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
729 NTSTATUS NTAPI
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
732 PVOID
VfatGetUserBuffer(IN PIRP
);
734 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
738 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
741 /* ------------------------------------------------------------- flush.c */
743 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
745 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);