[FASTFAT]
[reactos.git] / reactos / drivers / filesystems / fastfat / vfat.h
index 15a91f2..941f9d7 100644 (file)
@@ -6,7 +6,18 @@
 #include <dos.h>
 #include <pseh/pseh2.h>
 
+#ifdef __GNUC__
+#define INIT_SECTION __attribute__((section ("INIT")))
+#else
+#define INIT_SECTION /* Done via alloc_text for MSC */
+#endif
+
 #define USE_ROS_CC_AND_FS
+#if 0
+#ifndef _MSC_VER
+#define ENABLE_SWAPOUT
+#endif
+#endif
 
 #define ROUND_DOWN(n, align) \
     (((ULONG)n) & ~((align) - 1l))
@@ -251,8 +262,6 @@ typedef struct _HASHENTRY
 }
 HASHENTRY;
 
-#define FCB_HASH_TABLE_SIZE 65536
-
 typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
 
 typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
@@ -306,6 +315,8 @@ typedef struct DEVICE_EXTENSION
     PVPB SpareVPB;
 } DEVICE_EXTENSION, VCB, *PVCB;
 
+#define VFAT_BREAK_ON_CORRUPTION 1
+
 typedef struct
 {
     PDRIVER_OBJECT DriverObject;
@@ -441,8 +452,10 @@ typedef struct __DOSDATE
 }
 DOSDATE, *PDOSDATE;
 
-#define IRPCONTEXT_CANWAIT         0x0001
-#define IRPCONTEXT_PENDINGRETURNED  0x0002
+#define IRPCONTEXT_CANWAIT          0x0001
+#define IRPCONTEXT_COMPLETE         0x0002
+#define IRPCONTEXT_QUEUE            0x0004
+#define IRPCONTEXT_PENDINGRETURNED  0x0008
 
 typedef struct
 {
@@ -457,6 +470,7 @@ typedef struct
     PFILE_OBJECT FileObject;
     ULONG RefCount;
     KEVENT Event;
+    CCHAR PriorityBoost;
 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
 
 typedef struct _VFAT_DIRENTRY_CONTEXT
@@ -474,8 +488,21 @@ typedef struct _VFAT_MOVE_CONTEXT
     ULONG FileSize;
     USHORT CreationDate;
     USHORT CreationTime;
+    BOOLEAN InPlace;
 } VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
 
+FORCEINLINE
+NTSTATUS
+VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext)
+{
+    PULONG Flags = &IrpContext->Flags;
+
+    *Flags &= ~IRPCONTEXT_COMPLETE;
+    *Flags |= IRPCONTEXT_QUEUE;
+
+    return STATUS_PENDING;
+}
+
 /* blockdev.c */
 
 NTSTATUS
@@ -782,8 +809,7 @@ NTSTATUS
 vfatUpdateFCB(
     PDEVICE_EXTENSION pVCB,
     PVFATFCB Fcb,
-    PUNICODE_STRING LongName,
-    PUNICODE_STRING ShortName,
+    PVFAT_DIRENTRY_CONTEXT DirContext,
     PVFATFCB ParentFcb);
 
 VOID
@@ -854,6 +880,20 @@ vfatMakeFCBFromDirEntry(
 
 /* finfo.c */
 
+NTSTATUS
+VfatGetStandardInformation(
+    PVFATFCB FCB,
+    PFILE_STANDARD_INFORMATION StandardInfo,
+    PULONG BufferLength);
+
+NTSTATUS
+VfatGetBasicInformation(
+    PFILE_OBJECT FileObject,
+    PVFATFCB FCB,
+    PDEVICE_OBJECT DeviceObject,
+    PFILE_BASIC_INFORMATION BasicInfo,
+    PULONG BufferLength);
+
 NTSTATUS
 VfatQueryInformation(
     PVFAT_IRP_CONTEXT IrpContext);
@@ -897,19 +937,6 @@ DriverEntry(
 
 /* misc.c */
 
-NTSTATUS
-VfatQueueRequest(
-    PVFAT_IRP_CONTEXT IrpContext);
-
-PVFAT_IRP_CONTEXT
-VfatAllocateIrpContext(
-    PDEVICE_OBJECT DeviceObject,
-    PIRP Irp);
-
-VOID
-VfatFreeIrpContext(
-    PVFAT_IRP_CONTEXT IrpContext);
-
 DRIVER_DISPATCH
 VfatBuildRequest;
 
@@ -921,7 +948,8 @@ VfatBuildRequest(
 
 PVOID
 VfatGetUserBuffer(
-    IN PIRP);
+    IN PIRP,
+    IN BOOLEAN Paging);
 
 NTSTATUS
 VfatLockUserBuffer(