[fastfat_new]
[reactos.git] / reactos / drivers / filesystems / fastfat_new / fastfat.h
index 3550079..e138bd2 100644 (file)
 #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  */
@@ -457,27 +44,56 @@ FatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
 /*  --------------------------------------------------------  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  */
 
@@ -505,16 +121,82 @@ FatNoopAcquire(IN PVOID Context,
 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  */
 
@@ -523,20 +205,126 @@ NTAPI
 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 */