update for HEAD-2003021201
[reactos.git] / drivers / fs / vfat / vfat.h
index 07ad62f..ac55a1b 100644 (file)
@@ -41,8 +41,8 @@ struct _BootSector32
   unsigned short FSVersion;                            // 42
   unsigned long  RootCluster;                          // 44
   unsigned short FSInfoSector;                         // 48
-  unsigned long  BootBackup;                           // 50
-  unsigned char  Res3[10];                             // 54
+  unsigned short BootBackup;                           // 50
+  unsigned char  Res3[12];                             // 52
   unsigned char  Drive;                                        // 64
   unsigned char  Res4;                                 // 65
   unsigned char  ExtBootSignature;                     // 66
@@ -52,7 +52,7 @@ struct _BootSector32
   unsigned long  Signature1;                           // 508
 } __attribute__((packed));
 
-struct _BootBackupSector
+struct _FsInfoSector
 {
   unsigned long  ExtBootSignature2;                    // 0
   unsigned char  Res6[480];                            // 4
@@ -65,9 +65,15 @@ struct _BootBackupSector
 
 typedef struct _BootSector BootSector;
 
+#define VFAT_CASE_LOWER_BASE   8                       // base is lower case
+#define VFAT_CASE_LOWER_EXT    16                      // extension is lower case
+
 struct _FATDirEntry
 {
-  unsigned char  Filename[8], Ext[3], Attrib, Res[2];
+  unsigned char  Filename[8], Ext[3];
+  unsigned char  Attrib;
+  unsigned char  lCase;
+  unsigned char  CreationTimeMs;
   unsigned short CreationTime,CreationDate,AccessDate;
   unsigned short FirstClusterHigh;                      // higher
   unsigned short UpdateTime;                            //time create/update
@@ -122,6 +128,16 @@ typedef struct
 
 struct _VFATFCB;
 
+typedef struct _HASHENTRY
+{
+  ULONG Hash;
+  struct _VFATFCB* self;
+  struct _HASHENTRY* next;
+}
+HASHENTRY;
+
+#define FCB_HASH_TABLE_SIZE 1024
+
 typedef struct
 {
   ERESOURCE DirResource;
@@ -138,6 +154,9 @@ typedef struct
   BOOLEAN AvailableClustersValid;
   ULONG Flags;  
   struct _VFATFCB * VolumeFcb;
+  struct _HASHENTRY* FcbHashTable[FCB_HASH_TABLE_SIZE];
+
+  LIST_ENTRY VolumeListEntry;
 } DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
 
 typedef struct
@@ -145,6 +164,11 @@ typedef struct
   PDRIVER_OBJECT DriverObject;
   PDEVICE_OBJECT DeviceObject;
   ULONG Flags;
+  ERESOURCE VolumeListLock;
+  LIST_ENTRY VolumeListHead;
+  NPAGED_LOOKASIDE_LIST FcbLookasideList;
+  NPAGED_LOOKASIDE_LIST CcbLookasideList;
+  NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
 
 extern PVFAT_GLOBAL_DATA VfatGlobalData;
@@ -154,7 +178,6 @@ extern PVFAT_GLOBAL_DATA VfatGlobalData;
 #define FCB_IS_FAT              0x0004
 #define FCB_IS_PAGE_FILE        0x0008
 #define FCB_IS_VOLUME           0x0010
-#define FCB_UPDATE_DIRENTRY    0x0020
 
 typedef struct _VFATFCB
 {
@@ -165,6 +188,7 @@ typedef struct _VFATFCB
   WCHAR *ObjectName;
   /* path+filename 260 max */
   WCHAR PathName[MAX_PATH];
+  WCHAR ShortName[14];
   LONG RefCount;
   PDEVICE_EXTENSION pDevExt;
   LIST_ENTRY FcbListEntry;
@@ -172,10 +196,14 @@ typedef struct _VFATFCB
   ULONG Flags;
   PFILE_OBJECT FileObject;
   ULONG dirIndex;
+  ULONG startIndex;
   ERESOURCE PagingIoResource;
   ERESOURCE MainResource;
   ULONG TimerCount;
   SHARE_ACCESS FCBShareAccess;
+  HASHENTRY Hash;
+  HASHENTRY ShortHash;
+  FILE_LOCK FileLock;
 
   /* Structure members used only for paging files. */
   ULONG FatChainSize;
@@ -197,9 +225,13 @@ typedef struct _VFATCCB
 
 } VFATCCB, *PVFATCCB;
 
+#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 ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
 
@@ -291,8 +323,7 @@ NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
                    PULONG pDirIndex,
                    PULONG pDirIndex2);
 
-VOID vfat8Dot3ToString (PCHAR pBasename,
-                        PCHAR pExtension,
+VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
                         PWSTR pName);
 
 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
@@ -350,26 +381,6 @@ NTSTATUS delEntry(PDEVICE_EXTENSION,
 
 /*  --------------------------------------------------------  string.c  */
 
-VOID vfat_initstr (wchar_t *wstr,
-                   ULONG wsize);
-
-wchar_t* vfat_wcsncat (wchar_t * dest,
-                       const wchar_t * src,
-                       size_t wstart,
-                       size_t wcount);
-
-wchar_t* vfat_wcsncpy (wchar_t * dest,
-                       const wchar_t *src,
-                       size_t wcount);
-
-wchar_t* vfat_movstr (wchar_t *src,
-                      ULONG dpos,
-                      ULONG spos,
-                      ULONG len);
-
-BOOLEAN wstrcmpi (PWSTR s1,
-                  PWSTR s2);
-
 BOOLEAN wstrcmpjoki (PWSTR s1,
                      PWSTR s2);
 
@@ -390,19 +401,14 @@ NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
                           PULONG Cluster,
                           BOOLEAN Extend);
 
-ULONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
-                       ULONG Cluster);
+ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
+                          ULONG Cluster);
 
 NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
                          ULONG CurrentCluster,
                          PULONG NextCluster,
                          BOOLEAN Extend);
 
-NTSTATUS GetNextSector (PDEVICE_EXTENSION DeviceExt,
-                        ULONG CurrentSector,
-                        PULONG NextSector,
-                        BOOLEAN Extend);
-
 NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
                                  PLARGE_INTEGER Clusters);
 
@@ -420,11 +426,13 @@ BOOL  vfatIsDirEntryEndMarker (FATDirEntry * pFatDirEntry);
 VOID vfatGetDirEntryName (PFAT_DIR_ENTRY pDirEntry,
                           PWSTR  pEntryName);
 
-NTSTATUS  vfatGetNextDirEntry (PDEVICE_EXTENSION  pDeviceExt,
-                               PVFATFCB  pDirectoryFCB,
-                               ULONG * pDirectoryIndex,
-                               PWSTR pLongFileName,
-                               PFAT_DIR_ENTRY pDirEntry);
+NTSTATUS vfatGetNextDirEntry(PVOID * pContext,
+                            PVOID * pPage,
+                            IN PVFATFCB pDirFcb,
+                            IN OUT PULONG pDirIndex,
+                            OUT PWSTR pFileName,
+                            OUT PFAT_DIR_ENTRY pDirEntry,
+                            OUT PULONG pStartIndex);
 
 /*  -----------------------------------------------------------  fcb.c  */
 
@@ -448,8 +456,7 @@ PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION  pVCB);
 
 PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION  pVCB);
 
-BOOL vfatFCBIsDirectory (PDEVICE_EXTENSION pVCB,
-                         PVFATFCB FCB);
+BOOL vfatFCBIsDirectory (PVFATFCB FCB);
 
 NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION  vcb,
                                     PVFATFCB  fcb,
@@ -469,6 +476,7 @@ NTSTATUS vfatMakeFCBFromDirEntry (PVCB  vcb,
                                   PVFATFCB  directoryFCB,
                                   PWSTR  longName,
                                   PFAT_DIR_ENTRY  dirEntry,
+                                 ULONG startIndex,
                                   ULONG dirIndex,
                                   PVFATFCB * fileFCB);
 
@@ -478,22 +486,6 @@ NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
 
 NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
 
-NTSTATUS VfatWriteFile (PDEVICE_EXTENSION DeviceExt,
-                        PFILE_OBJECT FileObject,
-                        PVOID Buffer,
-                        ULONG Length,
-                        ULONG WriteOffset,
-                        BOOLEAN NoCache,
-                        BOOLEAN PageIo);
-
-
-NTSTATUS VfatReadFile (PDEVICE_EXTENSION DeviceExt,
-                       PFILE_OBJECT FileObject,
-                       PVOID Buffer, ULONG Length,
-                       ULONG ReadOffset,
-                       PULONG LengthRead,
-                       ULONG NoCache);
-
 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
                      PVFATFCB Fcb,
                      ULONG FirstCluster,
@@ -521,4 +513,10 @@ NTSTATUS
 VfatSetExtendedAttributes(PFILE_OBJECT FileObject, 
                          PVOID Ea,
                          ULONG EaLength);
+/*  ------------------------------------------------------------- flush.c  */
+
+NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
+
+NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
+
 /* EOF */