7 #include <pseh/pseh2.h>
9 #include <ndk/kdfuncs.h>
10 #include <reactos/kdros.h>
14 #define INIT_SECTION __attribute__((section ("INIT")))
16 #define INIT_SECTION /* Done via alloc_text for MSC */
20 #define USE_ROS_CC_AND_FS
21 #define ENABLE_SWAPOUT
23 /* FIXME: because volume is not cached, we have to perform direct IOs
24 * The day this is fixed, just comment out that line, and check
25 * it still works (and delete old code ;-))
27 #define VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
30 #define ROUND_DOWN(n, align) \
31 (((ULONG)n) & ~((align) - 1l))
33 #define ROUND_UP(n, align) \
34 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
36 #define ROUND_DOWN_64(n, align) \
37 (((ULONGLONG)n) & ~((align) - 1LL))
39 #define ROUND_UP_64(n, align) \
40 ROUND_DOWN_64(((ULONGLONG)n) + (align) - 1LL, (align))
45 unsigned char magic0
, res0
, magic1
;
46 unsigned char OEMName
[8];
47 unsigned short BytesPerSector
;
48 unsigned char SectorsPerCluster
;
49 unsigned short ReservedSectors
;
50 unsigned char FATCount
;
51 unsigned short RootEntries
, Sectors
;
53 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
54 unsigned long HiddenSectors
, SectorsHuge
;
55 unsigned char Drive
, Res1
, Sig
;
56 unsigned long VolumeID
;
57 unsigned char VolumeLabel
[11], SysType
[8];
58 unsigned char Res2
[448];
59 unsigned short Signatur1
;
64 unsigned char magic0
, res0
, magic1
; // 0
65 unsigned char OEMName
[8]; // 3
66 unsigned short BytesPerSector
; // 11
67 unsigned char SectorsPerCluster
; // 13
68 unsigned short ReservedSectors
; // 14
69 unsigned char FATCount
; // 16
70 unsigned short RootEntries
, Sectors
; // 17
71 unsigned char Media
; // 21
72 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
73 unsigned long HiddenSectors
, SectorsHuge
; // 28
74 unsigned long FATSectors32
; // 36
75 unsigned short ExtFlag
; // 40
76 unsigned short FSVersion
; // 42
77 unsigned long RootCluster
; // 44
78 unsigned short FSInfoSector
; // 48
79 unsigned short BootBackup
; // 50
80 unsigned char Res3
[12]; // 52
81 unsigned char Drive
; // 64
82 unsigned char Res4
; // 65
83 unsigned char ExtBootSignature
; // 66
84 unsigned long VolumeID
; // 67
85 unsigned char VolumeLabel
[11], SysType
[8]; // 71
86 unsigned char Res2
[420]; // 90
87 unsigned short Signature1
; // 510
90 #define FAT_DIRTY_BIT 0x01
92 struct _BootSectorFatX
94 unsigned char SysType
[4]; // 0
95 unsigned long VolumeID
; // 4
96 unsigned long SectorsPerCluster
; // 8
97 unsigned short FATCount
; // 12
98 unsigned long Unknown
; // 14
99 unsigned char Unused
[4078]; // 18
104 unsigned long ExtBootSignature2
; // 0
105 unsigned char Res6
[480]; // 4
106 unsigned long FSINFOSignature
; // 484
107 unsigned long FreeCluster
; // 488
108 unsigned long NextCluster
; // 492
109 unsigned char Res7
[12]; // 496
110 unsigned long Signatur2
; // 508
113 typedef struct _BootSector BootSector
;
119 struct { unsigned char Filename
[8], Ext
[3]; };
120 unsigned char ShortName
[11];
122 unsigned char Attrib
;
124 unsigned char CreationTimeMs
;
125 unsigned short CreationTime
,CreationDate
,AccessDate
;
128 unsigned short FirstClusterHigh
; // FAT32
129 unsigned short ExtendedAttributes
; // FAT12/FAT16
131 unsigned short UpdateTime
; //time create/update
132 unsigned short UpdateDate
; //date create/update
133 unsigned short FirstCluster
;
134 unsigned long FileSize
;
137 #define FAT_EAFILE "EA DATA. SF"
139 typedef struct _EAFileHeader FAT_EA_FILE_HEADER
, *PFAT_EA_FILE_HEADER
;
143 unsigned short Signature
; // ED
144 unsigned short Unknown
[15];
145 unsigned short EASetTable
[240];
148 typedef struct _EASetHeader FAT_EA_SET_HEADER
, *PFAT_EA_SET_HEADER
;
152 unsigned short Signature
; // EA
153 unsigned short Offset
; // relative offset, same value as in the EASetTable
154 unsigned short Unknown1
[2];
155 char TargetFileName
[12];
156 unsigned short Unknown2
[3];
157 unsigned int EALength
;
161 typedef struct _EAHeader FAT_EA_HEADER
, *PFAT_EA_HEADER
;
165 unsigned char Unknown
;
166 unsigned char EANameLength
;
167 unsigned short EAValueLength
;
172 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
176 unsigned char FilenameLength
; // 0
177 unsigned char Attrib
; // 1
178 unsigned char Filename
[42]; // 2
179 unsigned long FirstCluster
; // 44
180 unsigned long FileSize
; // 48
181 unsigned short UpdateTime
; // 52
182 unsigned short UpdateDate
; // 54
183 unsigned short CreationTime
; // 56
184 unsigned short CreationDate
; // 58
185 unsigned short AccessTime
; // 60
186 unsigned short AccessDate
; // 62
191 unsigned char id
; // sequence number for slot
192 WCHAR name0_4
[5]; // first 5 characters in name
193 unsigned char attr
; // attribute byte
194 unsigned char reserved
; // always 0
195 unsigned char alias_checksum
; // checksum for 8.3 alias
196 WCHAR name5_10
[6]; // 6 more characters in name
197 unsigned char start
[2]; // starting cluster number
198 WCHAR name11_12
[2]; // last 2 characters in name
201 typedef struct _slot slot
;
205 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
206 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
208 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
210 #define ENTRY_DELETED(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
211 #define ENTRY_VOLUME(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
212 #define ENTRY_END(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
214 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
215 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
216 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
217 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
219 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
220 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
221 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
222 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
224 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
225 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
227 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
235 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
237 #define BLOCKSIZE 512
245 #define VCB_VOLUME_LOCKED 0x0001
246 #define VCB_DISMOUNT_PENDING 0x0002
247 #define VCB_IS_FATX 0x0004
248 #define VCB_IS_SYS_OR_HAS_PAGE 0x0008
249 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
250 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
251 /* VCB condition state */
252 #define VCB_GOOD 0x0010 /* If not set, the VCB is improper for usage */
257 CHAR VolumeLabel
[11];
261 ULONG rootDirectorySectors
;
265 ULONG SectorsPerCluster
;
266 ULONG BytesPerSector
;
267 ULONG BytesPerCluster
;
268 ULONG NumberOfClusters
;
273 } FATINFO
, *PFATINFO
;
276 struct _VFAT_DIRENTRY_CONTEXT
;
277 struct _VFAT_MOVE_CONTEXT
;
278 struct _VFAT_CLOSE_CONTEXT
;
280 typedef struct _HASHENTRY
283 struct _VFATFCB
* self
;
284 struct _HASHENTRY
* next
;
288 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
290 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
291 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
292 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
294 typedef BOOLEAN (*PIS_DIRECTORY_EMPTY
)(PDEVICE_EXTENSION
,struct _VFATFCB
*);
295 typedef NTSTATUS (*PADD_ENTRY
)(PDEVICE_EXTENSION
,PUNICODE_STRING
,struct _VFATFCB
**,struct _VFATFCB
*,ULONG
,UCHAR
,struct _VFAT_MOVE_CONTEXT
*);
296 typedef NTSTATUS (*PDEL_ENTRY
)(PDEVICE_EXTENSION
,struct _VFATFCB
*,struct _VFAT_MOVE_CONTEXT
*);
297 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
298 typedef NTSTATUS (*PGET_DIRTY_STATUS
)(PDEVICE_EXTENSION
,PBOOLEAN
);
299 typedef NTSTATUS (*PSET_DIRTY_STATUS
)(PDEVICE_EXTENSION
,BOOLEAN
);
301 typedef struct _VFAT_DISPATCH
303 PIS_DIRECTORY_EMPTY IsDirectoryEmpty
;
306 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
307 } VFAT_DISPATCH
, *PVFAT_DISPATCH
;
309 #define STATISTICS_SIZE_NO_PAD (sizeof(FILESYSTEM_STATISTICS) + sizeof(FAT_STATISTICS))
310 typedef struct _STATISTICS
{
311 FILESYSTEM_STATISTICS Base
;
313 UCHAR Pad
[((STATISTICS_SIZE_NO_PAD
+ 0x3f) & ~0x3f) - STATISTICS_SIZE_NO_PAD
];
314 } STATISTICS
, *PSTATISTICS
;
316 typedef struct DEVICE_EXTENSION
318 ERESOURCE DirResource
;
319 ERESOURCE FatResource
;
321 KSPIN_LOCK FcbListLock
;
322 LIST_ENTRY FcbListHead
;
324 struct _HASHENTRY
**FcbHashTable
;
326 PDEVICE_OBJECT VolumeDevice
;
327 PDEVICE_OBJECT StorageDevice
;
328 PFILE_OBJECT FATFileObject
;
330 ULONG LastAvailableCluster
;
331 ULONG AvailableClusters
;
332 BOOLEAN AvailableClustersValid
;
334 struct _VFATFCB
*VolumeFcb
;
335 struct _VFATFCB
*RootFcb
;
336 PSTATISTICS Statistics
;
338 /* Pointers to functions for manipulating FAT. */
339 PGET_NEXT_CLUSTER GetNextCluster
;
340 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
341 PWRITE_CLUSTER WriteCluster
;
342 PGET_DIRTY_STATUS GetDirtyStatus
;
343 PSET_DIRTY_STATUS SetDirtyStatus
;
347 LIST_ENTRY VolumeListEntry
;
350 LIST_ENTRY NotifyList
;
351 PNOTIFY_SYNC NotifySync
;
353 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE */
354 ULONG OpenHandleCount
;
356 /* VPBs for dismount */
360 /* Pointers to functions for manipulating directory entries. */
361 VFAT_DISPATCH Dispatch
;
362 } DEVICE_EXTENSION
, VCB
, *PVCB
;
366 VfatIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt
,
367 struct _VFATFCB
* Fcb
)
369 return DeviceExt
->Dispatch
.IsDirectoryEmpty(DeviceExt
, Fcb
);
374 VfatAddEntry(PDEVICE_EXTENSION DeviceExt
,
375 PUNICODE_STRING NameU
,
376 struct _VFATFCB
** Fcb
,
377 struct _VFATFCB
* ParentFcb
,
378 ULONG RequestedOptions
,
380 struct _VFAT_MOVE_CONTEXT
* MoveContext
)
382 return DeviceExt
->Dispatch
.AddEntry(DeviceExt
, NameU
, Fcb
, ParentFcb
, RequestedOptions
, ReqAttr
, MoveContext
);
387 VfatDelEntry(PDEVICE_EXTENSION DeviceExt
,
388 struct _VFATFCB
* Fcb
,
389 struct _VFAT_MOVE_CONTEXT
* MoveContext
)
391 return DeviceExt
->Dispatch
.DelEntry(DeviceExt
, Fcb
, MoveContext
);
396 VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt
,
399 struct _VFATFCB
* pDirFcb
,
400 struct _VFAT_DIRENTRY_CONTEXT
* DirContext
,
403 return DeviceExt
->Dispatch
.GetNextDirEntry(pContext
, pPage
, pDirFcb
, DirContext
, First
);
406 #define VFAT_BREAK_ON_CORRUPTION 1
410 PDRIVER_OBJECT DriverObject
;
411 PDEVICE_OBJECT DeviceObject
;
413 ULONG NumberProcessors
;
414 ERESOURCE VolumeListLock
;
415 LIST_ENTRY VolumeListHead
;
416 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
417 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
418 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
419 PAGED_LOOKASIDE_LIST CloseContextLookasideList
;
420 FAST_IO_DISPATCH FastIoDispatch
;
421 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
422 FAST_MUTEX CloseMutex
;
424 LIST_ENTRY CloseListHead
;
425 BOOLEAN CloseWorkerRunning
;
426 PIO_WORKITEM CloseWorkItem
;
427 BOOLEAN ShutdownStarted
;
428 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
430 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
432 #define FCB_CACHE_INITIALIZED 0x0001
433 #define FCB_DELETE_PENDING 0x0002
434 #define FCB_IS_FAT 0x0004
435 #define FCB_IS_PAGE_FILE 0x0008
436 #define FCB_IS_VOLUME 0x0010
437 #define FCB_IS_DIRTY 0x0020
438 #define FCB_DELAYED_CLOSE 0x0040
440 #define FCB_CLEANED_UP 0x0080
441 #define FCB_CLOSED 0x0100
444 #define NODE_TYPE_FCB ((CSHORT)0x0502)
446 typedef struct _VFATFCB
448 /* FCB header required by ROS/NT */
449 FSRTL_COMMON_FCB_HEADER RFCB
;
450 SECTION_OBJECT_POINTERS SectionObjectPointers
;
451 ERESOURCE MainResource
;
452 ERESOURCE PagingIoResource
;
453 /* end FCB header required by ROS/NT */
455 /* directory entry for this file or directory */
458 /* Pointer to attributes in entry */
461 /* long file name, points into PathNameBuffer */
462 UNICODE_STRING LongNameU
;
464 /* short file name */
465 UNICODE_STRING ShortNameU
;
467 /* directory name, points into PathNameBuffer */
468 UNICODE_STRING DirNameU
;
470 /* path + long file name 260 max*/
471 UNICODE_STRING PathNameU
;
473 /* buffer for PathNameU */
474 PWCHAR PathNameBuffer
;
476 /* buffer for ShortNameU */
477 WCHAR ShortNameBuffer
[13];
482 /* List of FCB's for this volume */
483 LIST_ENTRY FcbListEntry
;
485 /* List of FCB's for the parent */
486 LIST_ENTRY ParentListEntry
;
488 /* pointer to the parent fcb */
489 struct _VFATFCB
*parentFcb
;
491 /* List for the children */
492 LIST_ENTRY ParentListHead
;
494 /* Flags for the fcb */
497 /* pointer to the file object which has initialized the fcb */
498 PFILE_OBJECT FileObject
;
500 /* Directory index for the short name entry */
503 /* Directory index where the long name starts */
506 /* Share access for the file object */
507 SHARE_ACCESS FCBShareAccess
;
509 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
510 ULONG OpenHandleCount
;
512 /* Entry into the hash table for the path + long name */
515 /* Entry into the hash table for the path + short name */
518 /* List of byte-range locks for this file */
522 * Optimization: caching of last read/write cluster+offset pair. Can't
523 * be in VFATCCB because it must be reset everytime the allocated clusters
526 FAST_MUTEX LastMutex
;
530 struct _VFAT_CLOSE_CONTEXT
* CloseContext
;
531 } VFATFCB
, *PVFATFCB
;
533 #define CCB_DELETE_ON_CLOSE 0x0001
535 typedef struct _VFATCCB
537 LARGE_INTEGER CurrentByteOffset
;
539 /* for DirectoryControl */
541 /* for DirectoryControl */
542 UNICODE_STRING SearchPattern
;
543 } VFATCCB
, *PVFATCCB
;
545 #define TAG_CCB 'CtaF'
546 #define TAG_FCB 'FtaF'
547 #define TAG_IRP 'ItaF'
548 #define TAG_CLOSE 'xtaF'
549 #define TAG_STATS 'VtaF'
550 #define TAG_BUFFER 'OtaF'
551 #define TAG_VPB 'vtaF'
552 #define TAG_NAME 'ntaF'
553 #define TAG_SEARCH 'LtaF'
554 #define TAG_DIRENT 'DtaF'
556 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
558 typedef struct __DOSTIME
566 typedef struct __DOSDATE
574 #define IRPCONTEXT_CANWAIT 0x0001
575 #define IRPCONTEXT_COMPLETE 0x0002
576 #define IRPCONTEXT_QUEUE 0x0004
577 #define IRPCONTEXT_PENDINGRETURNED 0x0008
578 #define IRPCONTEXT_DEFERRED_WRITE 0x0010
583 PDEVICE_OBJECT DeviceObject
;
584 PDEVICE_EXTENSION DeviceExt
;
586 WORK_QUEUE_ITEM WorkQueueItem
;
587 PIO_STACK_LOCATION Stack
;
590 PFILE_OBJECT FileObject
;
594 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
596 typedef struct _VFAT_DIRENTRY_CONTEXT
601 UNICODE_STRING LongNameU
;
602 UNICODE_STRING ShortNameU
;
603 PDEVICE_EXTENSION DeviceExt
;
604 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
606 typedef struct _VFAT_MOVE_CONTEXT
613 } VFAT_MOVE_CONTEXT
, *PVFAT_MOVE_CONTEXT
;
615 typedef struct _VFAT_CLOSE_CONTEXT
617 PDEVICE_EXTENSION Vcb
;
619 LIST_ENTRY CloseListEntry
;
620 } VFAT_CLOSE_CONTEXT
, *PVFAT_CLOSE_CONTEXT
;
624 VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext
)
626 PULONG Flags
= &IrpContext
->Flags
;
628 *Flags
&= ~IRPCONTEXT_COMPLETE
;
629 *Flags
|= IRPCONTEXT_QUEUE
;
631 return STATUS_PENDING
;
636 vfatFCBIsDirectory(PVFATFCB FCB
)
638 return BooleanFlagOn(*FCB
->Attributes
, FILE_ATTRIBUTE_DIRECTORY
);
643 vfatFCBIsReadOnly(PVFATFCB FCB
)
645 return BooleanFlagOn(*FCB
->Attributes
, FILE_ATTRIBUTE_READONLY
);
650 vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt
)
652 return BooleanFlagOn(DeviceExt
->Flags
, VCB_IS_FATX
);
658 IN PDEVICE_EXTENSION DeviceExt
,
660 IN ULONG FilterMatch
,
663 FsRtlNotifyFullReportChange(DeviceExt
->NotifySync
,
664 &(DeviceExt
->NotifyList
),
665 (PSTRING
)&Fcb
->PathNameU
,
666 Fcb
->PathNameU
.Length
- Fcb
->LongNameU
.Length
,
667 NULL
, NULL
, FilterMatch
, Action
, NULL
);
670 #define vfatAddToStat(Vcb, Stat, Inc) \
672 PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \
673 Stats->Stat += Inc; \
680 IN PDEVICE_OBJECT pDeviceObject
,
681 IN PLARGE_INTEGER ReadOffset
,
684 IN BOOLEAN Override
);
688 IN PVFAT_IRP_CONTEXT IrpContext
,
689 IN PLARGE_INTEGER ReadOffset
,
691 IN ULONG BufferOffset
,
696 IN PDEVICE_OBJECT pDeviceObject
,
697 IN PLARGE_INTEGER WriteOffset
,
698 IN ULONG WriteLength
,
699 IN OUT PUCHAR Buffer
,
700 IN BOOLEAN Override
);
703 VfatWriteDiskPartial(
704 IN PVFAT_IRP_CONTEXT IrpContext
,
705 IN PLARGE_INTEGER WriteOffset
,
706 IN ULONG WriteLength
,
707 IN ULONG BufferOffset
,
711 VfatBlockDeviceIoControl(
712 IN PDEVICE_OBJECT DeviceObject
,
714 IN PVOID InputBuffer
,
715 IN ULONG InputBufferSize
,
716 IN OUT PVOID OutputBuffer
,
717 IN OUT PULONG pOutputBufferSize
,
718 IN BOOLEAN Override
);
724 PVFAT_IRP_CONTEXT IrpContext
);
730 PVFAT_IRP_CONTEXT IrpContext
);
734 PDEVICE_EXTENSION DeviceExt
,
735 PFILE_OBJECT FileObject
);
741 PVFAT_IRP_CONTEXT IrpContext
);
745 PDEVICE_EXTENSION DeviceExt
,
747 PUNICODE_STRING FileToFindU
,
748 PVFAT_DIRENTRY_CONTEXT DirContext
,
753 PFAT_DIR_ENTRY pEntry
,
754 PUNICODE_STRING NameU
);
759 VfatDirectoryControl(
760 PVFAT_IRP_CONTEXT IrpContext
);
763 FsdDosDateTimeToSystemTime(
764 PDEVICE_EXTENSION DeviceExt
,
767 PLARGE_INTEGER SystemTime
);
770 FsdSystemTimeToDosDateTime(
771 PDEVICE_EXTENSION DeviceExt
,
772 PLARGE_INTEGER SystemTime
,
779 vfatDirEntryGetFirstCluster(
780 PDEVICE_EXTENSION pDeviceExt
,
781 PDIR_ENTRY pDirEntry
);
786 vfatFCBInitializeCacheFromVolume(
792 IN PDEVICE_EXTENSION DeviceExt
,
797 PDEVICE_EXTENSION DeviceExt
,
804 IN PDEVICE_EXTENSION DeviceExt
,
806 IN PUNICODE_STRING FileName
,
807 IN BOOLEAN CaseChangeOnly
);
811 IN PDEVICE_EXTENSION DeviceExt
,
813 IN PUNICODE_STRING FileName
,
814 IN PVFATFCB ParentFcb
);
819 VfatSetExtendedAttributes(
820 PFILE_OBJECT FileObject
,
827 VfatInitFastIoRoutines(
828 PFAST_IO_DISPATCH FastIoDispatch
);
832 VfatAcquireForLazyWrite(
838 VfatReleaseFromLazyWrite(
845 PDEVICE_EXTENSION DeviceExt
,
846 ULONG CurrentCluster
,
850 FAT12FindAndMarkAvailableCluster(
851 PDEVICE_EXTENSION DeviceExt
,
856 PDEVICE_EXTENSION DeviceExt
,
857 ULONG ClusterToWrite
,
863 PDEVICE_EXTENSION DeviceExt
,
864 ULONG CurrentCluster
,
868 FAT16FindAndMarkAvailableCluster(
869 PDEVICE_EXTENSION DeviceExt
,
874 PDEVICE_EXTENSION DeviceExt
,
875 ULONG ClusterToWrite
,
881 PDEVICE_EXTENSION DeviceExt
,
882 ULONG CurrentCluster
,
886 FAT32FindAndMarkAvailableCluster(
887 PDEVICE_EXTENSION DeviceExt
,
892 PDEVICE_EXTENSION DeviceExt
,
893 ULONG ClusterToWrite
,
899 PDEVICE_EXTENSION DeviceExt
,
907 PDEVICE_EXTENSION DeviceExt
,
912 PDEVICE_EXTENSION DeviceExt
,
913 ULONG CurrentCluster
,
917 GetNextClusterExtend(
918 PDEVICE_EXTENSION DeviceExt
,
919 ULONG CurrentCluster
,
923 CountAvailableClusters(
924 PDEVICE_EXTENSION DeviceExt
,
925 PLARGE_INTEGER Clusters
);
929 PDEVICE_EXTENSION DeviceExt
,
930 ULONG ClusterToWrite
,
935 PDEVICE_EXTENSION DeviceExt
,
936 PBOOLEAN DirtyStatus
);
940 PDEVICE_EXTENSION DeviceExt
,
941 PBOOLEAN DirtyStatus
);
945 PDEVICE_EXTENSION DeviceExt
,
946 PBOOLEAN DirtyStatus
);
950 PDEVICE_EXTENSION DeviceExt
,
951 BOOLEAN DirtyStatus
);
955 PDEVICE_EXTENSION DeviceExt
,
956 BOOLEAN DirtyStatus
);
960 PDEVICE_EXTENSION DeviceExt
,
961 BOOLEAN DirtyStatus
);
964 FAT32UpdateFreeClustersCount(
965 PDEVICE_EXTENSION DeviceExt
);
971 PDEVICE_EXTENSION pVCB
,
972 PUNICODE_STRING pFileNameU
);
975 vfatSetFCBNewDirName(
976 PDEVICE_EXTENSION pVCB
,
982 PDEVICE_EXTENSION pVCB
,
984 PVFAT_DIRENTRY_CONTEXT DirContext
,
1001 PDEVICE_EXTENSION pVCB
,
1017 PDEVICE_EXTENSION pVCB
,
1028 #define vfatGrabFCB(v, f) _vfatGrabFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1029 #define vfatReleaseFCB(v, f) _vfatReleaseFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1033 vfatGrabFCBFromTable(
1034 PDEVICE_EXTENSION pDeviceExt
,
1035 PUNICODE_STRING pFileNameU
);
1039 PDEVICE_EXTENSION pVCB
);
1043 PDEVICE_EXTENSION pVCB
);
1054 vfatAttachFCBToFileObject(
1055 PDEVICE_EXTENSION vcb
,
1057 PFILE_OBJECT fileObject
);
1061 PDEVICE_EXTENSION pVCB
,
1063 PUNICODE_STRING FileToFindU
,
1068 PDEVICE_EXTENSION pVCB
,
1069 PVFATFCB
*pParentFCB
,
1071 PUNICODE_STRING pFileNameU
);
1074 vfatMakeFCBFromDirEntry(
1076 PVFATFCB directoryFCB
,
1077 PVFAT_DIRENTRY_CONTEXT DirContext
,
1083 VfatGetStandardInformation(
1085 PFILE_STANDARD_INFORMATION StandardInfo
,
1086 PULONG BufferLength
);
1089 VfatGetBasicInformation(
1090 PFILE_OBJECT FileObject
,
1092 PDEVICE_EXTENSION DeviceExt
,
1093 PFILE_BASIC_INFORMATION BasicInfo
,
1094 PULONG BufferLength
);
1097 VfatQueryInformation(
1098 PVFAT_IRP_CONTEXT IrpContext
);
1102 PVFAT_IRP_CONTEXT IrpContext
);
1105 VfatSetAllocationSizeInformation(
1106 PFILE_OBJECT FileObject
,
1108 PDEVICE_EXTENSION DeviceExt
,
1109 PLARGE_INTEGER AllocationSize
);
1115 PVFAT_IRP_CONTEXT IrpContext
);
1119 PDEVICE_EXTENSION DeviceExt
,
1120 PVFATFCB VolumeFcb
);
1125 VfatFileSystemControl(
1126 PVFAT_IRP_CONTEXT IrpContext
);
1133 PDRIVER_OBJECT DriverObject
,
1134 PUNICODE_STRING RegistryPath
);
1138 KDBG_CLI_ROUTINE vfatKdbgHandler
;
1149 PDEVICE_OBJECT DeviceObject
,
1164 VfatCheckForDismount(
1165 IN PDEVICE_EXTENSION DeviceExt
,
1170 IN PDEVICE_EXTENSION DeviceExt
,
1172 IN ULONG FilterMatch
,
1177 VfatHandleDeferredWrite(
1178 IN PVOID IrpContext
,
1185 PVFAT_IRP_CONTEXT IrpContext
);
1191 PVFAT_IRP_CONTEXT IrpContext
);
1195 PVFAT_IRP_CONTEXT IrpContext
);
1199 PDEVICE_EXTENSION DeviceExt
,
1201 PULONG CurrentCluster
,
1212 PDEVICE_OBJECT DeviceObject
,
1219 PUNICODE_STRING PathNameU
,
1220 PUNICODE_STRING DirNameU
,
1221 PUNICODE_STRING FileNameU
);
1235 VfatQueryVolumeInformation(
1236 PVFAT_IRP_CONTEXT IrpContext
);
1239 VfatSetVolumeInformation(
1240 PVFAT_IRP_CONTEXT IrpContext
);
1242 #endif /* _FASTFAT_PCH_ */