7 #define USE_ROS_CC_AND_FS
9 #define ROUND_DOWN(n, align) \
10 (((ULONG)n) & ~((align) - 1l))
12 #define ROUND_UP(n, align) \
13 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
18 unsigned char magic0
, res0
, magic1
;
19 unsigned char OEMName
[8];
20 unsigned short BytesPerSector
;
21 unsigned char SectorsPerCluster
;
22 unsigned short ReservedSectors
;
23 unsigned char FATCount
;
24 unsigned short RootEntries
, Sectors
;
26 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
27 unsigned long HiddenSectors
, SectorsHuge
;
28 unsigned char Drive
, Res1
, Sig
;
29 unsigned long VolumeID
;
30 unsigned char VolumeLabel
[11], SysType
[8];
31 unsigned char Res2
[448];
32 unsigned short Signatur1
;
37 unsigned char magic0
, res0
, magic1
; // 0
38 unsigned char OEMName
[8]; // 3
39 unsigned short BytesPerSector
; // 11
40 unsigned char SectorsPerCluster
; // 13
41 unsigned short ReservedSectors
; // 14
42 unsigned char FATCount
; // 16
43 unsigned short RootEntries
, Sectors
; // 17
44 unsigned char Media
; // 21
45 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
46 unsigned long HiddenSectors
, SectorsHuge
; // 28
47 unsigned long FATSectors32
; // 36
48 unsigned short ExtFlag
; // 40
49 unsigned short FSVersion
; // 42
50 unsigned long RootCluster
; // 44
51 unsigned short FSInfoSector
; // 48
52 unsigned short BootBackup
; // 50
53 unsigned char Res3
[12]; // 52
54 unsigned char Drive
; // 64
55 unsigned char Res4
; // 65
56 unsigned char ExtBootSignature
; // 66
57 unsigned long VolumeID
; // 67
58 unsigned char VolumeLabel
[11], SysType
[8]; // 71
59 unsigned char Res2
[420]; // 90
60 unsigned short Signature1
; // 510
63 struct _BootSectorFatX
65 unsigned char SysType
[4]; // 0
66 unsigned long VolumeID
; // 4
67 unsigned long SectorsPerCluster
; // 8
68 unsigned short FATCount
; // 12
69 unsigned long Unknown
; // 14
70 unsigned char Unused
[4078]; // 18
75 unsigned long ExtBootSignature2
; // 0
76 unsigned char Res6
[480]; // 4
77 unsigned long FSINFOSignature
; // 484
78 unsigned long FreeCluster
; // 488
79 unsigned long NextCluster
; // 492
80 unsigned char Res7
[12]; // 496
81 unsigned long Signatur2
; // 508
84 typedef struct _BootSector BootSector
;
90 struct { unsigned char Filename
[8], Ext
[3]; };
91 unsigned char ShortName
[11];
95 unsigned char CreationTimeMs
;
96 unsigned short CreationTime
,CreationDate
,AccessDate
;
99 unsigned short FirstClusterHigh
; // FAT32
100 unsigned short ExtendedAttributes
; // FAT12/FAT16
102 unsigned short UpdateTime
; //time create/update
103 unsigned short UpdateDate
; //date create/update
104 unsigned short FirstCluster
;
105 unsigned long FileSize
;
108 #define FAT_EAFILE "EA DATA. SF"
110 typedef struct _EAFileHeader FAT_EA_FILE_HEADER
, *PFAT_EA_FILE_HEADER
;
114 unsigned short Signature
; // ED
115 unsigned short Unknown
[15];
116 unsigned short EASetTable
[240];
119 typedef struct _EASetHeader FAT_EA_SET_HEADER
, *PFAT_EA_SET_HEADER
;
123 unsigned short Signature
; // EA
124 unsigned short Offset
; // relative offset, same value as in the EASetTable
125 unsigned short Unknown1
[2];
126 char TargetFileName
[12];
127 unsigned short Unknown2
[3];
128 unsigned int EALength
;
132 typedef struct _EAHeader FAT_EA_HEADER
, *PFAT_EA_HEADER
;
136 unsigned char Unknown
;
137 unsigned char EANameLength
;
138 unsigned short EAValueLength
;
143 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
147 unsigned char FilenameLength
; // 0
148 unsigned char Attrib
; // 1
149 unsigned char Filename
[42]; // 2
150 unsigned long FirstCluster
; // 44
151 unsigned long FileSize
; // 48
152 unsigned short UpdateTime
; // 52
153 unsigned short UpdateDate
; // 54
154 unsigned short CreationTime
; // 56
155 unsigned short CreationDate
; // 58
156 unsigned short AccessTime
; // 60
157 unsigned short AccessDate
; // 62
162 unsigned char id
; // sequence number for slot
163 WCHAR name0_4
[5]; // first 5 characters in name
164 unsigned char attr
; // attribute byte
165 unsigned char reserved
; // always 0
166 unsigned char alias_checksum
; // checksum for 8.3 alias
167 WCHAR name5_10
[6]; // 6 more characters in name
168 unsigned char start
[2]; // starting cluster number
169 WCHAR name11_12
[2]; // last 2 characters in name
172 typedef struct _slot slot
;
176 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
177 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
179 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
181 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
182 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
183 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
185 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
186 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
187 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
188 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
190 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
191 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
192 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
193 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
195 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
196 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
198 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
206 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
208 #define BLOCKSIZE 512
216 #define VCB_VOLUME_LOCKED 0x0001
217 #define VCB_DISMOUNT_PENDING 0x0002
218 #define VCB_IS_FATX 0x0004
219 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
220 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
228 ULONG rootDirectorySectors
;
232 ULONG SectorsPerCluster
;
233 ULONG BytesPerSector
;
234 ULONG BytesPerCluster
;
235 ULONG NumberOfClusters
;
239 } FATINFO
, *PFATINFO
;
242 struct _VFAT_DIRENTRY_CONTEXT
;
244 typedef struct _HASHENTRY
247 struct _VFATFCB
* self
;
248 struct _HASHENTRY
* next
;
252 #define FCB_HASH_TABLE_SIZE 65536
254 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
256 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
257 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
258 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
260 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
262 typedef struct DEVICE_EXTENSION
264 ERESOURCE DirResource
;
265 ERESOURCE FatResource
;
267 KSPIN_LOCK FcbListLock
;
268 LIST_ENTRY FcbListHead
;
270 struct _HASHENTRY
** FcbHashTable
;
272 PDEVICE_OBJECT StorageDevice
;
273 PFILE_OBJECT FATFileObject
;
275 ULONG LastAvailableCluster
;
276 ULONG AvailableClusters
;
277 BOOLEAN AvailableClustersValid
;
279 struct _VFATFCB
* VolumeFcb
;
281 /* Pointers to functions for manipulating FAT. */
282 PGET_NEXT_CLUSTER GetNextCluster
;
283 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
284 PWRITE_CLUSTER WriteCluster
;
285 ULONG CleanShutBitMask
;
287 /* Pointers to functions for manipulating directory entries. */
288 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
292 LIST_ENTRY VolumeListEntry
;
293 } DEVICE_EXTENSION
, VCB
, *PVCB
;
297 PDRIVER_OBJECT DriverObject
;
298 PDEVICE_OBJECT DeviceObject
;
300 ERESOURCE VolumeListLock
;
301 LIST_ENTRY VolumeListHead
;
302 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
303 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
304 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
305 FAST_IO_DISPATCH FastIoDispatch
;
306 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
307 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
309 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
311 #define FCB_CACHE_INITIALIZED 0x0001
312 #define FCB_DELETE_PENDING 0x0002
313 #define FCB_IS_FAT 0x0004
314 #define FCB_IS_PAGE_FILE 0x0008
315 #define FCB_IS_VOLUME 0x0010
316 #define FCB_IS_DIRTY 0x0020
317 #define FCB_IS_FATX_ENTRY 0x0040
319 typedef struct _VFATFCB
321 /* FCB header required by ROS/NT */
322 FSRTL_COMMON_FCB_HEADER RFCB
;
323 SECTION_OBJECT_POINTERS SectionObjectPointers
;
324 ERESOURCE MainResource
;
325 ERESOURCE PagingIoResource
;
326 /* end FCB header required by ROS/NT */
328 /* directory entry for this file or directory */
331 /* Pointer to attributes in entry */
334 /* long file name, points into PathNameBuffer */
335 UNICODE_STRING LongNameU
;
337 /* short file name */
338 UNICODE_STRING ShortNameU
;
340 /* directory name, points into PathNameBuffer */
341 UNICODE_STRING DirNameU
;
343 /* path + long file name 260 max*/
344 UNICODE_STRING PathNameU
;
346 /* buffer for PathNameU */
347 PWCHAR PathNameBuffer
;
349 /* buffer for ShortNameU */
350 WCHAR ShortNameBuffer
[13];
355 /* List of FCB's for this volume */
356 LIST_ENTRY FcbListEntry
;
358 /* pointer to the parent fcb */
359 struct _VFATFCB
* parentFcb
;
361 /* Flags for the fcb */
364 /* pointer to the file object which has initialized the fcb */
365 PFILE_OBJECT FileObject
;
367 /* Directory index for the short name entry */
370 /* Directory index where the long name starts */
373 /* Share access for the file object */
374 SHARE_ACCESS FCBShareAccess
;
376 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
377 ULONG OpenHandleCount
;
379 /* Entry into the hash table for the path + long name */
382 /* Entry into the hash table for the path + short name */
385 /* List of byte-range locks for this file */
389 * Optimalization: caching of last read/write cluster+offset pair. Can't
390 * be in VFATCCB because it must be reset everytime the allocated clusters
393 FAST_MUTEX LastMutex
;
396 } VFATFCB
, *PVFATFCB
;
398 typedef struct _VFATCCB
400 LARGE_INTEGER CurrentByteOffset
;
401 /* for DirectoryControl */
403 /* for DirectoryControl */
404 UNICODE_STRING SearchPattern
;
405 } VFATCCB
, *PVFATCCB
;
408 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
411 #define TAG_CCB TAG('V', 'C', 'C', 'B')
412 #define TAG_FCB TAG('V', 'F', 'C', 'B')
413 #define TAG_IRP TAG('V', 'I', 'R', 'P')
414 #define TAG_VFAT TAG('V', 'F', 'A', 'T')
416 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
418 typedef struct __DOSTIME
426 typedef struct __DOSDATE
434 #define IRPCONTEXT_CANWAIT 0x0001
435 #define IRPCONTEXT_PENDINGRETURNED 0x0002
440 PDEVICE_OBJECT DeviceObject
;
441 PDEVICE_EXTENSION DeviceExt
;
443 WORK_QUEUE_ITEM WorkQueueItem
;
444 PIO_STACK_LOCATION Stack
;
447 PFILE_OBJECT FileObject
;
450 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
452 typedef struct _VFAT_DIRENTRY_CONTEXT
457 UNICODE_STRING LongNameU
;
458 UNICODE_STRING ShortNameU
;
459 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
462 /* ------------------------------------------------------ shutdown.c */
464 DRIVER_DISPATCH VfatShutdown
;
465 NTSTATUS NTAPI
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
468 /* -------------------------------------------------------- volume.c */
470 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
472 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
474 /* ------------------------------------------------------ blockdev.c */
476 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
477 IN PLARGE_INTEGER ReadOffset
,
480 IN BOOLEAN Override
);
482 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
483 IN PLARGE_INTEGER ReadOffset
,
485 IN ULONG BufferOffset
,
488 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
489 IN PLARGE_INTEGER WriteOffset
,
490 IN ULONG WriteLength
,
491 IN ULONG BufferOffset
,
494 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
496 IN PVOID InputBuffer
,
497 IN ULONG InputBufferSize
,
498 IN OUT PVOID OutputBuffer
,
499 IN OUT PULONG pOutputBufferSize
,
500 IN BOOLEAN Override
);
502 /* ----------------------------------------------------------- dir.c */
504 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
506 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
509 PLARGE_INTEGER SystemTime
);
511 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
512 PLARGE_INTEGER SystemTime
,
516 /* -------------------------------------------------------- create.c */
518 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
520 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
522 PUNICODE_STRING FileToFindU
,
523 PVFAT_DIRENTRY_CONTEXT DirContext
,
526 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
527 PUNICODE_STRING NameU
);
529 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
532 /* --------------------------------------------------------- close.c */
534 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
536 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
537 PFILE_OBJECT FileObject
);
539 /* ------------------------------------------------------- cleanup.c */
541 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
543 /* --------------------------------------------------------- fastio.c */
546 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
549 VfatAcquireForLazyWrite(IN PVOID Context
,
553 VfatReleaseFromLazyWrite(IN PVOID Context
);
556 VfatAcquireForReadAhead(IN PVOID Context
,
560 VfatReleaseFromReadAhead(IN PVOID Context
);
562 /* --------------------------------------------------------- fsctl.c */
564 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
566 /* --------------------------------------------------------- finfo.c */
568 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
570 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
573 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
575 PDEVICE_EXTENSION DeviceExt
,
576 PLARGE_INTEGER AllocationSize
);
578 /* --------------------------------------------------------- iface.c */
580 NTSTATUS NTAPI
DriverEntry (PDRIVER_OBJECT DriverObject
,
581 PUNICODE_STRING RegistryPath
);
583 /* --------------------------------------------------------- dirwr.c */
585 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
586 PUNICODE_STRING PathNameU
,
589 ULONG RequestedOptions
,
592 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
594 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
597 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
602 /* -------------------------------------------------------- string.c */
605 vfatSplitPathName(PUNICODE_STRING PathNameU
,
606 PUNICODE_STRING DirNameU
,
607 PUNICODE_STRING FileNameU
);
609 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
611 BOOLEAN
wstrcmpjoki (PWSTR s1
,
614 /* ----------------------------------------------------------- fat.c */
616 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
617 ULONG CurrentCluster
,
620 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
623 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
624 ULONG ClusterToWrite
,
628 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
629 ULONG CurrentCluster
,
632 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
635 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
636 ULONG ClusterToWrite
,
640 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
641 ULONG CurrentCluster
,
644 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
647 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
648 ULONG ClusterToWrite
,
652 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
658 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
661 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
662 ULONG CurrentCluster
,
665 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
666 ULONG CurrentCluster
,
669 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
670 PLARGE_INTEGER Clusters
);
673 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
674 ULONG ClusterToWrite
,
677 /* ------------------------------------------------------ direntry.c */
679 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
680 PDIR_ENTRY pDirEntry
);
682 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
684 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
687 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
690 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
693 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
696 /* ----------------------------------------------------------- fcb.c */
698 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
699 PUNICODE_STRING pFileNameU
);
701 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
703 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
705 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
708 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
711 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
714 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
715 PUNICODE_STRING pFileNameU
);
717 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
719 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
721 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
723 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
725 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
727 PFILE_OBJECT fileObject
);
729 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
731 PUNICODE_STRING FileToFindU
,
734 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
735 PVFATFCB
*pParentFCB
,
737 PUNICODE_STRING pFileNameU
);
739 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
740 PVFATFCB directoryFCB
,
741 PVFAT_DIRENTRY_CONTEXT DirContext
,
744 /* ------------------------------------------------------------ rw.c */
746 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
748 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
750 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
752 PULONG CurrentCluster
,
755 /* ----------------------------------------------------------- misc.c */
757 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
759 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
762 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
764 DRIVER_DISPATCH VfatBuildRequest
;
765 NTSTATUS NTAPI
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
768 PVOID
VfatGetUserBuffer(IN PIRP
);
770 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
774 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
777 /* ------------------------------------------------------------- flush.c */
779 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
781 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);