#include <ntdddisk.h>
#include <dos.h>
#include <pseh/pseh2.h>
+#include <section_attribs.h>
#ifdef KDBG
#include <ndk/kdfuncs.h>
#include <reactos/kdros.h>
#endif
-#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
+
+/* FIXME: because volume is not cached, we have to perform direct IOs
+ * The day this is fixed, just comment out that line, and check
+ * it still works (and delete old code ;-))
+ */
+#define VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
+
#define ROUND_DOWN(n, align) \
(((ULONG)n) & ~((align) - 1l))
#define VCB_IS_SYS_OR_HAS_PAGE 0x0008
#define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
#define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
+/* VCB condition state */
+#define VCB_GOOD 0x0010 /* If not set, the VCB is improper for usage */
typedef struct
{
struct _VFATFCB;
struct _VFAT_DIRENTRY_CONTEXT;
struct _VFAT_MOVE_CONTEXT;
+struct _VFAT_CLOSE_CONTEXT;
typedef struct _HASHENTRY
{
BOOLEAN AvailableClustersValid;
ULONG Flags;
struct _VFATFCB *VolumeFcb;
+ struct _VFATFCB *RootFcb;
PSTATISTICS Statistics;
/* Pointers to functions for manipulating FAT. */
NPAGED_LOOKASIDE_LIST FcbLookasideList;
NPAGED_LOOKASIDE_LIST CcbLookasideList;
NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
+ PAGED_LOOKASIDE_LIST CloseContextLookasideList;
FAST_IO_DISPATCH FastIoDispatch;
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
+ FAST_MUTEX CloseMutex;
+ ULONG CloseCount;
+ LIST_ENTRY CloseListHead;
+ BOOLEAN CloseWorkerRunning;
+ PIO_WORKITEM CloseWorkItem;
+ BOOLEAN ShutdownStarted;
} VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
extern PVFAT_GLOBAL_DATA VfatGlobalData;
#define FCB_IS_PAGE_FILE 0x0008
#define FCB_IS_VOLUME 0x0010
#define FCB_IS_DIRTY 0x0020
+#define FCB_DELAYED_CLOSE 0x0040
#ifdef KDBG
-#define FCB_CLEANED_UP 0x0040
-#define FCB_CLOSED 0x0080
+#define FCB_CLEANED_UP 0x0080
+#define FCB_CLOSED 0x0100
#endif
#define NODE_TYPE_FCB ((CSHORT)0x0502)
FAST_MUTEX LastMutex;
ULONG LastCluster;
ULONG LastOffset;
+
+ struct _VFAT_CLOSE_CONTEXT * CloseContext;
} VFATFCB, *PVFATFCB;
#define CCB_DELETE_ON_CLOSE 0x0001
UNICODE_STRING SearchPattern;
} VFATCCB, *PVFATCCB;
-#define TAG_CCB 'BCCV'
-#define TAG_FCB 'BCFV'
-#define TAG_IRP 'PRIV'
-#define TAG_VFAT 'TAFV'
+#define TAG_CCB 'CtaF'
+#define TAG_FCB 'FtaF'
+#define TAG_IRP 'ItaF'
+#define TAG_CLOSE 'xtaF'
+#define TAG_STATS 'VtaF'
+#define TAG_BUFFER 'OtaF'
+#define TAG_VPB 'vtaF'
+#define TAG_NAME 'ntaF'
+#define TAG_SEARCH 'LtaF'
+#define TAG_DIRENT 'DtaF'
#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
BOOLEAN InPlace;
} VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
+typedef struct _VFAT_CLOSE_CONTEXT
+{
+ PDEVICE_EXTENSION Vcb;
+ PVFATFCB Fcb;
+ LIST_ENTRY CloseListEntry;
+} VFAT_CLOSE_CONTEXT, *PVFAT_CLOSE_CONTEXT;
+
FORCEINLINE
NTSTATUS
VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext)
/* fastio.c */
+INIT_FUNCTION
VOID
VfatInitFastIoRoutines(
PFAST_IO_DISPATCH FastIoDispatch);
/* iface.c */
+INIT_FUNCTION
NTSTATUS
NTAPI
DriverEntry(
PVOID
VfatGetUserBuffer(
- IN PIRP,
+ IN PIRP Irp,
IN BOOLEAN Paging);
NTSTATUS
VfatLockUserBuffer(
- IN PIRP,
- IN ULONG,
- IN LOCK_OPERATION);
+ IN PIRP Irp,
+ IN ULONG Length,
+ IN LOCK_OPERATION Operation);
BOOLEAN
VfatCheckForDismount(
vfatIsLongIllegal(
WCHAR c);
-BOOLEAN
-wstrcmpjoki(
- PWSTR s1,
- PWSTR s2);
-
/* volume.c */
NTSTATUS