Fixed the 'REACTOS' volume label bug.
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
index 4ee9bf3..d1b0a86 100644 (file)
@@ -1,9 +1,9 @@
+/* $Id: vfat.h,v 1.34 2001/07/28 07:05:56 hbirr Exp $ */
 
+#include <ddk/ntifs.h>
 
-
-
-
-struct _BootSector { 
+struct _BootSector
+{
   unsigned char  magic0, res0, magic1;
   unsigned char  OEMName[8];
   unsigned short BytesPerSector;
@@ -20,21 +20,43 @@ struct _BootSector {
   unsigned char  Res2[450];
 } __attribute__((packed));
 
-struct _BootSector32 {
-  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 long  FATSectors32;
-  unsigned char  x[31];
-  unsigned char  VolumeLabel[11], SysType[8];
-  unsigned char  Res2[422];
+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 long  BootBackup;                           // 50
+  unsigned char  Res3[10];                             // 54
+  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[418];                            // 90
+  unsigned long  Signature1;                           // 508
+} __attribute__((packed));
+
+struct _BootBackupSector
+{
+  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
 } __attribute__((packed));
 
 typedef struct _BootSector BootSector;
@@ -49,7 +71,7 @@ struct _FATDirEntry {
   unsigned long  FileSize;
 } __attribute__((packed));
 
-typedef struct _FATDirEntry FATDirEntry;
+typedef struct _FATDirEntry FATDirEntry, FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
 
 struct _slot
 {
@@ -74,112 +96,286 @@ typedef struct _slot slot;
 
 typedef struct
 {
-  ERESOURCE Resource;
-   PDEVICE_OBJECT StorageDevice;
-   BootSector *Boot;
-   int rootDirectorySectors, FATStart, rootStart, dataStart;
-   int FATEntriesPerSector, FATUnit;
-   ULONG BytesPerCluster;
-   ULONG FatType;
-   unsigned char* FAT;
-} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
-
-typedef struct _FSRTL_COMMON_FCB_HEADER{
-  char  IsFastIoPossible;//is char the realtype ?
-  ERESOURCE Resource;
-  ERESOURCE PagingIoResource;
-  ULONG  Flags;// is long the real type ?
-  LARGE_INTEGER AllocationSize;
-  LARGE_INTEGER FileSize;
-  LARGE_INTEGER ValidDataLength;
-  // other fields ??
-} FSRTL_COMMON_FCB_HEADER;
-
-typedef struct _SFsdNTRequiredFCB {
-  FSRTL_COMMON_FCB_HEADER CommonFCBHeader;
-  SECTION_OBJECT_POINTERS SectionObject;
-  ERESOURCE               MainResource;
-  ERESOURCE               PagingIoResource;
-} SFsdNTRequiredFCB, *PtrSFsdNTRequiredFCB;
-
-struct _VfatFCB;
-typedef struct _VfatFCB
+  ERESOURCE DirResource;
+  ERESOURCE FatResource;
+  
+  KSPIN_LOCK FcbListLock;
+  LIST_ENTRY FcbListHead;
+  
+  PDEVICE_OBJECT StorageDevice;
+  PFILE_OBJECT StreamStorageDevice;
+  PBCB StorageBcb;
+  PFILE_OBJECT Fat12StorageDevice;
+  PBCB Fat12StorageBcb;
+  BootSector *Boot;
+  int rootDirectorySectors, FATStart, rootStart, dataStart;
+  int BytesPerSector;
+  int FATEntriesPerSector, FATUnit;
+  ULONG BytesPerCluster;
+  ULONG FatType;
+} DEVICE_EXTENSION, *PDEVICE_EXTENSION, VCB, *PVCB;
+
+typedef struct _VFATFCB
 {
-  SFsdNTRequiredFCB     NTRequiredFCB;
-   FATDirEntry entry;
-   WCHAR *ObjectName; // point on filename (250 chars max) in PathName
-   WCHAR PathName[MAX_PATH];// path+filename 260 max
-   long RefCount;
-   PDEVICE_EXTENSION pDevExt;
-   struct _VfatFCB * nextFcb, *prevFcb;
-   struct _VfatFCB * parentFcb;
-} VfatFCB, *PVfatFCB;
+  REACTOS_COMMON_FCB_HEADER RFCB;
+  SECTION_OBJECT_POINTERS SectionObjectPointers;
+  FATDirEntry entry;
+  /* point on filename (250 chars max) in PathName */
+  WCHAR *ObjectName; 
+  /* path+filename 260 max */
+  WCHAR PathName[MAX_PATH]; 
+  LONG RefCount;
+  PDEVICE_EXTENSION pDevExt;
+  LIST_ENTRY FcbListEntry;
+  struct _VFATFCB* parentFcb;
+  BOOL  isCacheInitialized;
+} VFATFCB, *PVFATFCB;
 
-typedef struct
+typedef struct _VFATCCB
 {
-  VfatFCB *   pFcb;
+  VFATFCB *   pFcb;
   LIST_ENTRY     NextCCB;
   PFILE_OBJECT   PtrFileObject;
   LARGE_INTEGER  CurrentByteOffset;
-  ULONG StartSector; // for DirectoryControl
-  ULONG StartEntry;  //for DirectoryControl
-//    PSTRING DirectorySearchPattern;// for DirectoryControl ?
-} VfatCCB, *PVfatCCB;
+  /* for DirectoryControl */
+  ULONG StartSector; 
+  /* for DirectoryControl */
+  ULONG StartEntry;  
+  //    PSTRING DirectorySearchPattern;// for DirectoryControl ?
+} VFATCCB, *PVFATCCB;
+
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
 
+#define TAG_CCB TAG('V', 'C', 'C', 'B')
 
 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
 
+typedef struct __DOSTIME
+{
+   WORD        Second:5; 
+   WORD        Minute:6;
+   WORD Hour:5;
+} DOSTIME, *PDOSTIME;
+
+typedef struct __DOSDATE
+{
+   WORD        Day:5; 
+   WORD        Month:4;
+   WORD Year:5;
+} DOSDATE, *PDOSDATE;
+
+/* functions called by i/o manager : */
+NTSTATUS STDCALL
+DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
+NTSTATUS STDCALL
+VfatDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatCleanup (PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS STDCALL
+VfatSetVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
+
+NTSTATUS
+NextCluster(PDEVICE_EXTENSION DeviceExt,
+           ULONG FirstCluster,
+           PULONG CurrentCluster,
+           BOOLEAN Extend);
+
+/* internal functions in blockdev.c */
+NTSTATUS
+VfatReadSectors(IN PDEVICE_OBJECT pDeviceObject,
+               IN ULONG   DiskSector,
+               IN ULONG       SectorCount,
+               IN UCHAR*       Buffer);
+
+NTSTATUS
+VfatWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
+                IN ULONG   DiskSector,
+                IN ULONG        SectorCount,
+                IN UCHAR*      Buffer);
+
+/* internal functions in dir.c : */
+BOOL FsdDosDateTimeToFileTime(WORD wDosDate,WORD wDosTime, TIME *FileTime);
+BOOL FsdFileTimeToDosDateTime(TIME *FileTime,WORD *pwDosDate,WORD *pwDosTime);
+
+/* internal functions in iface.c : */
+NTSTATUS 
+FindFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
+        PVFATFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
+NTSTATUS 
+VfatCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
+NTSTATUS 
+VfatOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, 
+           PWSTR FileName);
+NTSTATUS 
+VfatReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
+            PVOID Buffer, ULONG Length, ULONG ReadOffset,
+             PULONG LengthRead, ULONG NoCache);
+NTSTATUS 
+VfatWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
+              PVOID Buffer, ULONG Length, ULONG WriteOffset, ULONG NoCache);
+NTSTATUS
+GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, 
+                   ULONG FirstCluster,
+                   ULONG CurrentCluster,
+                   PULONG NextCluster);
+BOOLEAN 
+IsDeletedEntry(PVOID Block, ULONG Offset);
+BOOLEAN 
+IsLastEntry(PVOID Block, ULONG Offset);
+wchar_t* 
+vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
+NTSTATUS 
+VfatRawWriteCluster(PDEVICE_EXTENSION DeviceExt, 
+                   ULONG FirstCluster, PVOID Buffer, ULONG Cluster);
+
+/* internal functions in dirwr.c */
+NTSTATUS 
+addEntry(PDEVICE_EXTENSION DeviceExt,
+        PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
+NTSTATUS 
+updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
+
+/*
+ * String functions
+ */
+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);
+PWCHAR  vfatGetNextPathElement (PWCHAR  pFileName);
+void  vfatWSubString (PWCHAR pTarget, const PWCHAR pSource, size_t pLength);
+BOOL  vfatIsFileNameValid (PWCHAR pFileName);
+
+/*
+ * functions from fat.c
+ */
+NTSTATUS
+OffsetToCluster(PDEVICE_EXTENSION DeviceExt, 
+               ULONG FirstCluster, 
+               ULONG FileOffset,
+               PULONG Cluster,
+               BOOLEAN Extend);
+ULONG
+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
+VfatRawReadCluster(PDEVICE_EXTENSION DeviceExt,
+                  ULONG FirstCluster,
+                  PVOID Buffer,
+                  ULONG Cluster);
+NTSTATUS
+VfatRawWriteCluster(PDEVICE_EXTENSION DeviceExt,
+                   ULONG FirstCluster,
+                   PVOID Buffer,
+                   ULONG Cluster);
+NTSTATUS
+FAT12CountAvailableClusters(PDEVICE_EXTENSION DeviceExt,
+                           PLARGE_INTEGER Clusters);
+NTSTATUS
+FAT16CountAvailableClusters(PDEVICE_EXTENSION DeviceExt,
+                           PLARGE_INTEGER Clusters);
+NTSTATUS
+FAT32CountAvailableClusters(PDEVICE_EXTENSION DeviceExt,
+                           PLARGE_INTEGER Clusters);
+NTSTATUS
+WriteCluster(PDEVICE_EXTENSION DeviceExt,
+            ULONG ClusterToWrite,
+            ULONG NewValue);
+
+/*  ---------------------------------------------------------  create.c  */
+
+void  vfat8Dot3ToString (PCHAR pBasename, PCHAR pExtension, PWSTR pName);
+NTSTATUS
+ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt, PVPB Vpb);
+NTSTATUS
+VfatOpenFile(PDEVICE_EXTENSION DeviceExt,
+            PFILE_OBJECT FileObject,
+            PWSTR FileName);
+
+/*  -----------------------------------------------  DirEntry Functions  */
+
+ULONG  vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION  pDeviceExt,
+                                    PFAT_DIR_ENTRY  pDirEntry);
+BOOL  vfatIsDirEntryDeleted (FATDirEntry * pFatDirEntry);
+BOOL  vfatIsDirEntryVolume (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);
+
+/*  -----------------------------------------------------  FCB Functions */
+
+PVFATFCB  vfatNewFCB (PWCHAR pFileName);
+void  vfatDestroyFCB (PVFATFCB  pFCB);
+void  vfatGrabFCB (PDEVICE_EXTENSION  pVCB,  PVFATFCB  pFCB);
+void  vfatReleaseFCB (PDEVICE_EXTENSION  pVCB,  PVFATFCB  pFCB);
+void  vfatAddFCBToTable (PDEVICE_EXTENSION  pVCB,  
+                         PVFATFCB  pFCB);
+PVFATFCB  vfatGrabFCBFromTable (PDEVICE_EXTENSION  pDeviceExt, 
+                                PWSTR  pFileName);
+NTSTATUS  vfatRequestAndValidateRegion (PDEVICE_EXTENSION  pDeviceExt, 
+                                        PVFATFCB  pFCB, 
+                                        ULONG  pOffset,
+                                        PVOID * pBuffer,
+                                        PCACHE_SEGMENT * pCacheSegment,
+                                        BOOL  pExtend);
+NTSTATUS  vfatReleaseRegion (PDEVICE_EXTENSION  pDeviceExt,
+                             PVFATFCB  pFCB,
+                             PCACHE_SEGMENT  pCacheSegment);
+PVFATFCB  vfatMakeRootFCB (PDEVICE_EXTENSION  pVCB);
+PVFATFCB  vfatOpenRootFCB (PDEVICE_EXTENSION  pVCB);
+BOOL  vfatFCBIsDirectory (PDEVICE_EXTENSION pVCB, PVFATFCB FCB);
+NTSTATUS  vfatAttachFCBToFileObject (PDEVICE_EXTENSION  vcb, 
+                                     PVFATFCB  fcb,
+                                     PFILE_OBJECT  fileObject);
+NTSTATUS  vfatDirFindFile (PDEVICE_EXTENSION  pVCB, 
+                           PVFATFCB  parentFCB, 
+                           PWSTR  elementName,
+                           PVFATFCB * fileFCB);
+NTSTATUS  vfatGetFCBForFile (PDEVICE_EXTENSION  pVCB, 
+                             PVFATFCB  *pParentFCB, 
+                             PVFATFCB  *pFCB, 
+                             const PWSTR  pFileName);
+
+
+
 
-extern PVfatFCB pFirstFcb;
-
-// functions called by i/o manager :
-NTSTATUS DriverEntry(PDRIVER_OBJECT _DriverObject,PUNICODE_STRING RegistryPath);
-NTSTATUS FsdDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS FsdQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-
-
-// internal functions in blockdev.c
-BOOLEAN VFATReadSectors(IN PDEVICE_OBJECT pDeviceObject,
-            IN ULONG   DiskSector,
-                        IN ULONG       SectorCount,
-                       IN UCHAR*       Buffer);
-
-BOOLEAN VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
-             IN ULONG   DiskSector,
-                         IN ULONG        SectorCount,
-                        IN UCHAR*      Buffer);
-
-//internal functions in iface.c :
-NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PVfatFCB Fcb,
-          PVfatFCB Parent, PWSTR FileToFind,ULONG *StartSector,ULONG *Entry);
-NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject);
-NTSTATUS FsdGetStandardInformation(PVfatFCB FCB, PDEVICE_OBJECT DeviceObject,
-                                   PFILE_STANDARD_INFORMATION StandardInfo);
-NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, 
-             PWSTR FileName);
-NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
-                    PVOID Buffer, ULONG Length, ULONG ReadOffset,
-             PULONG LengthRead);
-NTSTATUS FsdWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
-              PVOID Buffer, ULONG Length, ULONG WriteOffset);
-ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster);
-BOOLEAN IsDeletedEntry(PVOID Block, ULONG Offset);
-BOOLEAN IsLastEntry(PVOID Block, ULONG Offset);
-wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount);
-void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster);
-
-//internal functions in dirwr.c
-NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt
-                  ,PFILE_OBJECT pFileObject,ULONG RequestedOptions,UCHAR ReqAttr);
-NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject);
-
-
-//FIXME : following defines must be removed
-//FIXME   when this functions will work.
-#define ExAcquireResourceExclusiveLite(x,y) {}
-#define ExReleaseResourceForThreadLite(x,y) {}