- Add DDK alignment macros and move/rename the ones in the NDK for user-mode only...
[reactos.git] / reactos / drivers / fs / vfat / vfat.h
index 7f14a20..d1f8f1d 100644 (file)
@@ -1,33 +1,21 @@
-/* $Id$ */
-
-#include <ddk/ntifs.h>
-#include <ddk/ntdddisk.h>
-#include <limits.h>
 #include <debug.h>
+#include <ntifs.h>
+#include <ntdddisk.h>
+#include <reactos/helper.h>
 
-#define USE_ROS_CC_AND_FS
-
-/* FIXME */
-#ifdef __USE_W32API
-NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING, CONST STRING *, BOOLEAN);
-NTSTATUS NTAPI RtlDowncaseUnicodeString(PUNICODE_STRING, PCUNICODE_STRING, BOOLEAN);
-NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING, PCUNICODE_STRING, BOOLEAN);
-#undef DeleteFile /* FIXME */
-#endif
-
-#ifdef USE_ROS_CC_AND_FS
-NTSTATUS STDCALL CcRosInitializeFileCache(PFILE_OBJECT, ULONG);
-NTSTATUS STDCALL CcRosReleaseFileCache(PFILE_OBJECT);
-#define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
-typedef struct _ROS_QUERY_LCN_MAPPING { LARGE_INTEGER LcnDiskOffset; } ROS_QUERY_LCN_MAPPING, *PROS_QUERY_LCN_MAPPING;
-#endif
+#ifdef __GNUC__
+#include <ndk/ntndk.h>
+#include <ccros.h>
 
-#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
-#define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
-
-#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+#define USE_ROS_CC_AND_FS
+#else
+#define KEBUGCHECK KeBugCheck
+#define KEBUGCHECKEX KeBugCheckEx
 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
+#define ROUND_UP(N, S) ROUND_DOWN((N) + (S) - 1, (S))
+#endif
 
+#include <pshpack1.h>
 struct _BootSector
 {
   unsigned char  magic0, res0, magic1;
@@ -45,7 +33,7 @@ struct _BootSector
   unsigned char  VolumeLabel[11], SysType[8];
   unsigned char  Res2[448];
   unsigned short Signatur1;
-} __attribute__((packed));
+};
 
 struct _BootSector32
 {
@@ -73,7 +61,7 @@ struct _BootSector32
   unsigned char  VolumeLabel[11], SysType[8];          // 71
   unsigned char  Res2[420];                            // 90
   unsigned short Signature1;                           // 510
-} __attribute__((packed));
+};
 
 struct _BootSectorFatX
 {
@@ -83,7 +71,7 @@ struct _BootSectorFatX
    unsigned short FATCount;         // 12
    unsigned long Unknown;           // 14
    unsigned char Unused[4078];      // 18
-} __attribute__((packed));
+};
 
 struct _FsInfoSector
 {
@@ -94,35 +82,17 @@ struct _FsInfoSector
   unsigned long  NextCluster;                          // 492
   unsigned char  Res7[12];                             // 496
   unsigned long  Signatur2;                            // 508
-} __attribute__((packed));
+};
 
 typedef struct _BootSector BootSector;
 
-#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))
-
 struct _FATDirEntry
 {
-  unsigned char  Filename[8], Ext[3];
+  union
+  {
+     struct { unsigned char Filename[8], Ext[3]; };
+     unsigned char ShortName[11];
+  };
   unsigned char  Attrib;
   unsigned char  lCase;
   unsigned char  CreationTimeMs;
@@ -132,7 +102,7 @@ struct _FATDirEntry
   unsigned short UpdateDate;                            //date create/update
   unsigned short FirstCluster;
   unsigned long  FileSize;
-} __attribute__((packed));
+};
 
 typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
 
@@ -149,18 +119,8 @@ struct _FATXDirEntry
    unsigned short CreationDate;  // 58
    unsigned short AccessTime;    // 60
    unsigned short AccessDate;    // 62
-} __attribute__((packed));
-
-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;
-
 struct _slot
 {
   unsigned char id;               // sequence number for slot
@@ -171,11 +131,44 @@ struct _slot
   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
-} __attribute__((packed));
-
+};
 
 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)
@@ -187,6 +180,8 @@ typedef struct _slot slot;
 #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
 {
@@ -235,7 +230,8 @@ typedef struct DEVICE_EXTENSION
 
   KSPIN_LOCK FcbListLock;
   LIST_ENTRY FcbListHead;
-  struct _HASHENTRY* FcbHashTable[FCB_HASH_TABLE_SIZE];
+  ULONG HashTableSize;
+  struct _HASHENTRY** FcbHashTable;
 
   PDEVICE_OBJECT StorageDevice;
   PFILE_OBJECT FATFileObject;
@@ -243,17 +239,18 @@ typedef struct DEVICE_EXTENSION
   ULONG LastAvailableCluster;
   ULONG AvailableClusters;
   BOOLEAN AvailableClustersValid;
-  ULONG Flags;  
+  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;
-  
+
   ULONG BaseDateYear;
 
   LIST_ENTRY VolumeListEntry;
@@ -294,7 +291,7 @@ typedef struct _VFATFCB
 
   /* directory entry for this file or directory */
   DIR_ENTRY entry;
-  
+
   /* Pointer to attributes in entry */
   PUCHAR Attributes;
 
@@ -427,7 +424,7 @@ typedef struct _VFAT_DIRENTRY_CONTEXT
 
 /*  ------------------------------------------------------  shutdown.c  */
 
-NTSTATUS STDCALL VfatShutdown (PDEVICE_OBJECT DeviceObject,
+NTSTATUS NTAPI VfatShutdown (PDEVICE_OBJECT DeviceObject,
                                PIRP Irp);
 
 /*  --------------------------------------------------------  volume.c  */
@@ -482,10 +479,6 @@ BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
 
 NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
 
-NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
-                       PFILE_OBJECT FileObject,
-                      PVFATFCB* parentFcb);
-
 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
                    PVFATFCB Parent,
                    PUNICODE_STRING FileToFindU,
@@ -539,14 +532,14 @@ NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
 NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
 
 NTSTATUS
-VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, 
+VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
                                 PVFATFCB Fcb,
                                 PDEVICE_EXTENSION DeviceExt,
                                 PLARGE_INTEGER AllocationSize);
 
 /*  ---------------------------------------------------------  iface.c  */
 
-NTSTATUS STDCALL DriverEntry (PDRIVER_OBJECT DriverObject,
+NTSTATUS NTAPI DriverEntry (PDRIVER_OBJECT DriverObject,
                               PUNICODE_STRING RegistryPath);
 
 /*  ---------------------------------------------------------  dirwr.c  */
@@ -571,8 +564,8 @@ vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
 /*  --------------------------------------------------------  string.c  */
 
 VOID
-vfatSplitPathName(PUNICODE_STRING PathNameU, 
-                 PUNICODE_STRING DirNameU, 
+vfatSplitPathName(PUNICODE_STRING PathNameU,
+                 PUNICODE_STRING DirNameU,
                  PUNICODE_STRING FileNameU);
 
 BOOLEAN vfatIsLongIllegal(WCHAR c);
@@ -730,7 +723,7 @@ PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
 
 VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
 
-NTSTATUS STDCALL VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
+NTSTATUS NTAPI VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
                                    PIRP Irp);
 
 PVOID VfatGetUserBuffer(IN PIRP);
@@ -738,8 +731,8 @@ PVOID VfatGetUserBuffer(IN PIRP);
 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
                             IN LOCK_OPERATION);
 
-NTSTATUS 
-VfatSetExtendedAttributes(PFILE_OBJECT FileObject, 
+NTSTATUS
+VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
                          PVOID Ea,
                          ULONG EaLength);
 /*  ------------------------------------------------------------- flush.c  */