8 #define USE_ROS_CC_AND_FS
10 #define KEBUGCHECK KeBugCheck
11 #define KEBUGCHECKEX KeBugCheckEx
12 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
13 #define ROUND_UP(N, S) ROUND_DOWN((N) + (S) - 1, (S))
16 #define ROUND_DOWN(n, align) \
17 (((ULONG)n) & ~((align) - 1l))
19 #define ROUND_UP(n, align) \
20 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
25 unsigned char magic0
, res0
, magic1
;
26 unsigned char OEMName
[8];
27 unsigned short BytesPerSector
;
28 unsigned char SectorsPerCluster
;
29 unsigned short ReservedSectors
;
30 unsigned char FATCount
;
31 unsigned short RootEntries
, Sectors
;
33 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
34 unsigned long HiddenSectors
, SectorsHuge
;
35 unsigned char Drive
, Res1
, Sig
;
36 unsigned long VolumeID
;
37 unsigned char VolumeLabel
[11], SysType
[8];
38 unsigned char Res2
[448];
39 unsigned short Signatur1
;
44 unsigned char magic0
, res0
, magic1
; // 0
45 unsigned char OEMName
[8]; // 3
46 unsigned short BytesPerSector
; // 11
47 unsigned char SectorsPerCluster
; // 13
48 unsigned short ReservedSectors
; // 14
49 unsigned char FATCount
; // 16
50 unsigned short RootEntries
, Sectors
; // 17
51 unsigned char Media
; // 21
52 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
53 unsigned long HiddenSectors
, SectorsHuge
; // 28
54 unsigned long FATSectors32
; // 36
55 unsigned short ExtFlag
; // 40
56 unsigned short FSVersion
; // 42
57 unsigned long RootCluster
; // 44
58 unsigned short FSInfoSector
; // 48
59 unsigned short BootBackup
; // 50
60 unsigned char Res3
[12]; // 52
61 unsigned char Drive
; // 64
62 unsigned char Res4
; // 65
63 unsigned char ExtBootSignature
; // 66
64 unsigned long VolumeID
; // 67
65 unsigned char VolumeLabel
[11], SysType
[8]; // 71
66 unsigned char Res2
[420]; // 90
67 unsigned short Signature1
; // 510
70 struct _BootSectorFatX
72 unsigned char SysType
[4]; // 0
73 unsigned long VolumeID
; // 4
74 unsigned long SectorsPerCluster
; // 8
75 unsigned short FATCount
; // 12
76 unsigned long Unknown
; // 14
77 unsigned char Unused
[4078]; // 18
82 unsigned long ExtBootSignature2
; // 0
83 unsigned char Res6
[480]; // 4
84 unsigned long FSINFOSignature
; // 484
85 unsigned long FreeCluster
; // 488
86 unsigned long NextCluster
; // 492
87 unsigned char Res7
[12]; // 496
88 unsigned long Signatur2
; // 508
91 typedef struct _BootSector BootSector
;
97 struct { unsigned char Filename
[8], Ext
[3]; };
98 unsigned char ShortName
[11];
100 unsigned char Attrib
;
102 unsigned char CreationTimeMs
;
103 unsigned short CreationTime
,CreationDate
,AccessDate
;
106 unsigned short FirstClusterHigh
; // FAT32
107 unsigned short ExtendedAttributes
; // FAT12/FAT16
109 unsigned short UpdateTime
; //time create/update
110 unsigned short UpdateDate
; //date create/update
111 unsigned short FirstCluster
;
112 unsigned long FileSize
;
115 #define FAT_EAFILE "EA DATA. SF"
117 typedef struct _EAFileHeader FAT_EA_FILE_HEADER
, *PFAT_EA_FILE_HEADER
;
121 unsigned short Signature
; // ED
122 unsigned short Unknown
[15];
123 unsigned short EASetTable
[240];
126 typedef struct _EASetHeader FAT_EA_SET_HEADER
, *PFAT_EA_SET_HEADER
;
130 unsigned short Signature
; // EA
131 unsigned short Offset
; // relative offset, same value as in the EASetTable
132 unsigned short Unknown1
[2];
133 char TargetFileName
[12];
134 unsigned short Unknown2
[3];
135 unsigned int EALength
;
139 typedef struct _EAHeader FAT_EA_HEADER
, *PFAT_EA_HEADER
;
143 unsigned char Unknown
;
144 unsigned char EANameLength
;
145 unsigned short EAValueLength
;
150 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
154 unsigned char FilenameLength
; // 0
155 unsigned char Attrib
; // 1
156 unsigned char Filename
[42]; // 2
157 unsigned long FirstCluster
; // 44
158 unsigned long FileSize
; // 48
159 unsigned short UpdateTime
; // 52
160 unsigned short UpdateDate
; // 54
161 unsigned short CreationTime
; // 56
162 unsigned short CreationDate
; // 58
163 unsigned short AccessTime
; // 60
164 unsigned short AccessDate
; // 62
169 unsigned char id
; // sequence number for slot
170 WCHAR name0_4
[5]; // first 5 characters in name
171 unsigned char attr
; // attribute byte
172 unsigned char reserved
; // always 0
173 unsigned char alias_checksum
; // checksum for 8.3 alias
174 WCHAR name5_10
[6]; // 6 more characters in name
175 unsigned char start
[2]; // starting cluster number
176 WCHAR name11_12
[2]; // last 2 characters in name
179 typedef struct _slot slot
;
183 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
184 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
186 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
188 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
189 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
190 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
192 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
193 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
194 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
195 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
197 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
198 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
199 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
200 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
202 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
203 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
205 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
213 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
215 #define BLOCKSIZE 512
223 #define VCB_VOLUME_LOCKED 0x0001
224 #define VCB_DISMOUNT_PENDING 0x0002
225 #define VCB_IS_FATX 0x0004
226 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
227 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
235 ULONG rootDirectorySectors
;
239 ULONG SectorsPerCluster
;
240 ULONG BytesPerSector
;
241 ULONG BytesPerCluster
;
242 ULONG NumberOfClusters
;
246 } FATINFO
, *PFATINFO
;
249 struct _VFAT_DIRENTRY_CONTEXT
;
251 typedef struct _HASHENTRY
254 struct _VFATFCB
* self
;
255 struct _HASHENTRY
* next
;
259 #define FCB_HASH_TABLE_SIZE 65536
261 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
263 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
264 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
265 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
267 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
269 typedef struct DEVICE_EXTENSION
271 ERESOURCE DirResource
;
272 ERESOURCE FatResource
;
274 KSPIN_LOCK FcbListLock
;
275 LIST_ENTRY FcbListHead
;
277 struct _HASHENTRY
** FcbHashTable
;
279 PDEVICE_OBJECT StorageDevice
;
280 PFILE_OBJECT FATFileObject
;
282 ULONG LastAvailableCluster
;
283 ULONG AvailableClusters
;
284 BOOLEAN AvailableClustersValid
;
286 struct _VFATFCB
* VolumeFcb
;
288 /* Pointers to functions for manipulating FAT. */
289 PGET_NEXT_CLUSTER GetNextCluster
;
290 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
291 PWRITE_CLUSTER WriteCluster
;
292 ULONG CleanShutBitMask
;
294 /* Pointers to functions for manipulating directory entries. */
295 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
299 LIST_ENTRY VolumeListEntry
;
300 } DEVICE_EXTENSION
, VCB
, *PVCB
;
304 PDRIVER_OBJECT DriverObject
;
305 PDEVICE_OBJECT DeviceObject
;
307 ERESOURCE VolumeListLock
;
308 LIST_ENTRY VolumeListHead
;
309 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
310 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
311 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
312 FAST_IO_DISPATCH FastIoDispatch
;
313 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
314 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
316 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
318 #define FCB_CACHE_INITIALIZED 0x0001
319 #define FCB_DELETE_PENDING 0x0002
320 #define FCB_IS_FAT 0x0004
321 #define FCB_IS_PAGE_FILE 0x0008
322 #define FCB_IS_VOLUME 0x0010
323 #define FCB_IS_DIRTY 0x0020
324 #define FCB_IS_FATX_ENTRY 0x0040
326 typedef struct _VFATFCB
328 /* FCB header required by ROS/NT */
329 FSRTL_COMMON_FCB_HEADER RFCB
;
330 SECTION_OBJECT_POINTERS SectionObjectPointers
;
331 ERESOURCE MainResource
;
332 ERESOURCE PagingIoResource
;
333 /* end FCB header required by ROS/NT */
335 /* directory entry for this file or directory */
338 /* Pointer to attributes in entry */
341 /* long file name, points into PathNameBuffer */
342 UNICODE_STRING LongNameU
;
344 /* short file name */
345 UNICODE_STRING ShortNameU
;
347 /* directory name, points into PathNameBuffer */
348 UNICODE_STRING DirNameU
;
350 /* path + long file name 260 max*/
351 UNICODE_STRING PathNameU
;
353 /* buffer for PathNameU */
354 PWCHAR PathNameBuffer
;
356 /* buffer for ShortNameU */
357 WCHAR ShortNameBuffer
[13];
362 /* List of FCB's for this volume */
363 LIST_ENTRY FcbListEntry
;
365 /* pointer to the parent fcb */
366 struct _VFATFCB
* parentFcb
;
368 /* Flags for the fcb */
371 /* pointer to the file object which has initialized the fcb */
372 PFILE_OBJECT FileObject
;
374 /* Directory index for the short name entry */
377 /* Directory index where the long name starts */
380 /* Share access for the file object */
381 SHARE_ACCESS FCBShareAccess
;
383 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
384 ULONG OpenHandleCount
;
386 /* Entry into the hash table for the path + long name */
389 /* Entry into the hash table for the path + short name */
392 /* List of byte-range locks for this file */
396 * Optimalization: caching of last read/write cluster+offset pair. Can't
397 * be in VFATCCB because it must be reset everytime the allocated clusters
400 FAST_MUTEX LastMutex
;
403 } VFATFCB
, *PVFATFCB
;
405 typedef struct _VFATCCB
407 LARGE_INTEGER CurrentByteOffset
;
408 /* for DirectoryControl */
410 /* for DirectoryControl */
411 UNICODE_STRING SearchPattern
;
412 } VFATCCB
, *PVFATCCB
;
415 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
418 #define TAG_CCB TAG('V', 'C', 'C', 'B')
419 #define TAG_FCB TAG('V', 'F', 'C', 'B')
420 #define TAG_IRP TAG('V', 'I', 'R', 'P')
421 #define TAG_VFAT TAG('V', 'F', 'A', 'T')
423 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
425 typedef struct __DOSTIME
433 typedef struct __DOSDATE
441 #define IRPCONTEXT_CANWAIT 0x0001
442 #define IRPCONTEXT_PENDINGRETURNED 0x0002
447 PDEVICE_OBJECT DeviceObject
;
448 PDEVICE_EXTENSION DeviceExt
;
450 WORK_QUEUE_ITEM WorkQueueItem
;
451 PIO_STACK_LOCATION Stack
;
454 PFILE_OBJECT FileObject
;
457 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
459 typedef struct _VFAT_DIRENTRY_CONTEXT
464 UNICODE_STRING LongNameU
;
465 UNICODE_STRING ShortNameU
;
466 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
469 /* ------------------------------------------------------ shutdown.c */
471 DRIVER_DISPATCH VfatShutdown
;
472 NTSTATUS NTAPI
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
475 /* -------------------------------------------------------- volume.c */
477 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
479 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
481 /* ------------------------------------------------------ blockdev.c */
483 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
484 IN PLARGE_INTEGER ReadOffset
,
487 IN BOOLEAN Override
);
489 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
490 IN PLARGE_INTEGER ReadOffset
,
492 IN ULONG BufferOffset
,
495 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
496 IN PLARGE_INTEGER WriteOffset
,
497 IN ULONG WriteLength
,
498 IN ULONG BufferOffset
,
501 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
503 IN PVOID InputBuffer
,
504 IN ULONG InputBufferSize
,
505 IN OUT PVOID OutputBuffer
,
506 IN OUT PULONG pOutputBufferSize
,
507 IN BOOLEAN Override
);
509 /* ----------------------------------------------------------- dir.c */
511 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
513 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
516 PLARGE_INTEGER SystemTime
);
518 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
519 PLARGE_INTEGER SystemTime
,
523 /* -------------------------------------------------------- create.c */
525 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
527 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
529 PUNICODE_STRING FileToFindU
,
530 PVFAT_DIRENTRY_CONTEXT DirContext
,
533 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
534 PUNICODE_STRING NameU
);
536 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
539 /* --------------------------------------------------------- close.c */
541 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
543 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
544 PFILE_OBJECT FileObject
);
546 /* ------------------------------------------------------- cleanup.c */
548 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
550 /* --------------------------------------------------------- fastio.c */
553 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
556 VfatAcquireForLazyWrite(IN PVOID Context
,
560 VfatReleaseFromLazyWrite(IN PVOID Context
);
563 VfatAcquireForReadAhead(IN PVOID Context
,
567 VfatReleaseFromReadAhead(IN PVOID Context
);
569 /* --------------------------------------------------------- fsctl.c */
571 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
573 /* --------------------------------------------------------- finfo.c */
575 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
577 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
580 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
582 PDEVICE_EXTENSION DeviceExt
,
583 PLARGE_INTEGER AllocationSize
);
585 /* --------------------------------------------------------- iface.c */
587 NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject
,
588 PUNICODE_STRING RegistryPath
);
590 /* --------------------------------------------------------- dirwr.c */
592 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
593 PUNICODE_STRING PathNameU
,
596 ULONG RequestedOptions
,
599 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
601 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
604 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
609 /* -------------------------------------------------------- string.c */
612 vfatSplitPathName(PUNICODE_STRING PathNameU
,
613 PUNICODE_STRING DirNameU
,
614 PUNICODE_STRING FileNameU
);
616 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
618 BOOLEAN
wstrcmpjoki (PWSTR s1
,
621 /* ----------------------------------------------------------- fat.c */
623 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
624 ULONG CurrentCluster
,
627 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
630 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
631 ULONG ClusterToWrite
,
635 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
636 ULONG CurrentCluster
,
639 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
642 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
643 ULONG ClusterToWrite
,
647 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
648 ULONG CurrentCluster
,
651 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
654 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
655 ULONG ClusterToWrite
,
659 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
665 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
668 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
669 ULONG CurrentCluster
,
672 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
673 ULONG CurrentCluster
,
676 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
677 PLARGE_INTEGER Clusters
);
680 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
681 ULONG ClusterToWrite
,
684 /* ------------------------------------------------------ direntry.c */
686 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
687 PDIR_ENTRY pDirEntry
);
689 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
691 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
694 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
697 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
700 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
703 /* ----------------------------------------------------------- fcb.c */
705 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
706 PUNICODE_STRING pFileNameU
);
708 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
710 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
712 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
715 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
718 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
721 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
722 PUNICODE_STRING pFileNameU
);
724 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
726 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
728 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
730 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
732 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
734 PFILE_OBJECT fileObject
);
736 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
738 PUNICODE_STRING FileToFindU
,
741 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
742 PVFATFCB
*pParentFCB
,
744 PUNICODE_STRING pFileNameU
);
746 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
747 PVFATFCB directoryFCB
,
748 PVFAT_DIRENTRY_CONTEXT DirContext
,
751 /* ------------------------------------------------------------ rw.c */
753 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
755 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
757 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
759 PULONG CurrentCluster
,
762 /* ----------------------------------------------------------- misc.c */
764 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
766 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
769 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
771 DRIVER_DISPATCH VfatBuildRequest
;
772 NTSTATUS NTAPI
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
775 PVOID
VfatGetUserBuffer(IN PIRP
);
777 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
781 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
784 /* ------------------------------------------------------------- flush.c */
786 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
788 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);