4 #include <ddk/ntdddisk.h>
8 #define USE_ROS_CC_AND_FS
12 NTSTATUS NTAPI
RtlOemStringToUnicodeString(PUNICODE_STRING
, CONST STRING
*, BOOLEAN
);
13 NTSTATUS NTAPI
RtlDowncaseUnicodeString(PUNICODE_STRING
, PCUNICODE_STRING
, BOOLEAN
);
14 NTSTATUS NTAPI
RtlUnicodeStringToOemString(POEM_STRING
, PCUNICODE_STRING
, BOOLEAN
);
15 #undef DeleteFile /* FIXME */
16 #define VOLUME_IS_DIRTY 0x00000001 /* FIXME */
19 #ifdef USE_ROS_CC_AND_FS
20 NTSTATUS STDCALL
CcRosInitializeFileCache(PFILE_OBJECT
, ULONG
);
21 NTSTATUS STDCALL
CcRosReleaseFileCache(PFILE_OBJECT
);
22 #define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
23 typedef struct _ROS_QUERY_LCN_MAPPING
{ LARGE_INTEGER LcnDiskOffset
; } ROS_QUERY_LCN_MAPPING
, *PROS_QUERY_LCN_MAPPING
;
26 #define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
27 #define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
29 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
30 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
35 unsigned char magic0
, res0
, magic1
;
36 unsigned char OEMName
[8];
37 unsigned short BytesPerSector
;
38 unsigned char SectorsPerCluster
;
39 unsigned short ReservedSectors
;
40 unsigned char FATCount
;
41 unsigned short RootEntries
, Sectors
;
43 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
44 unsigned long HiddenSectors
, SectorsHuge
;
45 unsigned char Drive
, Res1
, Sig
;
46 unsigned long VolumeID
;
47 unsigned char VolumeLabel
[11], SysType
[8];
48 unsigned char Res2
[448];
49 unsigned short Signatur1
;
54 unsigned char magic0
, res0
, magic1
; // 0
55 unsigned char OEMName
[8]; // 3
56 unsigned short BytesPerSector
; // 11
57 unsigned char SectorsPerCluster
; // 13
58 unsigned short ReservedSectors
; // 14
59 unsigned char FATCount
; // 16
60 unsigned short RootEntries
, Sectors
; // 17
61 unsigned char Media
; // 21
62 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
63 unsigned long HiddenSectors
, SectorsHuge
; // 28
64 unsigned long FATSectors32
; // 36
65 unsigned short ExtFlag
; // 40
66 unsigned short FSVersion
; // 42
67 unsigned long RootCluster
; // 44
68 unsigned short FSInfoSector
; // 48
69 unsigned short BootBackup
; // 50
70 unsigned char Res3
[12]; // 52
71 unsigned char Drive
; // 64
72 unsigned char Res4
; // 65
73 unsigned char ExtBootSignature
; // 66
74 unsigned long VolumeID
; // 67
75 unsigned char VolumeLabel
[11], SysType
[8]; // 71
76 unsigned char Res2
[420]; // 90
77 unsigned short Signature1
; // 510
80 struct _BootSectorFatX
82 unsigned char SysType
[4]; // 0
83 unsigned long VolumeID
; // 4
84 unsigned long SectorsPerCluster
; // 8
85 unsigned short FATCount
; // 12
86 unsigned long Unknown
; // 14
87 unsigned char Unused
[4078]; // 18
92 unsigned long ExtBootSignature2
; // 0
93 unsigned char Res6
[480]; // 4
94 unsigned long FSINFOSignature
; // 484
95 unsigned long FreeCluster
; // 488
96 unsigned long NextCluster
; // 492
97 unsigned char Res7
[12]; // 496
98 unsigned long Signatur2
; // 508
101 typedef struct _BootSector BootSector
;
107 struct { unsigned char Filename
[8], Ext
[3]; };
108 unsigned char ShortName
[11];
110 unsigned char Attrib
;
112 unsigned char CreationTimeMs
;
113 unsigned short CreationTime
,CreationDate
,AccessDate
;
114 unsigned short FirstClusterHigh
; // higher
115 unsigned short UpdateTime
; //time create/update
116 unsigned short UpdateDate
; //date create/update
117 unsigned short FirstCluster
;
118 unsigned long FileSize
;
121 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
125 unsigned char FilenameLength
; // 0
126 unsigned char Attrib
; // 1
127 unsigned char Filename
[42]; // 2
128 unsigned long FirstCluster
; // 44
129 unsigned long FileSize
; // 48
130 unsigned short UpdateTime
; // 52
131 unsigned short UpdateDate
; // 54
132 unsigned short CreationTime
; // 56
133 unsigned short CreationDate
; // 58
134 unsigned short AccessTime
; // 60
135 unsigned short AccessDate
; // 62
140 unsigned char id
; // sequence number for slot
141 WCHAR name0_4
[5]; // first 5 characters in name
142 unsigned char attr
; // attribute byte
143 unsigned char reserved
; // always 0
144 unsigned char alias_checksum
; // checksum for 8.3 alias
145 WCHAR name5_10
[6]; // 6 more characters in name
146 unsigned char start
[2]; // starting cluster number
147 WCHAR name11_12
[2]; // last 2 characters in name
150 typedef struct _slot slot
;
154 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
155 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
157 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
159 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
160 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
161 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
163 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
164 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
165 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
166 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
168 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
169 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
170 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
171 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
173 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
174 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
176 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
184 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
186 #define BLOCKSIZE 512
194 #define VCB_VOLUME_LOCKED 0x0001
195 #define VCB_DISMOUNT_PENDING 0x0002
196 #define VCB_IS_FATX 0x0004
197 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
198 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
206 ULONG rootDirectorySectors
;
210 ULONG SectorsPerCluster
;
211 ULONG BytesPerSector
;
212 ULONG BytesPerCluster
;
213 ULONG NumberOfClusters
;
217 } FATINFO
, *PFATINFO
;
220 struct _VFAT_DIRENTRY_CONTEXT
;
222 typedef struct _HASHENTRY
225 struct _VFATFCB
* self
;
226 struct _HASHENTRY
* next
;
230 #define FCB_HASH_TABLE_SIZE 65536
232 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
234 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
235 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
236 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
238 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
240 typedef struct DEVICE_EXTENSION
242 ERESOURCE DirResource
;
243 ERESOURCE FatResource
;
245 KSPIN_LOCK FcbListLock
;
246 LIST_ENTRY FcbListHead
;
248 struct _HASHENTRY
** FcbHashTable
;
250 PDEVICE_OBJECT StorageDevice
;
251 PFILE_OBJECT FATFileObject
;
253 ULONG LastAvailableCluster
;
254 ULONG AvailableClusters
;
255 BOOLEAN AvailableClustersValid
;
257 struct _VFATFCB
* VolumeFcb
;
259 /* Pointers to functions for manipulating FAT. */
260 PGET_NEXT_CLUSTER GetNextCluster
;
261 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
262 PWRITE_CLUSTER WriteCluster
;
263 ULONG CleanShutBitMask
;
265 /* Pointers to functions for manipulating directory entries. */
266 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
270 LIST_ENTRY VolumeListEntry
;
271 } DEVICE_EXTENSION
, VCB
, *PVCB
;
275 PDRIVER_OBJECT DriverObject
;
276 PDEVICE_OBJECT DeviceObject
;
278 ERESOURCE VolumeListLock
;
279 LIST_ENTRY VolumeListHead
;
280 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
281 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
282 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
283 FAST_IO_DISPATCH FastIoDispatch
;
284 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
285 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
287 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
289 #define FCB_CACHE_INITIALIZED 0x0001
290 #define FCB_DELETE_PENDING 0x0002
291 #define FCB_IS_FAT 0x0004
292 #define FCB_IS_PAGE_FILE 0x0008
293 #define FCB_IS_VOLUME 0x0010
294 #define FCB_IS_DIRTY 0x0020
295 #define FCB_IS_FATX_ENTRY 0x0040
297 typedef struct _VFATFCB
299 /* FCB header required by ROS/NT */
300 FSRTL_COMMON_FCB_HEADER RFCB
;
301 SECTION_OBJECT_POINTERS SectionObjectPointers
;
302 ERESOURCE MainResource
;
303 ERESOURCE PagingIoResource
;
304 /* end FCB header required by ROS/NT */
306 /* directory entry for this file or directory */
309 /* Pointer to attributes in entry */
312 /* long file name, points into PathNameBuffer */
313 UNICODE_STRING LongNameU
;
315 /* short file name */
316 UNICODE_STRING ShortNameU
;
318 /* directory name, points into PathNameBuffer */
319 UNICODE_STRING DirNameU
;
321 /* path + long file name 260 max*/
322 UNICODE_STRING PathNameU
;
324 /* buffer for PathNameU */
325 PWCHAR PathNameBuffer
;
327 /* buffer for ShortNameU */
328 WCHAR ShortNameBuffer
[13];
333 /* List of FCB's for this volume */
334 LIST_ENTRY FcbListEntry
;
336 /* pointer to the parent fcb */
337 struct _VFATFCB
* parentFcb
;
339 /* Flags for the fcb */
342 /* pointer to the file object which has initialized the fcb */
343 PFILE_OBJECT FileObject
;
345 /* Directory index for the short name entry */
348 /* Directory index where the long name starts */
351 /* Share access for the file object */
352 SHARE_ACCESS FCBShareAccess
;
354 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
355 ULONG OpenHandleCount
;
357 /* Entry into the hash table for the path + long name */
360 /* Entry into the hash table for the path + short name */
363 /* List of byte-range locks for this file */
367 * Optimalization: caching of last read/write cluster+offset pair. Can't
368 * be in VFATCCB because it must be reset everytime the allocated clusters
371 FAST_MUTEX LastMutex
;
374 } VFATFCB
, *PVFATFCB
;
376 typedef struct _VFATCCB
378 LARGE_INTEGER CurrentByteOffset
;
379 /* for DirectoryControl */
381 /* for DirectoryControl */
382 UNICODE_STRING SearchPattern
;
383 } VFATCCB
, *PVFATCCB
;
386 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
389 #define TAG_CCB TAG('V', 'C', 'C', 'B')
390 #define TAG_FCB TAG('V', 'F', 'C', 'B')
391 #define TAG_IRP TAG('V', 'I', 'R', 'P')
393 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
395 typedef struct __DOSTIME
403 typedef struct __DOSDATE
411 #define IRPCONTEXT_CANWAIT 0x0001
412 #define IRPCONTEXT_PENDINGRETURNED 0x0002
417 PDEVICE_OBJECT DeviceObject
;
418 PDEVICE_EXTENSION DeviceExt
;
420 WORK_QUEUE_ITEM WorkQueueItem
;
421 PIO_STACK_LOCATION Stack
;
424 PFILE_OBJECT FileObject
;
427 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
429 typedef struct _VFAT_DIRENTRY_CONTEXT
434 UNICODE_STRING LongNameU
;
435 UNICODE_STRING ShortNameU
;
436 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
439 /* ------------------------------------------------------ shutdown.c */
441 NTSTATUS STDCALL
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
444 /* -------------------------------------------------------- volume.c */
446 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
448 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
450 /* ------------------------------------------------------ blockdev.c */
452 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
453 IN PLARGE_INTEGER ReadOffset
,
456 IN BOOLEAN Override
);
458 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
459 IN PLARGE_INTEGER ReadOffset
,
461 IN ULONG BufferOffset
,
464 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
465 IN PLARGE_INTEGER WriteOffset
,
466 IN ULONG WriteLength
,
467 IN ULONG BufferOffset
,
470 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
472 IN PVOID InputBuffer
,
473 IN ULONG InputBufferSize
,
474 IN OUT PVOID OutputBuffer
,
475 IN OUT PULONG pOutputBufferSize
,
476 IN BOOLEAN Override
);
478 /* ----------------------------------------------------------- dir.c */
480 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
482 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
485 PLARGE_INTEGER SystemTime
);
487 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
488 PLARGE_INTEGER SystemTime
,
492 /* -------------------------------------------------------- create.c */
494 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
496 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
497 PFILE_OBJECT FileObject
,
498 PVFATFCB
* parentFcb
);
500 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
502 PUNICODE_STRING FileToFindU
,
503 PVFAT_DIRENTRY_CONTEXT DirContext
,
506 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
507 PUNICODE_STRING NameU
);
509 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
512 /* --------------------------------------------------------- close.c */
514 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
516 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
517 PFILE_OBJECT FileObject
);
519 /* ------------------------------------------------------- cleanup.c */
521 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
523 /* --------------------------------------------------------- fastio.c */
526 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
);
529 VfatAcquireForLazyWrite(IN PVOID Context
,
533 VfatReleaseFromLazyWrite(IN PVOID Context
);
536 VfatAcquireForReadAhead(IN PVOID Context
,
540 VfatReleaseFromReadAhead(IN PVOID Context
);
542 /* --------------------------------------------------------- fsctl.c */
544 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
546 /* --------------------------------------------------------- finfo.c */
548 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
550 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
553 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
555 PDEVICE_EXTENSION DeviceExt
,
556 PLARGE_INTEGER AllocationSize
);
558 /* --------------------------------------------------------- iface.c */
560 NTSTATUS STDCALL
DriverEntry (PDRIVER_OBJECT DriverObject
,
561 PUNICODE_STRING RegistryPath
);
563 /* --------------------------------------------------------- dirwr.c */
565 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
566 PUNICODE_STRING PathNameU
,
569 ULONG RequestedOptions
,
572 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
574 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
577 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
582 /* -------------------------------------------------------- string.c */
585 vfatSplitPathName(PUNICODE_STRING PathNameU
,
586 PUNICODE_STRING DirNameU
,
587 PUNICODE_STRING FileNameU
);
589 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
591 BOOLEAN
wstrcmpjoki (PWSTR s1
,
594 /* ----------------------------------------------------------- fat.c */
596 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
597 ULONG CurrentCluster
,
600 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
603 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
604 ULONG ClusterToWrite
,
608 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
609 ULONG CurrentCluster
,
612 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
615 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
616 ULONG ClusterToWrite
,
620 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
621 ULONG CurrentCluster
,
624 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
627 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
628 ULONG ClusterToWrite
,
632 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
638 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
641 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
642 ULONG CurrentCluster
,
645 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
646 ULONG CurrentCluster
,
649 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
650 PLARGE_INTEGER Clusters
);
653 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
654 ULONG ClusterToWrite
,
657 /* ------------------------------------------------------ direntry.c */
659 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
660 PDIR_ENTRY pDirEntry
);
662 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
664 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
667 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
670 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
673 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
676 /* ----------------------------------------------------------- fcb.c */
678 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
679 PUNICODE_STRING pFileNameU
);
681 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
683 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
685 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
688 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
691 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
694 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
695 PUNICODE_STRING pFileNameU
);
697 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
699 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
701 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
703 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
705 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
707 PFILE_OBJECT fileObject
);
709 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
711 PUNICODE_STRING FileToFindU
,
714 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
715 PVFATFCB
*pParentFCB
,
717 PUNICODE_STRING pFileNameU
);
719 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
720 PVFATFCB directoryFCB
,
721 PVFAT_DIRENTRY_CONTEXT DirContext
,
724 /* ------------------------------------------------------------ rw.c */
726 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
728 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
730 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
732 PULONG CurrentCluster
,
735 /* ----------------------------------------------------------- misc.c */
737 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
739 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
742 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
744 NTSTATUS STDCALL
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
747 PVOID
VfatGetUserBuffer(IN PIRP
);
749 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
753 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
756 /* ------------------------------------------------------------- flush.c */
758 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
760 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);