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 */
18 #ifdef USE_ROS_CC_AND_FS
19 NTSTATUS STDCALL
CcRosInitializeFileCache(PFILE_OBJECT
, ULONG
);
20 NTSTATUS STDCALL
CcRosReleaseFileCache(PFILE_OBJECT
);
21 #define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
22 typedef struct _ROS_QUERY_LCN_MAPPING
{ LARGE_INTEGER LcnDiskOffset
; } ROS_QUERY_LCN_MAPPING
, *PROS_QUERY_LCN_MAPPING
;
25 #define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
26 #define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
28 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
29 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
33 unsigned char magic0
, res0
, magic1
;
34 unsigned char OEMName
[8];
35 unsigned short BytesPerSector
;
36 unsigned char SectorsPerCluster
;
37 unsigned short ReservedSectors
;
38 unsigned char FATCount
;
39 unsigned short RootEntries
, Sectors
;
41 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
42 unsigned long HiddenSectors
, SectorsHuge
;
43 unsigned char Drive
, Res1
, Sig
;
44 unsigned long VolumeID
;
45 unsigned char VolumeLabel
[11], SysType
[8];
46 unsigned char Res2
[448];
47 unsigned short Signatur1
;
48 } __attribute__((packed
));
52 unsigned char magic0
, res0
, magic1
; // 0
53 unsigned char OEMName
[8]; // 3
54 unsigned short BytesPerSector
; // 11
55 unsigned char SectorsPerCluster
; // 13
56 unsigned short ReservedSectors
; // 14
57 unsigned char FATCount
; // 16
58 unsigned short RootEntries
, Sectors
; // 17
59 unsigned char Media
; // 21
60 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
61 unsigned long HiddenSectors
, SectorsHuge
; // 28
62 unsigned long FATSectors32
; // 36
63 unsigned short ExtFlag
; // 40
64 unsigned short FSVersion
; // 42
65 unsigned long RootCluster
; // 44
66 unsigned short FSInfoSector
; // 48
67 unsigned short BootBackup
; // 50
68 unsigned char Res3
[12]; // 52
69 unsigned char Drive
; // 64
70 unsigned char Res4
; // 65
71 unsigned char ExtBootSignature
; // 66
72 unsigned long VolumeID
; // 67
73 unsigned char VolumeLabel
[11], SysType
[8]; // 71
74 unsigned char Res2
[420]; // 90
75 unsigned short Signature1
; // 510
76 } __attribute__((packed
));
78 struct _BootSectorFatX
80 unsigned char SysType
[4]; // 0
81 unsigned long VolumeID
; // 4
82 unsigned long SectorsPerCluster
; // 8
83 unsigned short FATCount
; // 12
84 unsigned long Unknown
; // 14
85 unsigned char Unused
[4078]; // 18
86 } __attribute__((packed
));
90 unsigned long ExtBootSignature2
; // 0
91 unsigned char Res6
[480]; // 4
92 unsigned long FSINFOSignature
; // 484
93 unsigned long FreeCluster
; // 488
94 unsigned long NextCluster
; // 492
95 unsigned char Res7
[12]; // 496
96 unsigned long Signatur2
; // 508
97 } __attribute__((packed
));
99 typedef struct _BootSector BootSector
;
101 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
102 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
104 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
106 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
107 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
108 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
110 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
111 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
112 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
113 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
115 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
116 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
117 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
118 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
120 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
121 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
125 unsigned char Filename
[8], Ext
[3];
126 unsigned char Attrib
;
128 unsigned char CreationTimeMs
;
129 unsigned short CreationTime
,CreationDate
,AccessDate
;
130 unsigned short FirstClusterHigh
; // higher
131 unsigned short UpdateTime
; //time create/update
132 unsigned short UpdateDate
; //date create/update
133 unsigned short FirstCluster
;
134 unsigned long FileSize
;
135 } __attribute__((packed
));
137 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
141 unsigned char FilenameLength
; // 0
142 unsigned char Attrib
; // 1
143 unsigned char Filename
[42]; // 2
144 unsigned long FirstCluster
; // 44
145 unsigned long FileSize
; // 48
146 unsigned short UpdateTime
; // 52
147 unsigned short UpdateDate
; // 54
148 unsigned short CreationTime
; // 56
149 unsigned short CreationDate
; // 58
150 unsigned short AccessTime
; // 60
151 unsigned short AccessDate
; // 62
152 } __attribute__((packed
));
154 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
162 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
166 unsigned char id
; // sequence number for slot
167 WCHAR name0_4
[5]; // first 5 characters in name
168 unsigned char attr
; // attribute byte
169 unsigned char reserved
; // always 0
170 unsigned char alias_checksum
; // checksum for 8.3 alias
171 WCHAR name5_10
[6]; // 6 more characters in name
172 unsigned char start
[2]; // starting cluster number
173 WCHAR name11_12
[2]; // last 2 characters in name
174 } __attribute__((packed
));
177 typedef struct _slot slot
;
179 #define BLOCKSIZE 512
187 #define VCB_VOLUME_LOCKED 0x0001
188 #define VCB_DISMOUNT_PENDING 0x0002
189 #define VCB_IS_FATX 0x0004
197 ULONG rootDirectorySectors
;
201 ULONG SectorsPerCluster
;
202 ULONG BytesPerSector
;
203 ULONG BytesPerCluster
;
204 ULONG NumberOfClusters
;
208 } FATINFO
, *PFATINFO
;
211 struct _VFAT_DIRENTRY_CONTEXT
;
213 typedef struct _HASHENTRY
216 struct _VFATFCB
* self
;
217 struct _HASHENTRY
* next
;
221 #define FCB_HASH_TABLE_SIZE 65536
223 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
225 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
226 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
227 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
229 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
231 typedef struct DEVICE_EXTENSION
233 ERESOURCE DirResource
;
234 ERESOURCE FatResource
;
236 KSPIN_LOCK FcbListLock
;
237 LIST_ENTRY FcbListHead
;
238 struct _HASHENTRY
* FcbHashTable
[FCB_HASH_TABLE_SIZE
];
240 PDEVICE_OBJECT StorageDevice
;
241 PFILE_OBJECT FATFileObject
;
243 ULONG LastAvailableCluster
;
244 ULONG AvailableClusters
;
245 BOOLEAN AvailableClustersValid
;
247 struct _VFATFCB
* VolumeFcb
;
249 /* Pointers to functions for manipulating FAT. */
250 PGET_NEXT_CLUSTER GetNextCluster
;
251 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
252 PWRITE_CLUSTER WriteCluster
;
254 /* Pointers to functions for manipulating directory entries. */
255 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
259 LIST_ENTRY VolumeListEntry
;
260 } DEVICE_EXTENSION
, VCB
, *PVCB
;
264 PDRIVER_OBJECT DriverObject
;
265 PDEVICE_OBJECT DeviceObject
;
267 ERESOURCE VolumeListLock
;
268 LIST_ENTRY VolumeListHead
;
269 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
270 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
271 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
272 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
274 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
276 #define FCB_CACHE_INITIALIZED 0x0001
277 #define FCB_DELETE_PENDING 0x0002
278 #define FCB_IS_FAT 0x0004
279 #define FCB_IS_PAGE_FILE 0x0008
280 #define FCB_IS_VOLUME 0x0010
281 #define FCB_IS_DIRTY 0x0020
282 #define FCB_IS_FATX_ENTRY 0x0040
284 typedef struct _VFATFCB
286 /* FCB header required by ROS/NT */
287 FSRTL_COMMON_FCB_HEADER RFCB
;
288 SECTION_OBJECT_POINTERS SectionObjectPointers
;
289 ERESOURCE MainResource
;
290 ERESOURCE PagingIoResource
;
291 /* end FCB header required by ROS/NT */
293 /* directory entry for this file or directory */
296 /* Pointer to attributes in entry */
299 /* long file name, points into PathNameBuffer */
300 UNICODE_STRING LongNameU
;
302 /* short file name */
303 UNICODE_STRING ShortNameU
;
305 /* directory name, points into PathNameBuffer */
306 UNICODE_STRING DirNameU
;
308 /* path + long file name 260 max*/
309 UNICODE_STRING PathNameU
;
311 /* buffer for PathNameU */
312 PWCHAR PathNameBuffer
;
314 /* buffer for ShortNameU */
315 WCHAR ShortNameBuffer
[13];
320 /* List of FCB's for this volume */
321 LIST_ENTRY FcbListEntry
;
323 /* pointer to the parent fcb */
324 struct _VFATFCB
* parentFcb
;
326 /* Flags for the fcb */
329 /* pointer to the file object which has initialized the fcb */
330 PFILE_OBJECT FileObject
;
332 /* Directory index for the short name entry */
335 /* Directory index where the long name starts */
338 /* Share access for the file object */
339 SHARE_ACCESS FCBShareAccess
;
341 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
342 ULONG OpenHandleCount
;
344 /* Entry into the hash table for the path + long name */
347 /* Entry into the hash table for the path + short name */
350 /* List of byte-range locks for this file */
354 * Optimalization: caching of last read/write cluster+offset pair. Can't
355 * be in VFATCCB because it must be reset everytime the allocated clusters
358 FAST_MUTEX LastMutex
;
361 } VFATFCB
, *PVFATFCB
;
363 typedef struct _VFATCCB
365 LARGE_INTEGER CurrentByteOffset
;
366 /* for DirectoryControl */
368 /* for DirectoryControl */
369 UNICODE_STRING SearchPattern
;
370 } VFATCCB
, *PVFATCCB
;
373 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
376 #define TAG_CCB TAG('V', 'C', 'C', 'B')
377 #define TAG_FCB TAG('V', 'F', 'C', 'B')
378 #define TAG_IRP TAG('V', 'I', 'R', 'P')
380 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
382 typedef struct __DOSTIME
390 typedef struct __DOSDATE
398 #define IRPCONTEXT_CANWAIT 0x0001
399 #define IRPCONTEXT_PENDINGRETURNED 0x0002
404 PDEVICE_OBJECT DeviceObject
;
405 PDEVICE_EXTENSION DeviceExt
;
407 WORK_QUEUE_ITEM WorkQueueItem
;
408 PIO_STACK_LOCATION Stack
;
411 PFILE_OBJECT FileObject
;
414 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
416 typedef struct _VFAT_DIRENTRY_CONTEXT
421 UNICODE_STRING LongNameU
;
422 UNICODE_STRING ShortNameU
;
423 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
426 /* ------------------------------------------------------ shutdown.c */
428 NTSTATUS STDCALL
VfatShutdown (PDEVICE_OBJECT DeviceObject
,
431 /* -------------------------------------------------------- volume.c */
433 NTSTATUS
VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
435 NTSTATUS
VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext
);
437 /* ------------------------------------------------------ blockdev.c */
439 NTSTATUS
VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject
,
440 IN PLARGE_INTEGER ReadOffset
,
443 IN BOOLEAN Override
);
445 NTSTATUS
VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext
,
446 IN PLARGE_INTEGER ReadOffset
,
448 IN ULONG BufferOffset
,
451 NTSTATUS
VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext
,
452 IN PLARGE_INTEGER WriteOffset
,
453 IN ULONG WriteLength
,
454 IN ULONG BufferOffset
,
457 NTSTATUS
VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject
,
459 IN PVOID InputBuffer
,
460 IN ULONG InputBufferSize
,
461 IN OUT PVOID OutputBuffer
,
462 IN OUT PULONG pOutputBufferSize
,
463 IN BOOLEAN Override
);
465 /* ----------------------------------------------------------- dir.c */
467 NTSTATUS
VfatDirectoryControl (PVFAT_IRP_CONTEXT
);
469 BOOLEAN
FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt
,
472 PLARGE_INTEGER SystemTime
);
474 BOOLEAN
FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt
,
475 PLARGE_INTEGER SystemTime
,
479 /* -------------------------------------------------------- create.c */
481 NTSTATUS
VfatCreate (PVFAT_IRP_CONTEXT IrpContext
);
483 NTSTATUS
VfatOpenFile (PDEVICE_EXTENSION DeviceExt
,
484 PFILE_OBJECT FileObject
,
485 PVFATFCB
* parentFcb
);
487 NTSTATUS
FindFile (PDEVICE_EXTENSION DeviceExt
,
489 PUNICODE_STRING FileToFindU
,
490 PVFAT_DIRENTRY_CONTEXT DirContext
,
493 VOID
vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry
,
494 PUNICODE_STRING NameU
);
496 NTSTATUS
ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt
,
499 /* --------------------------------------------------------- close.c */
501 NTSTATUS
VfatClose (PVFAT_IRP_CONTEXT IrpContext
);
503 NTSTATUS
VfatCloseFile(PDEVICE_EXTENSION DeviceExt
,
504 PFILE_OBJECT FileObject
);
506 /* ------------------------------------------------------- cleanup.c */
508 NTSTATUS
VfatCleanup (PVFAT_IRP_CONTEXT IrpContext
);
510 /* --------------------------------------------------------- fsctl.c */
512 NTSTATUS
VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext
);
514 /* --------------------------------------------------------- finfo.c */
516 NTSTATUS
VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext
);
518 NTSTATUS
VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext
);
521 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject
,
523 PDEVICE_EXTENSION DeviceExt
,
524 PLARGE_INTEGER AllocationSize
);
526 /* --------------------------------------------------------- iface.c */
528 NTSTATUS STDCALL
DriverEntry (PDRIVER_OBJECT DriverObject
,
529 PUNICODE_STRING RegistryPath
);
531 /* --------------------------------------------------------- dirwr.c */
533 NTSTATUS
VfatAddEntry (PDEVICE_EXTENSION DeviceExt
,
534 PUNICODE_STRING PathNameU
,
537 ULONG RequestedOptions
,
540 NTSTATUS
VfatUpdateEntry (PVFATFCB pFcb
);
542 NTSTATUS
VfatDelEntry(PDEVICE_EXTENSION
, PVFATFCB
);
545 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt
,
550 /* -------------------------------------------------------- string.c */
553 vfatSplitPathName(PUNICODE_STRING PathNameU
,
554 PUNICODE_STRING DirNameU
,
555 PUNICODE_STRING FileNameU
);
557 BOOLEAN
vfatIsLongIllegal(WCHAR c
);
559 BOOLEAN
wstrcmpjoki (PWSTR s1
,
562 /* ----------------------------------------------------------- fat.c */
564 NTSTATUS
FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
565 ULONG CurrentCluster
,
568 NTSTATUS
FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
571 NTSTATUS
FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt
,
572 ULONG ClusterToWrite
,
576 NTSTATUS
FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
577 ULONG CurrentCluster
,
580 NTSTATUS
FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
583 NTSTATUS
FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt
,
584 ULONG ClusterToWrite
,
588 NTSTATUS
FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt
,
589 ULONG CurrentCluster
,
592 NTSTATUS
FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt
,
595 NTSTATUS
FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt
,
596 ULONG ClusterToWrite
,
600 NTSTATUS
OffsetToCluster (PDEVICE_EXTENSION DeviceExt
,
606 ULONGLONG
ClusterToSector (PDEVICE_EXTENSION DeviceExt
,
609 NTSTATUS
GetNextCluster (PDEVICE_EXTENSION DeviceExt
,
610 ULONG CurrentCluster
,
613 NTSTATUS
GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt
,
614 ULONG CurrentCluster
,
617 NTSTATUS
CountAvailableClusters (PDEVICE_EXTENSION DeviceExt
,
618 PLARGE_INTEGER Clusters
);
621 WriteCluster(PDEVICE_EXTENSION DeviceExt
,
622 ULONG ClusterToWrite
,
625 /* ------------------------------------------------------ direntry.c */
627 ULONG
vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt
,
628 PDIR_ENTRY pDirEntry
);
630 BOOLEAN
VfatIsDirectoryEmpty(PVFATFCB Fcb
);
632 NTSTATUS
FATGetNextDirEntry(PVOID
* pContext
,
635 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
638 NTSTATUS
FATXGetNextDirEntry(PVOID
* pContext
,
641 IN PVFAT_DIRENTRY_CONTEXT DirContext
,
644 /* ----------------------------------------------------------- fcb.c */
646 PVFATFCB
vfatNewFCB (PDEVICE_EXTENSION pVCB
,
647 PUNICODE_STRING pFileNameU
);
649 VOID
vfatDestroyFCB (PVFATFCB pFCB
);
651 VOID
vfatDestroyCCB(PVFATCCB pCcb
);
653 VOID
vfatGrabFCB (PDEVICE_EXTENSION pVCB
,
656 VOID
vfatReleaseFCB (PDEVICE_EXTENSION pVCB
,
659 VOID
vfatAddFCBToTable (PDEVICE_EXTENSION pVCB
,
662 PVFATFCB
vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt
,
663 PUNICODE_STRING pFileNameU
);
665 PVFATFCB
vfatMakeRootFCB (PDEVICE_EXTENSION pVCB
);
667 PVFATFCB
vfatOpenRootFCB (PDEVICE_EXTENSION pVCB
);
669 BOOLEAN
vfatFCBIsDirectory (PVFATFCB FCB
);
671 BOOLEAN
vfatFCBIsRoot(PVFATFCB FCB
);
673 NTSTATUS
vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb
,
675 PFILE_OBJECT fileObject
);
677 NTSTATUS
vfatDirFindFile (PDEVICE_EXTENSION pVCB
,
679 PUNICODE_STRING FileToFindU
,
682 NTSTATUS
vfatGetFCBForFile (PDEVICE_EXTENSION pVCB
,
683 PVFATFCB
*pParentFCB
,
685 PUNICODE_STRING pFileNameU
);
687 NTSTATUS
vfatMakeFCBFromDirEntry (PVCB vcb
,
688 PVFATFCB directoryFCB
,
689 PVFAT_DIRENTRY_CONTEXT DirContext
,
692 /* ------------------------------------------------------------ rw.c */
694 NTSTATUS
VfatRead (PVFAT_IRP_CONTEXT IrpContext
);
696 NTSTATUS
VfatWrite (PVFAT_IRP_CONTEXT IrpContext
);
698 NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt
,
700 PULONG CurrentCluster
,
703 /* ----------------------------------------------------------- misc.c */
705 NTSTATUS
VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext
);
707 PVFAT_IRP_CONTEXT
VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject
,
710 VOID
VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext
);
712 NTSTATUS STDCALL
VfatBuildRequest (PDEVICE_OBJECT DeviceObject
,
715 PVOID
VfatGetUserBuffer(IN PIRP
);
717 NTSTATUS
VfatLockUserBuffer(IN PIRP
, IN ULONG
,
721 VfatSetExtendedAttributes(PFILE_OBJECT FileObject
,
724 /* ------------------------------------------------------------- flush.c */
726 NTSTATUS
VfatFlush(PVFAT_IRP_CONTEXT IrpContext
);
728 NTSTATUS
VfatFlushVolume(PDEVICE_EXTENSION DeviceExt
, PVFATFCB VolumeFcb
);