#include <ntifs.h>
#include <ntdddisk.h>
-#include <reactos/helper.h>
#include <debug.h>
+#include <pseh/pseh2.h>
-#include <pshpack1.h>
-struct _BootSector
-{
- unsigned char magic0, res0, magic1;
- unsigned char OEMName[8];
- unsigned short BytesPerSector;
- unsigned char SectorsPerCluster;
- unsigned short ReservedSectors;
- unsigned char FATCount;
- unsigned short RootEntries, Sectors;
- unsigned char Media;
- unsigned short FATSectors, SectorsPerTrack, Heads;
- unsigned long HiddenSectors, SectorsHuge;
- unsigned char Drive, Res1, Sig;
- unsigned long VolumeID;
- unsigned char VolumeLabel[11], SysType[8];
- unsigned char Res2[448];
- unsigned short Signatur1;
-};
-
-struct _BootSector32
-{
- unsigned char magic0, res0, magic1; // 0
- unsigned char OEMName[8]; // 3
- unsigned short BytesPerSector; // 11
- unsigned char SectorsPerCluster; // 13
- unsigned short ReservedSectors; // 14
- unsigned char FATCount; // 16
- unsigned short RootEntries, Sectors; // 17
- unsigned char Media; // 21
- unsigned short FATSectors, SectorsPerTrack, Heads; // 22
- unsigned long HiddenSectors, SectorsHuge; // 28
- unsigned long FATSectors32; // 36
- unsigned short ExtFlag; // 40
- unsigned short FSVersion; // 42
- unsigned long RootCluster; // 44
- unsigned short FSInfoSector; // 48
- unsigned short BootBackup; // 50
- unsigned char Res3[12]; // 52
- unsigned char Drive; // 64
- unsigned char Res4; // 65
- unsigned char ExtBootSignature; // 66
- unsigned long VolumeID; // 67
- unsigned char VolumeLabel[11], SysType[8]; // 71
- unsigned char Res2[420]; // 90
- unsigned short Signature1; // 510
-};
-
-struct _BootSectorFatX
-{
- unsigned char SysType[4]; // 0
- unsigned long VolumeID; // 4
- unsigned long SectorsPerCluster; // 8
- unsigned short FATCount; // 12
- unsigned long Unknown; // 14
- unsigned char Unused[4078]; // 18
-};
-
-struct _FsInfoSector
-{
- unsigned long ExtBootSignature2; // 0
- unsigned char Res6[480]; // 4
- unsigned long FSINFOSignature; // 484
- unsigned long FreeCluster; // 488
- unsigned long NextCluster; // 492
- unsigned char Res7[12]; // 496
- unsigned long Signatur2; // 508
-};
-
-typedef struct _BootSector BootSector;
-
-struct _FATDirEntry
-{
- union
- {
- struct { unsigned char Filename[8], Ext[3]; };
- unsigned char ShortName[11];
- };
- unsigned char Attrib;
- unsigned char lCase;
- unsigned char CreationTimeMs;
- unsigned short CreationTime,CreationDate,AccessDate;
- union
- {
- unsigned short FirstClusterHigh; // FAT32
- unsigned short ExtendedAttributes; // FAT12/FAT16
- };
- unsigned short UpdateTime; //time create/update
- unsigned short UpdateDate; //date create/update
- unsigned short FirstCluster;
- unsigned long FileSize;
-};
-
-#define FAT_EAFILE "EA DATA. SF"
-
-typedef struct _EAFileHeader FAT_EA_FILE_HEADER, *PFAT_EA_FILE_HEADER;
-
-struct _EAFileHeader
-{
- unsigned short Signature; // ED
- unsigned short Unknown[15];
- unsigned short EASetTable[240];
-};
-
-typedef struct _EASetHeader FAT_EA_SET_HEADER, *PFAT_EA_SET_HEADER;
-
-struct _EASetHeader
-{
- unsigned short Signature; // EA
- unsigned short Offset; // relative offset, same value as in the EASetTable
- unsigned short Unknown1[2];
- char TargetFileName[12];
- unsigned short Unknown2[3];
- unsigned int EALength;
- // EA Header
-};
-
-typedef struct _EAHeader FAT_EA_HEADER, *PFAT_EA_HEADER;
-
-struct _EAHeader
-{
- unsigned char Unknown;
- unsigned char EANameLength;
- unsigned short EAValueLength;
- // Name Data
- // Value Data
-};
-
-typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
-
-struct _FATXDirEntry
-{
- unsigned char FilenameLength; // 0
- unsigned char Attrib; // 1
- unsigned char Filename[42]; // 2
- unsigned long FirstCluster; // 44
- unsigned long FileSize; // 48
- unsigned short UpdateTime; // 52
- unsigned short UpdateDate; // 54
- unsigned short CreationTime; // 56
- unsigned short CreationDate; // 58
- unsigned short AccessTime; // 60
- unsigned short AccessDate; // 62
-};
-
-struct _slot
-{
- unsigned char id; // sequence number for slot
- WCHAR name0_4[5]; // first 5 characters in name
- unsigned char attr; // attribute byte
- unsigned char reserved; // always 0
- unsigned char alias_checksum; // checksum for 8.3 alias
- WCHAR name5_10[6]; // 6 more characters in name
- unsigned char start[2]; // starting cluster number
- WCHAR name11_12[2]; // last 2 characters in name
-};
-
-typedef struct _slot slot;
-
-#include <poppack.h>
-
-#define VFAT_CASE_LOWER_BASE 8 // base is lower case
-#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
-
-#define LONGNAME_MAX_LENGTH 256 // max length for a long filename
-
-#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
-#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
-#define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
-
-#define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
-#define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
-#define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
-#define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
-
-#define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
-#define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
-#define FATX_ENTRY_LONG(DirEntry) (FALSE)
-#define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
-
-#define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
-#define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
-
-typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;
-
-union _DIR_ENTRY
-{
- FAT_DIR_ENTRY Fat;
- FATX_DIR_ENTRY FatX;
-};
-
-typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
-
-#define BLOCKSIZE 512
-
-#define FAT16 (1)
-#define FAT12 (2)
-#define FAT32 (3)
-#define FATX16 (4)
-#define FATX32 (5)
-
-#define VCB_VOLUME_LOCKED 0x0001
-#define VCB_DISMOUNT_PENDING 0x0002
-#define VCB_IS_FATX 0x0004
-#define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
-#define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
-
-typedef struct
-{
- ULONG VolumeID;
- ULONG FATStart;
- ULONG FATCount;
- ULONG FATSectors;
- ULONG rootDirectorySectors;
- ULONG rootStart;
- ULONG dataStart;
- ULONG RootCluster;
- ULONG SectorsPerCluster;
- ULONG BytesPerSector;
- ULONG BytesPerCluster;
- ULONG NumberOfClusters;
- ULONG FatType;
- ULONG Sectors;
- BOOLEAN FixedMedia;
-} FATINFO, *PFATINFO;
-
-struct _VFATFCB;
-struct _VFAT_DIRENTRY_CONTEXT;
-
-typedef struct _HASHENTRY
-{
- ULONG Hash;
- struct _VFATFCB* self;
- struct _HASHENTRY* next;
-}
-HASHENTRY;
-
-#define FCB_HASH_TABLE_SIZE 65536
-
-typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
-
-typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
-typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
-typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
-
-typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
-
-typedef struct _DEVICE_EXTENSION
-{
- ERESOURCE DirResource;
- ERESOURCE FatResource;
-
- KSPIN_LOCK FcbListLock;
- LIST_ENTRY FcbListHead;
- ULONG HashTableSize;
- struct _HASHENTRY** FcbHashTable;
-
- PDEVICE_OBJECT StorageDevice;
- PFILE_OBJECT FATFileObject;
- FATINFO FatInfo;
- ULONG LastAvailableCluster;
- ULONG AvailableClusters;
- BOOLEAN AvailableClustersValid;
- ULONG Flags;
- struct _VFATFCB * VolumeFcb;
-
- /* Pointers to functions for manipulating FAT. */
- PGET_NEXT_CLUSTER GetNextCluster;
- PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
- PWRITE_CLUSTER WriteCluster;
- ULONG CleanShutBitMask;
-
- /* Pointers to functions for manipulating directory entries. */
- PGET_NEXT_DIR_ENTRY GetNextDirEntry;
+#include "fullfat.h"
- ULONG BaseDateYear;
+#include <fat.h>
+#include <fatstruc.h>
- LIST_ENTRY VolumeListEntry;
-} DEVICE_EXTENSION, VCB, *PVCB;
+#define Add2Ptr(P,I,T) ((T)((PUCHAR)(P) + (I)))
+#define PtrOffset(B,O) ((ULONG)((ULONG_PTR)(O) - (ULONG_PTR)(B)))
-typedef struct _FAT_GLOBAL_DATA
-{
- ERESOURCE Resource;
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DiskDeviceObject;
- NPAGED_LOOKASIDE_LIST NonPagedFcbList;
- NPAGED_LOOKASIDE_LIST ResourceList;
- NPAGED_LOOKASIDE_LIST IrpContextList;
- FAST_IO_DISPATCH FastIoDispatch;
- CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
- CACHE_MANAGER_CALLBACKS CacheMgrNoopCallbacks;
-} FAT_GLOBAL_DATA, *VFAT_GLOBAL_DATA;
-
-extern VFAT_GLOBAL_DATA VfatGlobalData;
-
-#define FCB_CACHE_INITIALIZED 0x0001
-#define FCB_DELETE_PENDING 0x0002
-#define FCB_IS_FAT 0x0004
-#define FCB_IS_PAGE_FILE 0x0008
-#define FCB_IS_VOLUME 0x0010
-#define FCB_IS_DIRTY 0x0020
-#define FCB_IS_FATX_ENTRY 0x0040
-
-typedef struct _VFATFCB
-{
- /* FCB header required by ROS/NT */
- FSRTL_COMMON_FCB_HEADER RFCB;
- SECTION_OBJECT_POINTERS SectionObjectPointers;
- ERESOURCE MainResource;
- ERESOURCE PagingIoResource;
- /* end FCB header required by ROS/NT */
-
- /* directory entry for this file or directory */
- DIR_ENTRY entry;
-
- /* Pointer to attributes in entry */
- PUCHAR Attributes;
-
- /* long file name, points into PathNameBuffer */
- UNICODE_STRING LongNameU;
-
- /* short file name */
- UNICODE_STRING ShortNameU;
-
- /* directory name, points into PathNameBuffer */
- UNICODE_STRING DirNameU;
-
- /* path + long file name 260 max*/
- UNICODE_STRING PathNameU;
-
- /* buffer for PathNameU */
- PWCHAR PathNameBuffer;
-
- /* buffer for ShortNameU */
- WCHAR ShortNameBuffer[13];
-
- /* */
- LONG RefCount;
-
- /* List of FCB's for this volume */
- LIST_ENTRY FcbListEntry;
-
- /* pointer to the parent fcb */
- struct _VFATFCB* parentFcb;
-
- /* Flags for the fcb */
- ULONG Flags;
-
- /* pointer to the file object which has initialized the fcb */
- PFILE_OBJECT FileObject;
-
- /* Directory index for the short name entry */
- ULONG dirIndex;
-
- /* Directory index where the long name starts */
- ULONG startIndex;
-
- /* Share access for the file object */
- SHARE_ACCESS FCBShareAccess;
-
- /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
- ULONG OpenHandleCount;
-
- /* Entry into the hash table for the path + long name */
- HASHENTRY Hash;
-
- /* Entry into the hash table for the path + short name */
- HASHENTRY ShortHash;
-
- /* List of byte-range locks for this file */
- FILE_LOCK FileLock;
-
- /*
- * Optimalization: caching of last read/write cluster+offset pair. Can't
- * be in VFATCCB because it must be reset everytime the allocated clusters
- * change.
- */
- FAST_MUTEX LastMutex;
- ULONG LastCluster;
- ULONG LastOffset;
-} VFATFCB, *PVFATFCB;
-
-typedef struct _VFATCCB
-{
- LARGE_INTEGER CurrentByteOffset;
- /* for DirectoryControl */
- ULONG Entry;
- /* for DirectoryControl */
- UNICODE_STRING SearchPattern;
-} VFATCCB, *PVFATCCB;
+#define TAG_CCB 'BCCV'
+#define TAG_FCB 'BCFV'
+#define TAG_IRP 'PRIV'
+#define TAG_VFAT 'TAFV'
-#ifndef TAG
-#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
-#endif
-#define TAG_CCB TAG('V', 'C', 'C', 'B')
-#define TAG_FCB TAG('V', 'F', 'C', 'B')
-#define TAG_IRP TAG('V', 'I', 'R', 'P')
-#define TAG_VFAT TAG('V', 'F', 'A', 'T')
+/* Global resource acquire/release */
+#define FatAcquireExclusiveGlobal(IrpContext) \
+( \
+ ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \
+ (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
+)
-#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
+#define FatAcquireSharedGlobal(IrpContext) \
+( \
+ ExAcquireResourceSharedLite(&FatGlobalData.Resource, \
+ (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \
+)
-typedef struct __DOSTIME
-{
- USHORT Second:5;
- USHORT Minute:6;
- USHORT Hour:5;
+#define FatReleaseGlobal(IrpContext) \
+{ \
+ ExReleaseResourceLite(&(FatGlobalData.Resource)); \
}
-DOSTIME, *PDOSTIME;
-
-typedef struct __DOSDATE
-{
- USHORT Day:5;
- USHORT Month:4;
- USHORT Year:5;
-}
-DOSDATE, *PDOSDATE;
-
-#define IRPCONTEXT_CANWAIT 0x0001
-#define IRPCONTEXT_PENDINGRETURNED 0x0002
-
-typedef struct _FAT_IRP_CONTEXT
-{
- PIRP Irp;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExt;
- ULONG Flags;
- WORK_QUEUE_ITEM WorkQueueItem;
- PIO_STACK_LOCATION Stack;
- UCHAR MajorFunction;
- UCHAR MinorFunction;
- PFILE_OBJECT FileObject;
- ULONG RefCount;
- KEVENT Event;
-} FAT_IRP_CONTEXT, *PFAT_IRP_CONTEXT;
-
-typedef struct _VFAT_DIRENTRY_CONTEXT
-{
- ULONG StartIndex;
- ULONG DirIndex;
- DIR_ENTRY DirEntry;
- UNICODE_STRING LongNameU;
- UNICODE_STRING ShortNameU;
-} VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
/* ------------------------------------------------------ shutdown.c */
/* -------------------------------------------------------- volume.c */
-NTSTATUS VfatQueryVolumeInformation (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatQueryVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS VfatSetVolumeInformation (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatSetVolumeInfo(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* ------------------------------------------------------ blockdev.c */
+NTSTATUS
+NTAPI
+FatPerformLboIo(
+ IN PFAT_IRP_CONTEXT IrpContext,
+ IN PLARGE_INTEGER Offset,
+ IN SIZE_T Length);
+
+NTSTATUS
+FatPerformVirtualNonCachedIo(
+ IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb,
+ IN PLARGE_INTEGER Offset,
+ IN SIZE_T Length);
/* ----------------------------------------------------------- dir.c */
-NTSTATUS VfatDirectoryControl (PFAT_IRP_CONTEXT);
+NTSTATUS NTAPI
+FatDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
+VOID NTAPI
+FatCreateRootDcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb);
+
+PFCB NTAPI
+FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
+ IN PFCB ParentDcb);
/* -------------------------------------------------------- create.c */
-NTSTATUS VfatCreate (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
/* --------------------------------------------------------- close.c */
-NTSTATUS VfatClose (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* ------------------------------------------------------- cleanup.c */
-NTSTATUS VfatCleanup (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* --------------------------------------------------------- fastio.c */
VOID NTAPI
FatNoopRelease(IN PVOID Context);
+/* --------------------------------------------------------- fastfat.c */
+
+PFAT_IRP_CONTEXT NTAPI
+FatBuildIrpContext(PIRP Irp, BOOLEAN CanWait);
+
+VOID NTAPI
+FatDestroyIrpContext(PFAT_IRP_CONTEXT IrpContext);
+
+VOID
+NTAPI
+FatQueueRequest(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFAT_OPERATION_HANDLER OperationHandler);
+
+VOID NTAPI
+FatCompleteRequest(PFAT_IRP_CONTEXT IrpContext OPTIONAL,
+ PIRP Irp OPTIONAL,
+ NTSTATUS Status);
+
+BOOLEAN NTAPI
+FatAcquireExclusiveVcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb);
+
+VOID NTAPI
+FatReleaseVcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb);
+
+BOOLEAN NTAPI
+FatAcquireExclusiveFcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb);
+
+BOOLEAN NTAPI
+FatAcquireSharedFcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb);
+
+VOID NTAPI
+FatReleaseFcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb);
+
+TYPE_OF_OPEN
+NTAPI
+FatDecodeFileObject(IN PFILE_OBJECT FileObject,
+ OUT PVCB *Vcb,
+ OUT PFCB *FcbOrDcb,
+ OUT PCCB *Ccb);
+
+VOID NTAPI
+FatSetFileObject(PFILE_OBJECT FileObject,
+ TYPE_OF_OPEN TypeOfOpen,
+ PVOID Fcb,
+ PCCB Ccb);
+
+PVOID FASTCALL
+FatMapUserBuffer(PIRP Irp);
+
+/* --------------------------------------------------------- fullfat.c */
+
+FF_T_SINT32
+FatWriteBlocks(FF_T_UINT8 *pBuffer, FF_T_UINT32 SectorAddress, FF_T_UINT32 Count, void *pParam);
+
+FF_T_SINT32
+FatReadBlocks(FF_T_UINT8 *pBuffer, FF_T_UINT32 SectorAddress, FF_T_UINT32 Count, void *pParam);
+
+/* --------------------------------------------------------- lock.c */
+
+NTSTATUS NTAPI
+FatLockControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* --------------------------------------------------------- fsctl.c */
-NTSTATUS VfatFileSystemControl (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* --------------------------------------------------------- finfo.c */
-NTSTATUS VfatQueryInformation (PFAT_IRP_CONTEXT IrpContext);
-
-NTSTATUS VfatSetInformation (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI FatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI FatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* --------------------------------------------------------- iface.c */
DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
/* ----------------------------------------------------------- fat.c */
+PVOID
+FatPinPage(
+ PFAT_PAGE_CONTEXT Context,
+ LONGLONG ByteOffset);
+
+PVOID
+FatPinNextPage(
+ PFAT_PAGE_CONTEXT Context);
+
+NTSTATUS
+FatInitializeVcb(
+ IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
+ IN PDEVICE_OBJECT TargetDeviceObject,
+ IN PVPB Vpb);
+
+VOID
+FatUninitializeVcb(
+ IN PVCB Vcb);
+
+ULONG
+FatScanFat(
+ IN PFCB Fcb,
+ IN LONGLONG Vbo, OUT PLONGLONG Lbo,
+ IN OUT PLONGLONG Length,
+ OUT PULONG Index,
+ IN BOOLEAN CanWait);
+
+/* ------------------------------------------------------ device.c */
+
+NTSTATUS NTAPI
+FatDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
+NTSTATUS
+FatPerformDevIoCtrl(PDEVICE_OBJECT DeviceObject,
+ ULONG ControlCode,
+ PVOID InputBuffer,
+ ULONG InputBufferSize,
+ PVOID OutputBuffer,
+ ULONG OutputBufferSize,
+ BOOLEAN Override);
/* ------------------------------------------------------ direntry.c */
+VOID
+FatFindDirent(IN OUT PFAT_FIND_DIRENT_CONTEXT Context,
+ OUT PDIR_ENTRY* Dirent,
+ OUT PUNICODE_STRING LongFileName OPTIONAL);
+
+VOID
+FatEnumerateDirents(IN OUT PFAT_ENUM_DIRENT_CONTEXT Context,
+ IN SIZE_T Offset);
+
+VOID
+FatQueryFileTimes(OUT PLARGE_INTEGER FileTimes,
+ IN PDIR_ENTRY Dirent);
/* ----------------------------------------------------------- fcb.c */
+PFCB
+FatLookupFcbByName(
+ IN PFCB ParentFcb,
+ IN PUNICODE_STRING Name);
+
+BOOLEAN
+FatLinkFcbNames(
+ IN PFCB ParentFcb,
+ IN PFCB Fcb);
+
+VOID
+FatUnlinkFcbNames(
+ IN PFCB ParentFcb,
+ IN PFCB Fcb);
+
+PFCB NTAPI
+FatCreateFcb(
+ IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
+ IN PFCB ParentDcb,
+ IN FF_FILE *FileHandle);
+
+NTSTATUS
+FatOpenFcb(
+ OUT PFCB* Fcb,
+ IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB ParentFcb,
+ IN PUNICODE_STRING FileName);
+
+PFCB NTAPI
+FatFindFcb(PFAT_IRP_CONTEXT IrpContext,
+ PRTL_SPLAY_LINKS *RootNode,
+ PSTRING AnsiName,
+ PBOOLEAN IsDosName);
+
+PCCB NTAPI
+FatCreateCcb();
+
+VOID NTAPI
+FatSetFullNameInFcb(PFCB Fcb,
+ PUNICODE_STRING Name);
+
+VOID NTAPI
+FatSetFcbNames(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb);
+
+VOID NTAPI
+Fati8dot3ToString(IN PCHAR FileName,
+ IN BOOLEAN DownCase,
+ OUT POEM_STRING OutString);
/* ------------------------------------------------------------ rw.c */
-NTSTATUS VfatRead (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS VfatWrite (PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* ------------------------------------------------------------- flush.c */
-NTSTATUS VfatFlush(PFAT_IRP_CONTEXT IrpContext);
+NTSTATUS NTAPI
+FatFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
/* EOF */