/* STRUCTS & CONSTS******************************************************/
-#define EXT2FSD_VERSION "0.63"
+#define EXT2FSD_VERSION "0.68"
/* WDK DEFINITIONS ******************************************************/
#define CEILING_ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
#define COCKLOFT_ALIGNED(T, A, B) (((A) + (B)) & (~((T)(B) - 1)))
+
+
+/*
+ * Compile-time assertion: (Lustre version)
+ *
+ * Check an invariant described by a constant expression at compile time by
+ * forcing a compiler error if it does not hold. \a cond must be a constant
+ * expression as defined by the ISO C Standard:
+ *
+ * 6.8.4.2 The switch statement
+ * ....
+ * [#3] The expression of each case label shall be an integer
+ * constant expression and no two of the case constant
+ * expressions in the same switch statement shall have the same
+ * value after conversion...
+ *
+ */
+
+#define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
+
/* File System Releated *************************************************/
#define DRIVER_NAME "Ext2Fsd"
#define HIDING_SUFFIX L"HidingSuffix"
#define AUTO_MOUNT L"AutoMount"
#define MOUNT_POINT L"MountPoint"
+#define UID L"uid"
+#define GID L"gid"
+#define EUID L"euid"
+#define EGID L"egid"
#define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
// Data that is not specific to a mounted volume
//
+typedef VOID (NTAPI *EXT2_REAPER_RELEASE)(PVOID);
+
+typedef struct _EXT2_REAPER {
+ PETHREAD Thread;
+ KEVENT Engine;
+ KEVENT Wait;
+ EXT2_REAPER_RELEASE Free;
+ ULONG Flags;
+} EXT2_REAPER, *PEXT2_REAPER;
+
+#define EXT2_REAPER_FLAG_STOP (1 << 0)
+
typedef struct _EXT2_GLOBAL {
/* Identifier for this structure */
/* Table of pointers to the fast I/O entry points */
FAST_IO_DISPATCH FastIoDispatch;
+ /* Filter callbacks */
+ FS_FILTER_CALLBACKS FilterCallbacks;
+
/* Table of pointers to the Cache Manager callbacks */
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks;
CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks;
LIST_ENTRY VcbList;
/* Cleaning thread related: resource cleaner */
- struct {
- KEVENT Engine;
- KEVENT Wait;
- } Reaper;
+ EXT2_REAPER FcbReaper;
+ EXT2_REAPER McbReaper;
+ EXT2_REAPER bhReaper;
/* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList;
/* User specified global codepage name */
struct {
+ WCHAR PageName[CODEPAGE_MAXLEN];
UCHAR AnsiName[CODEPAGE_MAXLEN];
struct nls_table * PageTable;
} Codepage;
/* global hiding patterns */
+ WCHAR wHidingPrefix[HIDINGPAT_LEN];
+ WCHAR wHidingSuffix[HIDINGPAT_LEN];
BOOLEAN bHidingPrefix;
CHAR sHidingPrefix[HIDINGPAT_LEN];
BOOLEAN bHidingSuffix;
/* Common header */
EXT2_FCBVCB;
- // Resource for metadata (super block, tables)
- ERESOURCE MetaLock;
+ // Resource for metadata (inode)
+ ERESOURCE MetaInode;
+
+ // Resource for metadata (block)
+ ERESOURCE MetaBlock;
// Resource for Mcb (Meta data control block)
ERESOURCE McbLock;
- // Entry of Mcb Tree (Root Node)
- PEXT2_MCB McbTree;
+ // List of FCBs for open files on this volume
+ ERESOURCE FcbLock;
+ LIST_ENTRY FcbList;
+ ULONG FcbCount;
// Mcb list
- LIST_ENTRY McbList;
ULONG NumOfMcb;
+ LIST_ENTRY McbList;
+
+ // Entry of Mcb Tree (Root Node)
+ PEXT2_MCB McbTree;
// Link list to Global
LIST_ENTRY Next;
// Dirty Mcbs of modifications for volume stream
LARGE_MCB Extents;
- // List of FCBs for open files on this volume
- ULONG FcbCount;
- LIST_ENTRY FcbList;
- KSPIN_LOCK FcbLock;
// Share Access for the file object
SHARE_ACCESS ShareAccess;
BOOLEAN IsExt3fs;
PEXT2_SUPER_BLOCK SuperBlock;
- /*
- // Bitmap Block per group
- PRTL_BITMAP BlockBitMaps;
- PRTL_BITMAP InodeBitMaps;
- */
-
// Block / Cluster size
ULONG BlockSize;
#define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
#define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
+#define VCB_BEING_DROPPED 0x00002000
#define VCB_FORCE_WRITING 0x00004000
#define VCB_DEVICE_REMOVED 0x00008000
#define VCB_JOURNAL_RECOVER 0x00080000
#define VCB_ARRIVAL_NOTIFIED 0x00800000
+#define VCB_RO_COMPAT_READ_ONLY 0x01000000
#define VCB_READ_ONLY 0x08000000
#define VCB_WRITE_PROTECTED 0x10000000
#define VCB_FLOPPY_DISK 0x20000000
#define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
#define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
#define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
+ IsFlagOn((Vcb)->Flags, VCB_RO_COMPAT_READ_ONLY) || \
IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
// List of FCBs for this volume
LIST_ENTRY Next;
+ LARGE_INTEGER TsDrop; /* drop time */
SECTION_OBJECT_POINTERS SectionObject;
#define FCB_FROM_POOL 0x00000001
#define FCB_PAGE_FILE 0x00000002
#define FCB_FILE_MODIFIED 0x00000020
-#define FCB_STATE_BUSY 0x00000040
+
#define FCB_ALLOC_IN_CREATE 0x00000080
#define FCB_ALLOC_IN_WRITE 0x00000100
#define FCB_ALLOC_IN_SETINFO 0x00000200
static
#endif
__inline ULONG DEC_OBJ_CNT(PULONG _C) {
- if (*_C > 0) {
- return InterlockedDecrement(_C);
- } else {
+ if (*_C <= 0) {
DbgBreak();
}
- return 0;
+ return InterlockedDecrement(_C);
}
#if EXT2_DEBUG
PMDL
Ext2CreateMdl (
IN PVOID Buffer,
- IN BOOLEAN bPaged,
IN ULONG Length,
IN LOCK_OPERATION Operation
);
VOID NTAPI
Ext2NoOpRelease (IN PVOID Fcb);
-VOID NTAPI
-Ext2AcquireForCreateSection (
- IN PFILE_OBJECT FileObject
-);
-
-VOID NTAPI
-Ext2ReleaseForCreateSection (
- IN PFILE_OBJECT FileObject
-);
-
-NTSTATUS NTAPI
-Ext2AcquireFileForModWrite (
- IN PFILE_OBJECT FileObject,
- IN PLARGE_INTEGER EndingOffset,
- OUT PERESOURCE *ResourceToRelease,
- IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2ReleaseFileForModWrite (
- IN PFILE_OBJECT FileObject,
- IN PERESOURCE ResourceToRelease,
- IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2AcquireFileForCcFlush (
- IN PFILE_OBJECT FileObject,
- IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS NTAPI
-Ext2ReleaseFileForCcFlush (
- IN PFILE_OBJECT FileObject,
- IN PDEVICE_OBJECT DeviceObject
-);
-
-
//
// Create.c
//
#define DL_PNP 0x00010000 /* pnp */
#define DL_IO 0x00020000 /* file i/o */
-#define DL_ALL (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_REN|DL_RES|DL_BLK|DL_CP|DL_EXT|DL_MAP|DL_JNL|DL_HTI|DL_WRN|DL_BH|DL_PNP|DL_IO)
-
-#if EXT2_DEBUG && defined(__REACTOS__)
- #define DL_DEFAULT (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_WRN)
-#else
- #define DL_DEFAULT (DL_ERR|DL_VIT)
-#endif
+#define DL_DEFAULT (DL_ERR|DL_VIT)
#if EXT2_DEBUG
extern ULONG DebugFilter;
NTSTATUS
Ext2ProcessGlobalProperty(
IN PDEVICE_OBJECT DeviceObject,
- IN PEXT2_VOLUME_PROPERTY2 Property,
+ IN PEXT2_VOLUME_PROPERTY3 Property,
IN ULONG Length
);
NTSTATUS
Ext2ProcessVolumeProperty(
IN PEXT2_VCB Vcb,
- IN PEXT2_VOLUME_PROPERTY2 Property,
+ IN PEXT2_VOLUME_PROPERTY3 Property,
IN ULONG Length
);
NTSTATUS
Ext2ProcessUserProperty(
IN PEXT2_IRP_CONTEXT IrpContext,
- IN PEXT2_VOLUME_PROPERTY2 Property,
+ IN PEXT2_VOLUME_PROPERTY3 Property,
IN ULONG Length
);
Ext2PutGroup(IN PEXT2_VCB Vcb);
VOID
-Ext2DropGroup(IN PEXT2_VCB Vcb);
+Ext2DropBH(IN PEXT2_VCB Vcb);
BOOLEAN
Ext2SaveGroup(
OUT PULONG Inode
);
+NTSTATUS
+Ext2UpdateGroupDirStat(
+ IN PEXT2_IRP_CONTEXT IrpContext,
+ IN PEXT2_VCB Vcb,
+ IN ULONG Group
+);
+
NTSTATUS
Ext2FreeInode(
IN PEXT2_IRP_CONTEXT IrpContext,
IN PEXT2_IRP_CONTEXT IrpContext,
IN PEXT2_VCB Vcb,
IN PEXT2_FCB Dcb,
- IN PEXT2_MCB Mcb
+ IN PEXT2_MCB Mcb,
+ IN umode_t mode
);
NTSTATUS
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject);
+VOID
+NTAPI
+Ext2AcquireForCreateSection (
+ IN PFILE_OBJECT FileObject
+);
+
+VOID
+NTAPI
+Ext2ReleaseForCreateSection (
+ IN PFILE_OBJECT FileObject
+);
+
+NTSTATUS
+NTAPI
+Ext2AcquireFileForModWrite (
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER EndingOffset,
+ OUT PERESOURCE *ResourceToRelease,
+ IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2ReleaseFileForModWrite (
+ IN PFILE_OBJECT FileObject,
+ IN PERESOURCE ResourceToRelease,
+ IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2AcquireFileForCcFlush (
+ IN PFILE_OBJECT FileObject,
+ IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+NTAPI
+Ext2ReleaseFileForCcFlush (
+ IN PFILE_OBJECT FileObject,
+ IN PDEVICE_OBJECT DeviceObject
+);
+
+
+NTSTATUS
+NTAPI
+Ext2PreAcquireForCreateSection(
+ IN PFS_FILTER_CALLBACK_DATA cd,
+ OUT PVOID *cc
+ );
//
// FileInfo.c
int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry,
struct inode *inode, struct ext3_dir_entry_2 *de,
struct buffer_head *bh);
-
#if !defined(__REACTOS__) || defined(_MSC_VER)
struct ext3_dir_entry_2 *
do_split(struct ext2_icb *icb, struct inode *dir,
// Init.c
//
+NTSTATUS
+Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath);
BOOLEAN
-Ext2QueryGlobalParameters (IN PUNICODE_STRING RegistryPath);
+Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath);
VOID NTAPI
DriverUnload (IN PDRIVER_OBJECT DriverObject);
// Memory.c
//
+VOID
+NTAPI
+Ext2FcbReaperThread(
+ PVOID Context
+);
+
+VOID
+NTAPI
+Ext2McbReaperThread(
+ PVOID Context
+);
+
+VOID
+NTAPI
+Ext2bhReaperThread(
+ PVOID Context
+);
+
+
PEXT2_IRP_CONTEXT
Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp );
);
VOID
-Ext2FreeFcb (IN PEXT2_FCB Fcb);
+Ext2UnlinkFcb(IN PEXT2_FCB Fcb);
VOID
-Ext2InsertFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
+Ext2FreeFcb (IN PEXT2_FCB Fcb);
+VOID
+Ext2ReleaseFcb (IN PEXT2_FCB Fcb);
VOID
-Ext2RemoveFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
+Ext2InsertFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
PEXT2_CCB
Ext2AllocateCcb (ULONG Flags, PEXT2_MCB SymLink);
);
NTSTATUS
-Ext2StartReaperThread();
+Ext2StartReaper(PEXT2_REAPER, EXT2_REAPER_RELEASE);
+VOID
+NTAPI
+Ext2StopReaper(PEXT2_REAPER Reaper);
//
// Misc.c
OUT PULONG dwReturn
);
+
VOID
Ext2StartFloppyFlushDpc (
PEXT2_VCB Vcb,