diff -uNr 0.63/Ext3Fsd/block.c 0.66/Ext3Fsd/block.c
--- 0.63/Ext3Fsd/block.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/block.c	2016-04-19 16:38:20.000000000 +0200
@@ -51,9 +51,8 @@
 PMDL
 Ext2CreateMdl (
     IN PVOID Buffer,
-    IN BOOLEAN bPaged,
     IN ULONG Length,
-    IN LOCK_OPERATION Operation
+    IN LOCK_OPERATION op
 )
 {
     NTSTATUS Status;
@@ -65,10 +64,10 @@
         Status = STATUS_INSUFFICIENT_RESOURCES;
     } else {
         __try {
-            if (bPaged) {
-                MmProbeAndLockPages(Mdl, KernelMode, Operation);
+            if (MmIsNonPagedSystemAddressValid(Buffer)) {
+                MmBuildMdlForNonPagedPool(Mdl);
             } else {
-                MmBuildMdlForNonPagedPool (Mdl);
+                MmProbeAndLockPages(Mdl, KernelMode, op);
             }
             Status = STATUS_SUCCESS;
         } __except (EXCEPTION_EXECUTE_HANDLER) {
@@ -89,6 +88,7 @@
     while (Mdl) {
         PMDL Next;
         Next = Mdl->Next;
+        Mdl->Next = NULL;
         if (IsFlagOn(Mdl->MdlFlags, MDL_PAGES_LOCKED)) {
             MmUnlockPages (Mdl);
         }
diff -uNr 0.63/Ext3Fsd/cleanup.c 0.66/Ext3Fsd/cleanup.c
--- 0.63/Ext3Fsd/cleanup.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/cleanup.c	2016-04-19 16:38:20.000000000 +0200
@@ -33,6 +33,7 @@
     BOOLEAN         VcbResourceAcquired = FALSE;
     BOOLEAN         FcbResourceAcquired = FALSE;
     BOOLEAN         FcbPagingIoResourceAcquired = FALSE;
+    BOOLEAN         SymLinkDelete = FALSE;
 
     __try {
 
@@ -198,7 +199,11 @@
             }
 
             if (IsFlagOn(Ccb->Flags, CCB_DELETE_ON_CLOSE))  {
-                SetLongFlag(Fcb->Flags, FCB_DELETE_PENDING);
+                if (Ccb->SymLink || IsInodeSymLink(&Mcb->Inode)) {
+                    SymLinkDelete = TRUE;
+                } else {
+                    SetLongFlag(Fcb->Flags, FCB_DELETE_PENDING);
+                }
             }
 
             //
@@ -279,52 +284,52 @@
             }
         }
 
-        if (IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING)) {
+        if (SymLinkDelete ||
+            (IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING) &&
+             Fcb->OpenHandleCount == 0) ) {
 
-            if (Fcb->OpenHandleCount == 0 || (Mcb = Ccb->SymLink)) {
-
-                //
-                // Ext2DeleteFile will acquire these lock inside
-                //
+            //
+            // Ext2DeleteFile will acquire these lock inside
+            //
 
-                if (FcbResourceAcquired) {
-                    ExReleaseResourceLite(&Fcb->MainResource);
-                    FcbResourceAcquired = FALSE;
-                }
+            if (FcbResourceAcquired) {
+                ExReleaseResourceLite(&Fcb->MainResource);
+                FcbResourceAcquired = FALSE;
+            }
 
-                //
-                //  this file is to be deleted ...
-                //
-                if (Ccb->SymLink) {
-                    Mcb = Ccb->SymLink;
-                    FileObject->DeletePending = FALSE;
-                }
+            //
+            //  this file is to be deleted ...
+            //
+            if (Ccb->SymLink) {
+                Mcb = Ccb->SymLink;
+                FileObject->DeletePending = FALSE;
+            }
 
-                Status = Ext2DeleteFile(IrpContext, Vcb, Fcb, Mcb);
+            Status = Ext2DeleteFile(IrpContext, Vcb, Fcb, Mcb);
 
-                if (NT_SUCCESS(Status)) {
-                    if (IsMcbDirectory(Mcb)) {
-                        Ext2NotifyReportChange( IrpContext, Vcb, Mcb,
-                                                FILE_NOTIFY_CHANGE_DIR_NAME,
-                                                FILE_ACTION_REMOVED );
-                    } else {
-                        Ext2NotifyReportChange( IrpContext, Vcb, Mcb,
-                                                FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                FILE_ACTION_REMOVED );
-                    }
+            if (NT_SUCCESS(Status)) {
+                if (IsMcbDirectory(Mcb)) {
+                    Ext2NotifyReportChange( IrpContext, Vcb, Mcb,
+                                            FILE_NOTIFY_CHANGE_DIR_NAME,
+                                            FILE_ACTION_REMOVED );
+                } else {
+                    Ext2NotifyReportChange( IrpContext, Vcb, Mcb,
+                                            FILE_NOTIFY_CHANGE_FILE_NAME,
+                                            FILE_ACTION_REMOVED );
                 }
+            }
 
-                //
-                // re-acquire the main resource lock
-                //
-
-                FcbResourceAcquired =
-                    ExAcquireResourceExclusiveLite(
-                        &Fcb->MainResource,
-                        TRUE
-                    );
+            //
+            // re-acquire the main resource lock
+            //
 
-                SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
+            FcbResourceAcquired =
+                ExAcquireResourceExclusiveLite(
+                    &Fcb->MainResource,
+                    TRUE
+                );
+            if (!SymLinkDelete) {
+                 SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
                 if (CcIsFileCached(FileObject)) {
                     CcSetFileSizes(FileObject,
                                    (PCC_FILE_SIZES)(&(Fcb->Header.AllocationSize)));
diff -uNr 0.63/Ext3Fsd/cmcb.c 0.66/Ext3Fsd/cmcb.c
--- 0.63/Ext3Fsd/cmcb.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/cmcb.c	2016-04-19 16:38:20.000000000 +0200
@@ -38,8 +38,7 @@
     DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForLazyWrite: %s %s Fcb=%p\n",
                              Ext2GetCurrentProcessName(), "ACQUIRE_FOR_LAZY_WRITE", Fcb));
 #endif
-    if (!ExAcquireResourceSharedLite(
-                &Fcb->PagingIoResource, Wait)) {
+    if (!ExAcquireResourceExclusiveLite(Fcb->Header.Resource, Wait)) {
         return FALSE;
     }
 
@@ -47,7 +46,6 @@
     Fcb->LazyWriterThread = PsGetCurrentThread();
 
     ASSERT(IoGetTopLevelIrp() == NULL);
-
     IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
 
     return TRUE;
@@ -59,9 +57,7 @@
     //
     // On a readonly filesystem this function still has to exist but it
     // doesn't need to do anything.
-    PEXT2_FCB Fcb;
-
-    Fcb = (PEXT2_FCB) Context;
+    PEXT2_FCB Fcb = (PEXT2_FCB) Context;
 
     ASSERT(Fcb != NULL);
 
@@ -74,7 +70,7 @@
     ASSERT(Fcb->LazyWriterThread == PsGetCurrentThread());
     Fcb->LazyWriterThread = NULL;
 
-    ExReleaseResourceLite(&Fcb->PagingIoResource);
+    ExReleaseResourceLite(Fcb->Header.Resource);
 
     ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
     IoSetTopLevelIrp( NULL );
@@ -84,24 +80,18 @@
 Ext2AcquireForReadAhead (IN PVOID    Context,
                          IN BOOLEAN  Wait)
 {
-    PEXT2_FCB    Fcb;
-
-    Fcb = (PEXT2_FCB) Context;
+    PEXT2_FCB    Fcb = (PEXT2_FCB) Context;
 
     ASSERT(Fcb != NULL);
-
     ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
            (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
 
     DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForReadAhead: i=%xh Fcb=%p\n",
                              Fcb->Mcb->Inode.i_ino, Fcb));
 
-    if (!ExAcquireResourceSharedLite(
-                &Fcb->MainResource, Wait  ))
+    if (!ExAcquireResourceSharedLite(Fcb->Header.Resource, Wait))
         return FALSE;
-
     ASSERT(IoGetTopLevelIrp() == NULL);
-
     IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
 
     return TRUE;
@@ -110,9 +100,7 @@
 VOID
 Ext2ReleaseFromReadAhead (IN PVOID Context)
 {
-    PEXT2_FCB Fcb;
-
-    Fcb = (PEXT2_FCB) Context;
+    PEXT2_FCB Fcb = (PEXT2_FCB) Context;
 
     ASSERT(Fcb != NULL);
 
@@ -122,9 +110,8 @@
     DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseFromReadAhead: i=%xh Fcb=%p\n",
                              Fcb->Mcb->Inode.i_ino, Fcb));
 
-    IoSetTopLevelIrp( NULL );
-
-    ExReleaseResourceLite(&Fcb->MainResource);
+    IoSetTopLevelIrp(NULL);
+    ExReleaseResourceLite(Fcb->Header.Resource);
 }
 
 BOOLEAN
@@ -149,120 +136,3 @@
     return;
 }
 
-
-VOID
-Ext2AcquireForCreateSection (
-    IN PFILE_OBJECT FileObject
-)
-
-{
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    if (Fcb->Header.Resource != NULL) {
-        ExAcquireResourceExclusiveLite(Fcb->Header.Resource, TRUE);
-    }
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForCreateSection:  Fcb=%p\n", Fcb));
-}
-
-VOID
-Ext2ReleaseForCreateSection (
-    IN PFILE_OBJECT FileObject
-)
-
-{
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseForCreateSection:  Fcb=%p\n", Fcb));
-
-    if (Fcb->Header.Resource != NULL) {
-        ExReleaseResourceLite(Fcb->Header.Resource);
-    }
-}
-
-
-NTSTATUS
-Ext2AcquireFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PLARGE_INTEGER EndingOffset,
-    OUT PERESOURCE *ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-)
-
-{
-    BOOLEAN ResourceAcquired = FALSE;
-
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    if (Fcb->Header.PagingIoResource != NULL) {
-        *ResourceToRelease = Fcb->Header.PagingIoResource;
-    } else {
-        *ResourceToRelease = Fcb->Header.Resource;
-    }
-
-    ResourceAcquired = ExAcquireResourceSharedLite(*ResourceToRelease, FALSE);
-    if (!ResourceAcquired) {
-        *ResourceToRelease = NULL;
-    }
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireFileForModWrite:  Fcb=%p Acquired=%d\n",
-                             Fcb, ResourceAcquired));
-
-    return (ResourceAcquired ? STATUS_SUCCESS : STATUS_CANT_WAIT);
-}
-
-NTSTATUS
-Ext2ReleaseFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PERESOURCE ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-)
-{
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseFileForModWrite: Fcb=%p\n", Fcb));
-
-    if (ResourceToRelease != NULL) {
-        ASSERT(ResourceToRelease == Fcb->Header.PagingIoResource ||
-               ResourceToRelease == Fcb->Header.Resource);
-        ExReleaseResourceLite(ResourceToRelease);
-    } else {
-        DbgBreak();
-    }
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-Ext2AcquireFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-)
-{
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    if (Fcb->Header.PagingIoResource != NULL) {
-        ExAcquireResourceSharedLite(Fcb->Header.PagingIoResource, TRUE);
-    }
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireFileForCcFlush: Fcb=%p\n", Fcb));
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS
-Ext2ReleaseFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-)
-{
-    PEXT2_FCB Fcb = FileObject->FsContext;
-
-    DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseFileForCcFlush: Fcb=%p\n", Fcb));
-
-    if (Fcb->Header.PagingIoResource != NULL) {
-        ExReleaseResourceLite(Fcb->Header.PagingIoResource);
-    }
-
-    return STATUS_SUCCESS;
-}
diff -uNr 0.63/Ext3Fsd/create.c 0.66/Ext3Fsd/create.c
--- 0.63/Ext3Fsd/create.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/create.c	2016-04-19 16:38:20.000000000 +0200
@@ -1889,8 +1889,13 @@
     Inode.i_ino = iNo;
     Inode.i_ctime = Inode.i_mtime =
     Inode.i_atime = Ext2LinuxTime(SysTime);
-    Inode.i_uid = Vcb->uid;
-    Inode.i_gid = Vcb->gid;
+    if (IsFlagOn(Vcb->Flags, VCB_USER_IDS)) {
+        Inode.i_uid = Vcb->uid;
+        Inode.i_gid = Vcb->gid;
+    } else {
+        Inode.i_uid = Parent->Mcb->Inode.i_uid;
+        Inode.i_gid = Parent->Mcb->Inode.i_gid;
+    }
     Inode.i_generation = Parent->Inode->i_generation;
     Inode.i_mode = S_IPERMISSION_MASK &
                    Parent->Inode->i_mode;
diff -uNr 0.63/Ext3Fsd/devctl.c 0.66/Ext3Fsd/devctl.c
--- 0.63/Ext3Fsd/devctl.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/devctl.c	2016-04-19 16:38:20.000000000 +0200
@@ -231,13 +231,16 @@
 NTSTATUS
 Ext2ProcessGlobalProperty(
     IN  PDEVICE_OBJECT  DeviceObject,
-    IN  PEXT2_VOLUME_PROPERTY2 Property,
+    IN  PEXT2_VOLUME_PROPERTY3 Property3,
     IN  ULONG Length
 )
 {
+    PEXT2_VOLUME_PROPERTY3 Property2 = (PVOID)Property3;
+    PEXT2_VOLUME_PROPERTY  Property = (PVOID)Property3;
+    struct nls_table * PageTable = NULL;
+
     NTSTATUS        Status = STATUS_SUCCESS;
     BOOLEAN         GlobalDataResourceAcquired = FALSE;
-    struct nls_table * PageTable = NULL;
 
     __try {
 
@@ -289,51 +292,57 @@
         ExAcquireResourceExclusiveLite(&Ext2Global->Resource, TRUE);
         GlobalDataResourceAcquired = TRUE;
 
-        if (Property->bReadonly) {
-            ClearLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
-            ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
-        } else {
-            SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
-            if (Property->bExt3Writable) {
-                SetLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
-            } else {
-                ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
-            }
-        }
 
-        PageTable = load_nls(Property->Codepage);
-        if (PageTable) {
-            memcpy(Ext2Global->Codepage.AnsiName, Property->Codepage, CODEPAGE_MAXLEN);
-            Ext2Global->Codepage.PageTable = PageTable;
-        }
+        switch (Property->Command) {
+
+            case APP_CMD_SET_PROPERTY3:
 
-        if (Property->Command == APP_CMD_SET_PROPERTY2 ||
-                Property->Command == APP_CMD_SET_PROPERTY3 ) {
+            if (Property3->Flags2 & EXT2_VPROP3_AUTOMOUNT) {
+                if (Property3->AutoMount)
+                    SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+                else
+                    ClearLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+            }
+
+            case APP_CMD_SET_PROPERTY2:
 
             RtlZeroMemory(Ext2Global->sHidingPrefix, HIDINGPAT_LEN);
-            if ((Ext2Global->bHidingPrefix = Property->bHidingPrefix)) {
+            if ((Ext2Global->bHidingPrefix = Property2->bHidingPrefix)) {
                 RtlCopyMemory( Ext2Global->sHidingPrefix,
-                               Property->sHidingPrefix,
+                               Property2->sHidingPrefix,
                                HIDINGPAT_LEN - 1);
             }
             RtlZeroMemory(Ext2Global->sHidingSuffix, HIDINGPAT_LEN);
-            if ((Ext2Global->bHidingSuffix = Property->bHidingSuffix)) {
+            if ((Ext2Global->bHidingSuffix = Property2->bHidingSuffix)) {
                 RtlCopyMemory( Ext2Global->sHidingSuffix,
-                               Property->sHidingSuffix,
+                               Property2->sHidingSuffix,
                                HIDINGPAT_LEN - 1);
             }
-        }
 
-        if (Property->Command == APP_CMD_SET_PROPERTY3) {
+            case APP_CMD_SET_PROPERTY:
 
-            PEXT2_VOLUME_PROPERTY3 Prop3 = (PEXT2_VOLUME_PROPERTY3)Property;
+            if (Property->bReadonly) {
+                ClearLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
+                ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
+            } else {
+                SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
+                if (Property->bExt3Writable) {
+                    SetLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
+                } else {
+                    ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
+                }
+            }
 
-            if (Prop3->Flags & EXT2_VPROP3_AUTOMOUNT) {
-                if (Prop3->AutoMount)
-                    SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
-                else
-                    ClearLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+            PageTable = load_nls(Property->Codepage);
+            if (PageTable) {
+                memcpy(Ext2Global->Codepage.AnsiName, Property->Codepage, CODEPAGE_MAXLEN);
+                Ext2Global->Codepage.PageTable = PageTable;
             }
+
+            break;
+
+            default:
+            break;
         }
 
     } __finally {
@@ -350,13 +359,15 @@
 NTSTATUS
 Ext2ProcessVolumeProperty(
     IN  PEXT2_VCB              Vcb,
-    IN  PEXT2_VOLUME_PROPERTY2 Property,
+    IN  PEXT2_VOLUME_PROPERTY3 Property3,
     IN  ULONG Length
 )
 {
-    NTSTATUS        Status = STATUS_SUCCESS;
-    BOOLEAN         VcbResourceAcquired = FALSE;
     struct nls_table * PageTable = NULL;
+    PEXT2_VOLUME_PROPERTY2 Property2 = (PVOID)Property3;
+    PEXT2_VOLUME_PROPERTY  Property = (PVOID)Property3;
+    NTSTATUS Status = STATUS_SUCCESS;
+    BOOLEAN VcbResourceAcquired = FALSE;
 
     __try {
 
@@ -364,7 +375,7 @@
         VcbResourceAcquired = TRUE;
 
         if (Property->Command == APP_CMD_SET_PROPERTY ||
-                Property->Command == APP_CMD_QUERY_PROPERTY) {
+            Property->Command == APP_CMD_QUERY_PROPERTY) {
             if (Length < sizeof(EXT2_VOLUME_PROPERTY)) {
                 Status = STATUS_INVALID_PARAMETER;
                 __leave;
@@ -375,17 +386,67 @@
                 Status = STATUS_INVALID_PARAMETER;
                 __leave;
             }
+        } else if (Property->Command == APP_CMD_SET_PROPERTY3 ||
+                   Property->Command == APP_CMD_QUERY_PROPERTY3) {
+            if (Length < sizeof(EXT2_VOLUME_PROPERTY3)) {
+                Status = STATUS_INVALID_PARAMETER;
+                __leave;
+            }
         }
 
         switch (Property->Command) {
 
-        case APP_CMD_SET_PROPERTY:
+        case APP_CMD_SET_PROPERTY3:
+
+            if (Property3->Flags2 & EXT2_VPROP3_AUTOMOUNT) {
+                if (Property3->AutoMount)
+                    SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+                else
+                    ClearLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+            }
+            if (Property3->Flags2 & EXT2_VPROP3_USERIDS) {
+                SetFlag(Vcb->Flags, VCB_USER_IDS);
+                Vcb->uid = Property3->uid;
+                Vcb->gid = Property3->gid;
+                if (Property3->EIDS) {
+                    Vcb->euid = Property3->euid;
+                    Vcb->egid = Property3->egid;
+                    SetFlag(Vcb->Flags, VCB_USER_EIDS);
+                } else {
+                    Vcb->euid = Vcb->egid = 0;
+                    ClearFlag(Vcb->Flags, VCB_USER_EIDS);
+                }
+            } else {
+                ClearFlag(Vcb->Flags, VCB_USER_IDS);
+                ClearFlag(Vcb->Flags, VCB_USER_EIDS);
+                Vcb->uid = Vcb->gid = 0;
+                Vcb->euid = Vcb->egid = 0;
+            }
+
         case APP_CMD_SET_PROPERTY2:
 
-            if (Property->bReadonly) {
+            RtlZeroMemory(Vcb->sHidingPrefix, HIDINGPAT_LEN);
+            if (Vcb->bHidingPrefix = Property2->bHidingPrefix) {
+                RtlCopyMemory( Vcb->sHidingPrefix,
+                               Property2->sHidingPrefix,
+                               HIDINGPAT_LEN - 1);
+            }
+
+            RtlZeroMemory(Vcb->sHidingSuffix, HIDINGPAT_LEN);
+            if (Vcb->bHidingSuffix = Property2->bHidingSuffix) {
+                RtlCopyMemory( Vcb->sHidingSuffix,
+                               Property2->sHidingSuffix,
+                               HIDINGPAT_LEN - 1);
+            }
+            Vcb->DrvLetter = Property2->DrvLetter;
 
-                Ext2FlushFiles(NULL, Vcb, FALSE);
-                Ext2FlushVolume(NULL, Vcb, FALSE);
+        case APP_CMD_SET_PROPERTY:
+
+            if (Property->bReadonly) {
+                if (IsFlagOn(Vcb->Flags, VCB_INITIALIZED)) {
+                    Ext2FlushFiles(NULL, Vcb, FALSE);
+                    Ext2FlushVolume(NULL, Vcb, FALSE);
+                }
                 SetLongFlag(Vcb->Flags, VCB_READ_ONLY);
 
             } else {
@@ -418,29 +479,57 @@
                 Ext2InitializeLabel(Vcb, Vcb->SuperBlock);
             }
 
-            if (Property->Command == APP_CMD_SET_PROPERTY2) {
+            break;
+
+        case APP_CMD_QUERY_PROPERTY3:
 
-                RtlZeroMemory(Vcb->sHidingPrefix, HIDINGPAT_LEN);
-                if (Vcb->bHidingPrefix = Property->bHidingPrefix) {
-                    RtlCopyMemory( Vcb->sHidingPrefix,
-                                   Property->sHidingPrefix,
-                                   HIDINGPAT_LEN - 1);
-                }
+            if (IsFlagOn(Ext2Global->Flags, EXT2_AUTO_MOUNT)) {
+                SetFlag(Property3->Flags2, EXT2_VPROP3_AUTOMOUNT);
+                Property3->AutoMount = TRUE;
+            } else {
+                ClearFlag(Property3->Flags2, EXT2_VPROP3_AUTOMOUNT);
+                Property3->AutoMount = FALSE;
+            }
 
-                RtlZeroMemory(Vcb->sHidingSuffix, HIDINGPAT_LEN);
-                if (Vcb->bHidingSuffix = Property->bHidingSuffix) {
-                    RtlCopyMemory( Vcb->sHidingSuffix,
-                                   Property->sHidingSuffix,
-                                   HIDINGPAT_LEN - 1);
+            if (IsFlagOn(Vcb->Flags, VCB_USER_IDS)) {
+                SetFlag(Property3->Flags2, EXT2_VPROP3_USERIDS);
+                Property3->uid = Vcb->uid;
+                Property3->gid = Vcb->gid;
+                if (IsFlagOn(Vcb->Flags, VCB_USER_EIDS)) {
+                    Property3->EIDS = TRUE;
+                    Property3->euid = Vcb->euid;
+                    Property3->egid = Vcb->egid;
+                } else {
+                    Property3->EIDS = FALSE;
                 }
+            } else {
+                ClearFlag(Property3->Flags2, EXT2_VPROP3_USERIDS);
+            }
+
+        case APP_CMD_QUERY_PROPERTY2:
+
+            RtlCopyMemory(Property2->UUID, Vcb->SuperBlock->s_uuid, 16);
+            Property2->DrvLetter = Vcb->DrvLetter;
 
-                Vcb->DrvLetter = Property->DrvLetter;
+            if (Property2->bHidingPrefix = Vcb->bHidingPrefix) {
+                RtlCopyMemory( Property2->sHidingPrefix,
+                               Vcb->sHidingPrefix,
+                               HIDINGPAT_LEN);
+            } else {
+                RtlZeroMemory( Property2->sHidingPrefix,
+                               HIDINGPAT_LEN);
             }
 
-            break;
+            if (Property2->bHidingSuffix = Vcb->bHidingSuffix) {
+                RtlCopyMemory( Property2->sHidingSuffix,
+                               Vcb->sHidingSuffix,
+                               HIDINGPAT_LEN);
+            } else {
+                RtlZeroMemory( Property2->sHidingSuffix,
+                               HIDINGPAT_LEN);
+            }
 
         case APP_CMD_QUERY_PROPERTY:
-        case APP_CMD_QUERY_PROPERTY2:
 
             Property->bExt2 = TRUE;
             Property->bExt3 = Vcb->IsExt3fs;
@@ -457,32 +546,6 @@
             } else {
                 strncpy(Property->Codepage, "default", CODEPAGE_MAXLEN);
             }
-
-            if (Property->Command == APP_CMD_QUERY_PROPERTY2) {
-
-                RtlCopyMemory(Property->UUID, Vcb->SuperBlock->s_uuid, 16);
-
-                Property->DrvLetter = Vcb->DrvLetter;
-
-                if (Property->bHidingPrefix = Vcb->bHidingPrefix) {
-                    RtlCopyMemory( Property->sHidingPrefix,
-                                   Vcb->sHidingPrefix,
-                                   HIDINGPAT_LEN);
-                } else {
-                    RtlZeroMemory( Property->sHidingPrefix,
-                                   HIDINGPAT_LEN);
-                }
-
-                if (Property->bHidingSuffix = Vcb->bHidingSuffix) {
-                    RtlCopyMemory( Property->sHidingSuffix,
-                                   Vcb->sHidingSuffix,
-                                   HIDINGPAT_LEN);
-                } else {
-                    RtlZeroMemory( Property->sHidingSuffix,
-                                   HIDINGPAT_LEN);
-                }
-            }
-
             break;
 
         default:
@@ -503,7 +566,7 @@
 NTSTATUS
 Ext2ProcessUserProperty(
     IN PEXT2_IRP_CONTEXT        IrpContext,
-    IN PEXT2_VOLUME_PROPERTY2   Property,
+    IN PEXT2_VOLUME_PROPERTY3   Property,
     IN ULONG                    Length
 )
 {
diff -uNr 0.63/Ext3Fsd/ext3/generic.c 0.66/Ext3Fsd/ext3/generic.c
--- 0.63/Ext3Fsd/ext3/generic.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/ext3/generic.c	2016-04-19 16:38:20.000000000 +0200
@@ -127,6 +127,27 @@
     return TRUE;
 }
 
+VOID
+Ext2PutGroup(IN PEXT2_VCB Vcb)
+{
+    struct ext3_sb_info *sbi = &Vcb->sbi;
+    unsigned long i;
+
+
+    if (NULL == Vcb->sbi.s_gd) {
+        return;
+    }
+
+    for (i = 0; i < Vcb->sbi.s_gdb_count; i++) {
+        if (Vcb->sbi.s_gd[i].bh)
+            fini_bh(&sbi->s_gd[i].bh);
+    }
+
+    kfree(Vcb->sbi.s_gd);
+    Vcb->sbi.s_gd = NULL;
+}
+
+
 BOOLEAN
 Ext2LoadGroup(IN PEXT2_VCB Vcb)
 {
@@ -134,34 +155,56 @@
     struct ext3_sb_info *sbi = &Vcb->sbi;
     ext3_fsblk_t sb_block = 1;
     unsigned long i;
+    BOOLEAN rc = FALSE;
 
-    if (BLOCK_SIZE != EXT3_MIN_BLOCK_SIZE) {
-        sb_block = EXT4_MIN_BLOCK_SIZE / BLOCK_SIZE;
-    }
+    __try {
 
-    if (NULL == sbi->s_group_desc) {
-        sbi->s_group_desc = kzalloc(sbi->s_gdb_count * sizeof(ext3_fsblk_t),
-                                    GFP_KERNEL);
-    }
-    if (sbi->s_group_desc == NULL) {
-        DEBUG(DL_ERR, ("Ext2LoadGroup: not enough memory.\n"));
-        return FALSE;
-    }
+        ExAcquireResourceExclusiveLite(&Vcb->sbi.s_gd_lock, TRUE);
 
-    for (i = 0; i < sbi->s_gdb_count; i++) {
-        sbi->s_group_desc[i] =  descriptor_loc(sb, sb_block, i);
-        if (!sbi->s_group_desc[i]) {
-            DEBUG(DL_ERR, ("Ext2LoadGroup: can't read group descriptor %d\n", i));
-            return FALSE;
+        if (NULL == sbi->s_gd) {
+            sbi->s_gd = kzalloc(sbi->s_gdb_count * sizeof(struct ext3_gd),
+                                        GFP_KERNEL);
+        }
+        if (sbi->s_gd == NULL) {
+            DEBUG(DL_ERR, ("Ext2LoadGroup: not enough memory.\n"));
+            __leave;
         }
-    }
 
-    if (!ext4_check_descriptors(sb)) {
-        DEBUG(DL_ERR, ("Ext2LoadGroup: group descriptors corrupted!\n"));
-        return FALSE;
+        if (BLOCK_SIZE != EXT3_MIN_BLOCK_SIZE) {
+            sb_block = EXT4_MIN_BLOCK_SIZE / BLOCK_SIZE;
+        }
+
+        for (i = 0; i < sbi->s_gdb_count; i++) {
+            sbi->s_gd[i].block =  descriptor_loc(sb, sb_block, i);
+            if (!sbi->s_gd[i].block) {
+                DEBUG(DL_ERR, ("Ext2LoadGroup: can't locate group descriptor %d\n", i));
+                __leave;
+            }
+            sbi->s_gd[i].bh = sb_getblk(sb, sbi->s_gd[i].block);
+            if (!sbi->s_gd[i].bh) {
+                DEBUG(DL_ERR, ("Ext2LoadGroup: can't read group descriptor %d\n", i));
+                __leave;
+            }
+            sbi->s_gd[i].gd = (struct ext4_group_desc *)sbi->s_gd[i].bh->b_data;
+        }
+
+        if (!ext4_check_descriptors(sb)) {
+            DbgBreak();
+            DEBUG(DL_ERR, ("Ext2LoadGroup: group descriptors corrupted!\n"));
+            __leave;
+        }
+
+        rc = TRUE;
+
+    } __finally {
+
+        if (!rc)
+            Ext2PutGroup(Vcb);
+
+        ExReleaseResourceLite(&Vcb->sbi.s_gd_lock);
     }
 
-    return TRUE;
+    return rc;
 }
 
 
@@ -169,14 +212,26 @@
 Ext2DropGroup(IN PEXT2_VCB Vcb)
 {
     struct ext3_sb_info *sbi = &Vcb->sbi;
+    LARGE_INTEGER        timeout;
     unsigned long i;
 
-    if (NULL == sbi->s_group_desc) {
+    /* do nothing if Vcb is not initialized yet */
+    if (!IsFlagOn(Vcb->Flags, VCB_INITIALIZED))
         return;
+
+    __try {
+        SetFlag(Vcb->Flags, VCB_BEING_DROPPED);
+        ExAcquireResourceExclusiveLite(&Vcb->sbi.s_gd_lock, TRUE);
+        Ext2PutGroup(Vcb);
+    } __finally {
+        ExReleaseResourceLite(&Vcb->sbi.s_gd_lock);
     }
 
-    kfree(sbi->s_group_desc);
-    sbi->s_group_desc = NULL;
+    timeout.QuadPart = (LONGLONG)-10*1000*1000;
+    KeWaitForSingleObject(&Vcb->bd.bd_bh_notify,
+                           Executive, KernelMode,
+                           FALSE, &timeout);
+    ClearFlag(Vcb->Flags, VCB_BEING_DROPPED);
 }
 
 BOOLEAN
@@ -592,7 +647,7 @@
 
     *Block = 0;
 
-    ExAcquireResourceExclusiveLite(&Vcb->MetaLock, TRUE);
+    ExAcquireResourceExclusiveLite(&Vcb->MetaBlock, TRUE);
 
     /* validate the hint group and hint block */
     if (GroupHint >= Vcb->sbi.s_groups_count) {
@@ -762,7 +817,7 @@
 
 errorout:
 
-    ExReleaseResourceLite(&Vcb->MetaLock);
+    ExReleaseResourceLite(&Vcb->MetaBlock);
 
     if (bh)
         fini_bh(&bh);
@@ -799,7 +854,7 @@
 
     NTSTATUS        Status = STATUS_UNSUCCESSFUL;
 
-    ExAcquireResourceExclusiveLite(&Vcb->MetaLock, TRUE);
+    ExAcquireResourceExclusiveLite(&Vcb->MetaBlock, TRUE);
 
     DEBUG(DL_INF, ("Ext2FreeBlock: Block %xh - %x to be freed.\n",
                    Block, Block + Number));
@@ -916,7 +971,7 @@
     if (gb)
         fini_bh(&gb);
 
-    ExReleaseResourceLite(&Vcb->MetaLock);
+    ExReleaseResourceLite(&Vcb->MetaBlock);
 
     return Status;
 }
@@ -948,7 +1003,7 @@
 
     *Inode = dwInode = 0XFFFFFFFF;
 
-    ExAcquireResourceExclusiveLite(&Vcb->MetaLock, TRUE);
+    ExAcquireResourceExclusiveLite(&Vcb->MetaInode, TRUE);
 
     if (GroupHint >= Vcb->sbi.s_groups_count)
         GroupHint = GroupHint % Vcb->sbi.s_groups_count;
@@ -1272,7 +1327,7 @@
 
 errorout:
 
-    ExReleaseResourceLite(&Vcb->MetaLock);
+    ExReleaseResourceLite(&Vcb->MetaInode);
 
     if (bh)
         fini_bh(&bh);
@@ -1285,6 +1340,44 @@
 }
 
 NTSTATUS
+Ext2UpdateGroupDirStat(
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PEXT2_VCB            Vcb,
+    IN ULONG                group
+    )
+{
+    struct super_block     *sb = &Vcb->sb;
+    PEXT2_GROUP_DESC        gd;
+    struct buffer_head     *gb = NULL;
+    NTSTATUS                status;
+
+    ExAcquireResourceExclusiveLite(&Vcb->MetaInode, TRUE);
+
+    /* get group desc */
+    gd = ext4_get_group_desc(sb, group, &gb);
+    if (!gd) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto errorout;
+    }
+
+    /* update group_desc and super_block */
+    ext4_used_dirs_set(sb, gd, ext4_used_dirs_count(sb, gd) - 1);
+    Ext2SaveGroup(IrpContext, Vcb, group);
+    Ext2UpdateVcbStat(IrpContext, Vcb);
+    status = STATUS_SUCCESS;
+
+errorout:
+
+    ExReleaseResourceLite(&Vcb->MetaInode);
+
+    if (gb)
+        fini_bh(&gb);
+
+    return status;
+}
+
+
+NTSTATUS
 Ext2FreeInode(
     IN PEXT2_IRP_CONTEXT    IrpContext,
     IN PEXT2_VCB            Vcb,
@@ -1308,7 +1401,7 @@
 
     NTSTATUS        Status = STATUS_UNSUCCESSFUL;
 
-    ExAcquireResourceExclusiveLite(&Vcb->MetaLock, TRUE);
+    ExAcquireResourceExclusiveLite(&Vcb->MetaInode, TRUE);
 
     Group = (Inode - 1) / INODES_PER_GROUP;
     dwIno = (Inode - 1) % INODES_PER_GROUP;
@@ -1385,7 +1478,7 @@
 
 errorout:
 
-    ExReleaseResourceLite(&Vcb->MetaLock);
+    ExReleaseResourceLite(&Vcb->MetaInode);
 
     if (bh)
         fini_bh(&bh);
@@ -1474,7 +1567,8 @@
     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
     )
 {
     struct inode *dir = Dcb->Inode;
@@ -1507,15 +1601,21 @@
         if (le32_to_cpu(de->inode) != inode->i_ino)
             __leave;
 
-        ext3_set_de_type(inode->i_sb, de, inode->i_mode);
+        ext3_set_de_type(inode->i_sb, de, mode);
         mark_buffer_dirty(bh);
-        
-        //if (!inode->i_nlink)
-        //    ext3_orphan_add(handle, inode);
 
+        if (S_ISDIR(inode->i_mode) == S_ISDIR(mode)) {
+        } else if (S_ISDIR(inode->i_mode)) {
+            ext3_dec_count(dir);
+        } else if (S_ISDIR(mode)) {
+            ext3_inc_count(dir);
+        }
         dir->i_ctime = dir->i_mtime = ext3_current_time(dir);
         ext3_mark_inode_dirty(IrpContext, dir);
 
+        inode->i_mode = mode;
+        ext3_mark_inode_dirty(IrpContext, inode);
+
         Status = STATUS_SUCCESS;
 
     } __finally {
@@ -2134,27 +2234,30 @@
 __le16 ext4_group_desc_csum(struct ext3_sb_info *sbi, __u32 block_group,
                             struct ext4_group_desc *gdp)
 {
-    __u16 crc = 0;
-
-    if (sbi->s_es->s_feature_ro_compat &
-        cpu_to_le32(EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
-        int offset = offsetof(struct ext4_group_desc, bg_checksum);
-        __le32 le_group = cpu_to_le32(block_group);
-
-        crc = crc16(~0, sbi->s_es->s_uuid, sizeof(sbi->s_es->s_uuid));
-        crc = crc16(crc, (__u8 *)&le_group, sizeof(le_group));
-        crc = crc16(crc, (__u8 *)gdp, offset);
-        offset += sizeof(gdp->bg_checksum); /* skip checksum */
-        /* for checksum of struct ext4_group_desc do the rest...*/
-        if ((sbi->s_es->s_feature_incompat &
-                cpu_to_le32(EXT4_FEATURE_INCOMPAT_64BIT)) &&
-                offset < le16_to_cpu(sbi->s_es->s_desc_size))
-            crc = crc16(crc, (__u8 *)gdp + offset,
-                        le16_to_cpu(sbi->s_es->s_desc_size) -
-                        offset);
-    }
+	int offset;
+	__u16 crc = 0;
+	__le32 le_group = cpu_to_le32(block_group);
+
+	/* old crc16 code */
+	if (!(sbi->s_es->s_feature_ro_compat &
+	      cpu_to_le32(EXT4_FEATURE_RO_COMPAT_GDT_CSUM)))
+		return 0;
+
+	offset = offsetof(struct ext4_group_desc, bg_checksum);
+
+	crc = crc16(~0, sbi->s_es->s_uuid, sizeof(sbi->s_es->s_uuid));
+	crc = crc16(crc, (__u8 *)&le_group, sizeof(le_group));
+	crc = crc16(crc, (__u8 *)gdp, offset);
+	offset += sizeof(gdp->bg_checksum); /* skip checksum */
+	/* for checksum of struct ext4_group_desc do the rest...*/
+	if ((sbi->s_es->s_feature_incompat &
+	     cpu_to_le32(EXT4_FEATURE_INCOMPAT_64BIT)) &&
+	    offset < le16_to_cpu(sbi->s_es->s_desc_size))
+		crc = crc16(crc, (__u8 *)gdp + offset,
+			    le16_to_cpu(sbi->s_es->s_desc_size) -
+				offset);
 
-    return cpu_to_le16(crc);
+	return cpu_to_le16(crc);
 }
 
 int ext4_group_desc_csum_verify(struct ext3_sb_info *sbi, __u32 block_group,
@@ -2489,12 +2592,10 @@
                     ext4_group_t block_group, struct buffer_head **bh)
 {
     struct ext4_group_desc *desc = NULL;
-    struct buffer_head  *gb = NULL;
     struct ext3_sb_info *sbi = EXT3_SB(sb);
     PEXT2_VCB vcb = sb->s_priv;
-
-    unsigned int group;
-    unsigned int offset;
+    ext4_group_t group;
+    ext4_group_t offset;
 
     if (bh)
         *bh = NULL;
@@ -2507,44 +2608,33 @@
 
         return NULL;
     }
-    smp_rmb();
 
-    group = block_group >> EXT4_DESC_PER_BLOCK_BITS(sb);
-    offset = block_group & (EXT4_DESC_PER_BLOCK(sb) - 1);
+    __try {
 
-    if (!sbi->s_group_desc || !sbi->s_group_desc[group]) {
-        Ext2LoadGroup(vcb);
-    }
+        group = block_group >> EXT4_DESC_PER_BLOCK_BITS(sb);
+        offset = block_group & (EXT4_DESC_PER_BLOCK(sb) - 1);
 
-    if (!sbi->s_group_desc[group]) {
-        ext4_error(sb, "ext4_get_group_desc",
-                   "Group descriptor not loaded - "
-                   "block_group = %u, group = %u, desc = %u",
-                   block_group, group, offset);
-        goto errorout;
-    }
+        if (!sbi->s_gd || !sbi->s_gd[group].block ||
+            !sbi->s_gd[group].bh) {
+            if (!Ext2LoadGroup(vcb)) {
+                __leave;
+            }
+        }
 
-    gb = sb_getblk(sb, sbi->s_group_desc[group]);
-    if (!gb) {
-        ext4_error(sb, "ext4_get_group_desc",
-                   "failed to load group - "
-                   "block_group = %u, group = %u, desc = %u",
-                   block_group, group, offset);
-        goto errorout;
+        desc = (struct ext4_group_desc *)((PCHAR)sbi->s_gd[group].gd +
+                                          offset * EXT4_DESC_SIZE(sb));
+        if (bh) {
+            atomic_inc(&sbi->s_gd[group].bh->b_count);
+            *bh = sbi->s_gd[group].bh;
+        }
+    } __finally {
+        /* do cleanup */
     }
 
-    desc = (struct ext4_group_desc *)(gb->b_data +
-                      offset * EXT4_DESC_SIZE(sb));
-    if (bh)
-        *bh = gb;
-    else
-        fini_bh(&gb);
-
-errorout:
-
     return desc;
 }
 
+
 /**
  * ext4_count_free_blocks() -- count filesystem free blocks
  * @sb:		superblock
@@ -2670,7 +2760,8 @@
             printk(KERN_ERR "EXT4-fs: ext4_check_descriptors: "
                    "Checksum for group %u failed (%u!=%u)\n",
                    i, le16_to_cpu(ext4_group_desc_csum(sbi, i,
-                                                       gdp)), le16_to_cpu(gdp->bg_checksum));
+                                                       gdp)),
+                   le16_to_cpu(gdp->bg_checksum));
             if (!IsVcbReadOnly(Vcb)) {
                 __brelse(bh);
                 return 0;
diff -uNr 0.63/Ext3Fsd/Ext3fsd.rc 0.66/Ext3Fsd/Ext3fsd.rc
--- 0.63/Ext3Fsd/Ext3fsd.rc	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/Ext3fsd.rc	2016-04-19 16:38:20.000000000 +0200
@@ -1,97 +1,97 @@
-//Microsoft Developer Studio generated resource script.
-//
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#define APSTUDIO_HIDDEN_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_HIDDEN_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-#ifndef _MAC
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,63,3,12
- PRODUCTVERSION 0,63,3,12
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x3L
- FILESUBTYPE 0x8L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "Comments", "Matt Wu <matt@ext2fsd.com>\0"
-            VALUE "CompanyName", "www.ext2fsd.com\0"
-            VALUE "FileDescription", "Ext2 File System Driver for Windows\0"
-            VALUE "FileVersion", "0.63\0"
-            VALUE "InternalName", "Ext2Fsd.sys\0"
-            VALUE "LegalCopyright", "GPLv2\0"
-            VALUE "LegalTrademarks", "\0"
-            VALUE "OriginalFilename", "Ext2Fsd.sys\0"
-            VALUE "PrivateBuild", "\0"
-            VALUE "ProductName", "Ext2 File System Driver\0"
-            VALUE "ProductVersion", "0.63\0"
-            VALUE "SpecialBuild", "\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-#endif    // !_MAC
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
-    "#include ""windows.h""\r\n"
-    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE 
-BEGIN
-    "\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
+//Microsoft Developer Studio generated resource script.
+//
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,66,4,13
+ PRODUCTVERSION 0,66,4,13
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x3L
+ FILESUBTYPE 0x8L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "Matt Wu <matt@ext2fsd.com>\0"
+            VALUE "CompanyName", "www.ext2fsd.com\0"
+            VALUE "FileDescription", "Ext2 File System Driver for Windows\0"
+            VALUE "FileVersion", "0.66.4.13\0"
+            VALUE "InternalName", "Ext2Fsd.sys\0"
+            VALUE "LegalCopyright", "GPLv2\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "Ext2Fsd.sys\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "Ext2 File System Driver\0"
+            VALUE "ProductVersion", "0.66.4.13\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+#endif    // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "#include ""windows.h""\r\n"
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff -uNr 0.63/Ext3Fsd/ext3fsd.sln 0.66/Ext3Fsd/ext3fsd.sln
--- 0.63/Ext3Fsd/ext3fsd.sln	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/ext3fsd.sln	2016-04-19 16:38:20.000000000 +0200
@@ -1,50 +1,26 @@
 ﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.30723.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ext3fsd", "ext3fsd.vcxproj", "{436B9F7D-EE22-44BB-837A-EA319A14BA35}"
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ext3Fsd", "ext3fsd.vcproj", "{2328F787-71B4-408B-8E10-B7A95BF9A110}"
 EndProject
 Global
+	GlobalSection(SourceCodeControl) = preSolution
+		SccNumberOfProjects = 1
+		SccProjectUniqueName0 = ext3fsd.vcproj
+		SccProjectName0 = Ext3Fsd
+		SccLocalPath0 = .
+		SccProvider0 = MSSCCI:Perforce\u0020P4\u0020SCM
+		CanCheckoutShared = true
+	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Win7 Debug|Win32 = Win7 Debug|Win32
-		Win7 Debug|x64 = Win7 Debug|x64
-		Win7 Release|Win32 = Win7 Release|Win32
-		Win7 Release|x64 = Win7 Release|x64
-		Win8 Debug|Win32 = Win8 Debug|Win32
-		Win8 Debug|x64 = Win8 Debug|x64
-		Win8 Release|Win32 = Win8 Release|Win32
-		Win8 Release|x64 = Win8 Release|x64
-		Win8.1 Debug|Win32 = Win8.1 Debug|Win32
-		Win8.1 Debug|x64 = Win8.1 Debug|x64
-		Win8.1 Release|Win32 = Win8.1 Release|Win32
-		Win8.1 Release|x64 = Win8.1 Release|x64
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Debug|x64.Build.0 = Win7 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Release|Win32.Build.0 = Win7 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Release|x64.ActiveCfg = Win7 Release|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win7 Release|x64.Build.0 = Win7 Release|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Debug|x64.Build.0 = Win8 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Release|Win32.Build.0 = Win8 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Release|x64.ActiveCfg = Win8 Release|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8 Release|x64.Build.0 = Win8 Release|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64
-		{436B9F7D-EE22-44BB-837A-EA319A14BA35}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64
+		{2328F787-71B4-408B-8E10-B7A95BF9A110}.Debug|Win32.ActiveCfg = Debug|Win32
+		{2328F787-71B4-408B-8E10-B7A95BF9A110}.Debug|Win32.Build.0 = Debug|Win32
+		{2328F787-71B4-408B-8E10-B7A95BF9A110}.Release|Win32.ActiveCfg = Release|Win32
+		{2328F787-71B4-408B-8E10-B7A95BF9A110}.Release|Win32.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff -uNr 0.63/Ext3Fsd/ext3fsd.vcproj 0.66/Ext3Fsd/ext3fsd.vcproj
--- 0.63/Ext3Fsd/ext3fsd.vcproj	1970-01-01 01:00:00.000000000 +0100
+++ 0.66/Ext3Fsd/ext3fsd.vcproj	2016-04-19 16:38:20.000000000 +0200
@@ -0,0 +1,693 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="Ext3Fsd"
+	ProjectGUID="{2328F787-71B4-408B-8E10-B7A95BF9A110}"
+	SccProjectName="Ext3Fsd"
+	SccLocalPath="."
+	SccProvider="MSSCCI:Perforce P4 SCM"
+	Keyword="MakeFileProj"
+	TargetFrameworkVersion="0"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory=".\chk"
+			IntermediateDirectory=".\chk"
+			ConfigurationType="0"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			>
+			<Tool
+				Name="VCNMakeTool"
+				BuildCommandLine=".\DDKBuild.bat -W7XP chk ."
+				ReBuildCommandLine=".\DDKBuild.bat -W7XP chk . -ceZ"
+				CleanCommandLine=""
+				Output="Ext2Fsd.sys"
+				PreprocessorDefinitions=""
+				IncludeSearchPath=""
+				ForcedIncludes=""
+				AssemblySearchPath=""
+				ForcedUsingAssemblies=""
+				CompileAsManaged=""
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory=".\fre"
+			IntermediateDirectory=".\fre"
+			ConfigurationType="0"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			>
+			<Tool
+				Name="VCNMakeTool"
+				BuildCommandLine=".\DDKBuild.bat -W7XP fre ."
+				ReBuildCommandLine=".\DDKBuild.bat -W7XP fre . -cZ"
+				CleanCommandLine=""
+				Output="Ext3Fsd.sys"
+				PreprocessorDefinitions=""
+				IncludeSearchPath=""
+				ForcedIncludes=""
+				AssemblySearchPath=""
+				ForcedUsingAssemblies=""
+				CompileAsManaged=""
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath="access.c"
+				>
+			</File>
+			<File
+				RelativePath="block.c"
+				>
+			</File>
+			<File
+				RelativePath="cleanup.c"
+				>
+			</File>
+			<File
+				RelativePath="close.c"
+				>
+			</File>
+			<File
+				RelativePath="cmcb.c"
+				>
+			</File>
+			<File
+				RelativePath="create.c"
+				>
+			</File>
+			<File
+				RelativePath="debug.c"
+				>
+			</File>
+			<File
+				RelativePath="devctl.c"
+				>
+			</File>
+			<File
+				RelativePath="dirctl.c"
+				>
+			</File>
+			<File
+				RelativePath="dispatch.c"
+				>
+			</File>
+			<File
+				RelativePath="except.c"
+				>
+			</File>
+			<File
+				RelativePath="fastio.c"
+				>
+			</File>
+			<File
+				RelativePath="fileinfo.c"
+				>
+			</File>
+			<File
+				RelativePath="flush.c"
+				>
+			</File>
+			<File
+				RelativePath="fsctl.c"
+				>
+			</File>
+			<File
+				RelativePath="init.c"
+				>
+			</File>
+			<File
+				RelativePath="linux.c"
+				>
+			</File>
+			<File
+				RelativePath="lock.c"
+				>
+			</File>
+			<File
+				RelativePath="memory.c"
+				>
+			</File>
+			<File
+				RelativePath="misc.c"
+				>
+			</File>
+			<File
+				RelativePath="nls.c"
+				>
+			</File>
+			<File
+				RelativePath="pnp.c"
+				>
+			</File>
+			<File
+				RelativePath="rbtree.c"
+				>
+			</File>
+			<File
+				RelativePath="read.c"
+				>
+			</File>
+			<File
+				RelativePath="shutdown.c"
+				>
+			</File>
+			<File
+				RelativePath="volinfo.c"
+				>
+			</File>
+			<File
+				RelativePath="write.c"
+				>
+			</File>
+			<Filter
+				Name="nls"
+				>
+				<File
+					RelativePath="nls\MAKEFILE"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_ascii.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_base.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp1250.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp1251.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp1255.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp437.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp737.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp775.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp850.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp852.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp855.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp857.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp860.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp861.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp862.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp863.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp864.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp865.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp866.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp869.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp874.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp932.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp936.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp949.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_cp950.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_euc-jp.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-1.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-13.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-14.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-15.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-2.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-3.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-4.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-5.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-6.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-7.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_iso8859-9.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_koi8-r.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_koi8-ru.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_koi8-u.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\nls_utf8.c"
+					>
+				</File>
+				<File
+					RelativePath="nls\sources"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="ext3"
+				>
+				<File
+					RelativePath="ext3\generic.c"
+					>
+				</File>
+				<File
+					RelativePath="ext3\htree.c"
+					>
+				</File>
+				<File
+					RelativePath="ext3\indirect.c"
+					>
+				</File>
+				<File
+					RelativePath="ext3\MAKEFILE"
+					>
+				</File>
+				<File
+					RelativePath="ext3\recover.c"
+					>
+				</File>
+				<File
+					RelativePath="ext3\sources"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="ext4"
+				>
+				<File
+					RelativePath="ext4\ext4_bh.c"
+					>
+				</File>
+				<File
+					RelativePath="ext4\ext4_extents.c"
+					>
+				</File>
+				<File
+					RelativePath="ext4\ext4_jbd2.c"
+					>
+				</File>
+				<File
+					RelativePath="ext4\extents.c"
+					>
+				</File>
+				<File
+					RelativePath="ext4\MAKEFILE"
+					>
+				</File>
+				<File
+					RelativePath="ext4\Sources"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="jbd"
+				>
+				<File
+					RelativePath="jbd\recovery.c"
+					>
+				</File>
+				<File
+					RelativePath="jbd\replay.c"
+					>
+				</File>
+				<File
+					RelativePath="jbd\revoke.c"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath="include\common.h"
+				>
+			</File>
+			<File
+				RelativePath="include\ext2fs.h"
+				>
+			</File>
+			<File
+				RelativePath="include\ntifs.gnu.h"
+				>
+			</File>
+			<File
+				RelativePath="include\resource.h"
+				>
+			</File>
+			<Filter
+				Name="Linux"
+				>
+				<File
+					RelativePath="include\linux\atomic.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\bit_spinlock.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\bitops.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\buffer_head.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\config.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\debugfs.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\errno.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\Ext2_fs.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\ext3_fs.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\ext3_fs_i.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\ext3_fs_sb.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\ext3_jbd.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\ext4_ext.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\freezer.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\fs.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\group.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\highmem.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\init.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\jbd.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\journal-head.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\kernel.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\kthread.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\list.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\lockdep.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\log2.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\magic.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\mm.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\module.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\mutex.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\nls.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\pagemap.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\poison.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\proc_fs.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\rbtree.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\sched.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\slab.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\spinlock.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\stddef.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\string.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\time.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\timer.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\types.h"
+					>
+				</File>
+				<File
+					RelativePath="include\linux\version.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="asm"
+				>
+				<File
+					RelativePath="include\asm\page.h"
+					>
+				</File>
+				<File
+					RelativePath="include\asm\semaphore.h"
+					>
+				</File>
+				<File
+					RelativePath="include\asm\uaccess.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+			<File
+				RelativePath="DIRS"
+				>
+			</File>
+			<File
+				RelativePath="Ext3Fsd.rc"
+				>
+			</File>
+			<File
+				RelativePath="sys\MAKEFILE"
+				>
+			</File>
+			<File
+				RelativePath="sys\sources"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Douments"
+			>
+			<File
+				RelativePath="COPYRIGHT.TXT"
+				>
+			</File>
+			<File
+				RelativePath="FAQ.txt"
+				>
+			</File>
+			<File
+				RelativePath="notes.txt"
+				>
+			</File>
+			<File
+				RelativePath="readme.txt"
+				>
+			</File>
+			<File
+				RelativePath="TODO.txt"
+				>
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff -uNr 0.63/Ext3Fsd/ext3fsd.vcxproj 0.66/Ext3Fsd/ext3fsd.vcxproj
--- 0.63/Ext3Fsd/ext3fsd.vcxproj	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/ext3fsd.vcxproj	1970-01-01 01:00:00.000000000 +0100
@@ -1,617 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Win8.1 Debug|Win32">
-      <Configuration>Win8.1 Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Debug|Win32">
-      <Configuration>Win8 Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Debug|Win32">
-      <Configuration>Win7 Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8.1 Release|Win32">
-      <Configuration>Win8.1 Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Release|Win32">
-      <Configuration>Win8 Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Release|Win32">
-      <Configuration>Win7 Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8.1 Debug|x64">
-      <Configuration>Win8.1 Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Debug|x64">
-      <Configuration>Win8 Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Debug|x64">
-      <Configuration>Win7 Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8.1 Release|x64">
-      <Configuration>Win8.1 Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win8 Release|x64">
-      <Configuration>Win8 Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Win7 Release|x64">
-      <Configuration>Win7 Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{436B9F7D-EE22-44BB-837A-EA319A14BA35}</ProjectGuid>
-    <RootNamespace>$(MSBuildProjectName)</RootNamespace>
-    <Configuration Condition="'$(Configuration)' == ''">Win8.1 Debug</Configuration>
-    <Platform Condition="'$(Platform)' == ''">Win32</Platform>
-    <SampleGuid>{E03CD624-F999-4AC6-8742-6FE38CE413F2}</SampleGuid>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <TargetVersion>Win7</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <DriverType>WDM</DriverType>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <TargetVersion>Win8</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <DriverType>WDM</DriverType>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
-    <TargetVersion>WindowsV6.3</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <TargetVersion>Win7</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <TargetVersion>Win8</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
-    <TargetVersion>WindowsV6.3</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <TargetVersion>Win7</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <TargetVersion>Win8</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
-    <TargetVersion>WindowsV6.3</TargetVersion>
-    <UseDebugLibraries>False</UseDebugLibraries>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <DriverType>WDM</DriverType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <TargetVersion>Win7</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <TargetVersion>Win8</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
-    <TargetVersion>WindowsV6.3</TargetVersion>
-    <UseDebugLibraries>True</UseDebugLibraries>
-    <DriverType>WDM</DriverType>
-    <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
-    <ConfigurationType>Driver</ConfigurationType>
-    <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <PropertyGroup>
-    <OutDir>$(IntDir)</OutDir>
-  </PropertyGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
-  <ItemGroup Label="WrappedTaskItems">
-    <ClCompile Include="access.c" />
-    <ClCompile Include="block.c" />
-    <ClCompile Include="cleanup.c" />
-    <ClCompile Include="close.c" />
-    <ClCompile Include="cmcb.c" />
-    <ClCompile Include="create.c" />
-    <ClCompile Include="debug.c" />
-    <ClCompile Include="devctl.c" />
-    <ClCompile Include="dirctl.c" />
-    <ClCompile Include="dispatch.c" />
-    <ClCompile Include="except.c" />
-    <ClCompile Include="ext3\generic.c" />
-    <ClCompile Include="ext3\htree.c" />
-    <ClCompile Include="ext3\indirect.c" />
-    <ClCompile Include="ext3\recover.c" />
-    <ClCompile Include="ext4\ext4_bh.c" />
-    <ClCompile Include="ext4\ext4_extents.c" />
-    <ClCompile Include="ext4\ext4_jbd2.c" />
-    <ClCompile Include="ext4\extents.c" />
-    <ClCompile Include="fastio.c" />
-    <ClCompile Include="fileinfo.c" />
-    <ClCompile Include="flush.c" />
-    <ClCompile Include="fsctl.c" />
-    <ClCompile Include="init.c" />
-    <ClCompile Include="jbd\recovery.c" />
-    <ClCompile Include="jbd\replay.c" />
-    <ClCompile Include="jbd\revoke.c" />
-    <ClCompile Include="linux.c" />
-    <ClCompile Include="lock.c" />
-    <ClCompile Include="memory.c" />
-    <ClCompile Include="misc.c" />
-    <ClCompile Include="nls.c" />
-    <ClCompile Include="nls\nls_ascii.c" />
-    <ClCompile Include="nls\nls_base.c" />
-    <ClCompile Include="nls\nls_cp1250.c" />
-    <ClCompile Include="nls\nls_cp1251.c" />
-    <ClCompile Include="nls\nls_cp1255.c" />
-    <ClCompile Include="nls\nls_cp437.c" />
-    <ClCompile Include="nls\nls_cp737.c" />
-    <ClCompile Include="nls\nls_cp775.c" />
-    <ClCompile Include="nls\nls_cp850.c" />
-    <ClCompile Include="nls\nls_cp852.c" />
-    <ClCompile Include="nls\nls_cp855.c" />
-    <ClCompile Include="nls\nls_cp857.c" />
-    <ClCompile Include="nls\nls_cp860.c" />
-    <ClCompile Include="nls\nls_cp861.c" />
-    <ClCompile Include="nls\nls_cp862.c" />
-    <ClCompile Include="nls\nls_cp863.c" />
-    <ClCompile Include="nls\nls_cp864.c" />
-    <ClCompile Include="nls\nls_cp865.c" />
-    <ClCompile Include="nls\nls_cp866.c" />
-    <ClCompile Include="nls\nls_cp869.c" />
-    <ClCompile Include="nls\nls_cp874.c" />
-    <ClCompile Include="nls\nls_cp932.c" />
-    <ClCompile Include="nls\nls_cp936.c" />
-    <ClCompile Include="nls\nls_cp949.c" />
-    <ClCompile Include="nls\nls_cp950.c" />
-    <ClCompile Include="nls\nls_euc-jp.c" />
-    <ClCompile Include="nls\nls_iso8859-1.c" />
-    <ClCompile Include="nls\nls_iso8859-13.c" />
-    <ClCompile Include="nls\nls_iso8859-14.c" />
-    <ClCompile Include="nls\nls_iso8859-15.c" />
-    <ClCompile Include="nls\nls_iso8859-2.c" />
-    <ClCompile Include="nls\nls_iso8859-3.c" />
-    <ClCompile Include="nls\nls_iso8859-4.c" />
-    <ClCompile Include="nls\nls_iso8859-5.c" />
-    <ClCompile Include="nls\nls_iso8859-6.c" />
-    <ClCompile Include="nls\nls_iso8859-7.c" />
-    <ClCompile Include="nls\nls_iso8859-9.c" />
-    <ClCompile Include="nls\nls_koi8-r.c" />
-    <ClCompile Include="nls\nls_koi8-ru.c" />
-    <ClCompile Include="nls\nls_koi8-u.c" />
-    <ClCompile Include="nls\nls_utf8.c" />
-    <ClCompile Include="pnp.c" />
-    <ClCompile Include="rbtree.c" />
-    <ClCompile Include="read.c" />
-    <ClCompile Include="shutdown.c" />
-    <ClCompile Include="volinfo.c" />
-    <ClCompile Include="write.c" />
-  </ItemGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <TargetName>ext3fsd</TargetName>
-    <TargetExt>.sys</TargetExt>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
-    <TargetName>ext3fsd</TargetName>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <WarningLevel>Level1</WarningLevel>
-      <ShowIncludes>false</ShowIncludes>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-      <CompileAs>
-      </CompileAs>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
-    <ClCompile>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <AdditionalIncludeDirectories>./include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>__KERNEL__;__X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <TreatWarningAsError>true</TreatWarningAsError>
-      <WarningLevel>Level1</WarningLevel>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <Inf Exclude="@(Inf)" Include="*.inf" />
-    <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="COPYRIGHT.TXT" />
-    <None Include="DIRS" />
-    <None Include="jbd\MAKEFILE" />
-    <None Include="jbd\sources" />
-    <None Include="nls\MAKEFILE" />
-    <None Include="nls\sources" />
-    <None Include="sys\MAKEFILE" />
-    <None Include="sys\sources" />
-    <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
-    <None Include="ext3\MAKEFILE" />
-    <None Include="ext3\sources" />
-    <None Include="ext4\MAKEFILE" />
-    <None Include="ext4\Sources" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
-    <ClInclude Include="include\asm\page.h" />
-    <ClInclude Include="include\asm\semaphore.h" />
-    <ClInclude Include="include\asm\uaccess.h" />
-    <ClInclude Include="include\common.h" />
-    <ClInclude Include="include\ext2fs.h" />
-    <ClInclude Include="include\linux\atomic.h" />
-    <ClInclude Include="include\linux\bitops.h" />
-    <ClInclude Include="include\linux\bit_spinlock.h" />
-    <ClInclude Include="include\linux\buffer_head.h" />
-    <ClInclude Include="include\linux\config.h" />
-    <ClInclude Include="include\linux\debugfs.h" />
-    <ClInclude Include="include\linux\errno.h" />
-    <ClInclude Include="include\linux\Ext2_fs.h" />
-    <ClInclude Include="include\linux\ext3_fs.h" />
-    <ClInclude Include="include\linux\ext3_fs_i.h" />
-    <ClInclude Include="include\linux\ext3_fs_sb.h" />
-    <ClInclude Include="include\linux\ext3_jbd.h" />
-    <ClInclude Include="include\linux\ext4.h" />
-    <ClInclude Include="include\linux\ext4_ext.h" />
-    <ClInclude Include="include\linux\ext4_jbd2.h" />
-    <ClInclude Include="include\linux\freezer.h" />
-    <ClInclude Include="include\linux\fs.h" />
-    <ClInclude Include="include\linux\group.h" />
-    <ClInclude Include="include\linux\highmem.h" />
-    <ClInclude Include="include\linux\init.h" />
-    <ClInclude Include="include\linux\jbd.h" />
-    <ClInclude Include="include\linux\journal-head.h" />
-    <ClInclude Include="include\linux\kernel.h" />
-    <ClInclude Include="include\linux\kthread.h" />
-    <ClInclude Include="include\linux\list.h" />
-    <ClInclude Include="include\linux\lockdep.h" />
-    <ClInclude Include="include\linux\log2.h" />
-    <ClInclude Include="include\linux\magic.h" />
-    <ClInclude Include="include\linux\mm.h" />
-    <ClInclude Include="include\linux\module.h" />
-    <ClInclude Include="include\linux\mutex.h" />
-    <ClInclude Include="include\linux\nls.h" />
-    <ClInclude Include="include\linux\pagemap.h" />
-    <ClInclude Include="include\linux\poison.h" />
-    <ClInclude Include="include\linux\proc_fs.h" />
-    <ClInclude Include="include\linux\rbtree.h" />
-    <ClInclude Include="include\linux\sched.h" />
-    <ClInclude Include="include\linux\slab.h" />
-    <ClInclude Include="include\linux\spinlock.h" />
-    <ClInclude Include="include\linux\stddef.h" />
-    <ClInclude Include="include\linux\string.h" />
-    <ClInclude Include="include\linux\time.h" />
-    <ClInclude Include="include\linux\timer.h" />
-    <ClInclude Include="include\linux\types.h" />
-    <ClInclude Include="include\linux\version.h" />
-    <ClInclude Include="include\ntifs.gnu.h" />
-    <ClInclude Include="include\resource.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="ext3fsd.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Text Include="FAQ.txt" />
-    <Text Include="notes.txt" />
-    <Text Include="readme.txt" />
-    <Text Include="TODO.txt" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-</Project>
\ Pas de fin de ligne à la fin du fichier
diff -uNr 0.63/Ext3Fsd/ext3fsd.vcxproj.filters 0.66/Ext3Fsd/ext3fsd.vcxproj.filters
--- 0.63/Ext3Fsd/ext3fsd.vcxproj.filters	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/ext3fsd.vcxproj.filters	1970-01-01 01:00:00.000000000 +0100
@@ -1,831 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="*.def;*.bat;*.hpj;*.asmx" />
-    <None Include="ext3\MAKEFILE">
-      <Filter>ext3</Filter>
-    </None>
-    <None Include="ext3\sources">
-      <Filter>ext3</Filter>
-    </None>
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="auto.bat" />
-    <None Include="bscmake.bat" />
-    <None Include="bscold.bat" />
-    <None Include="clean.bat" />
-    <None Include="cp.bat" />
-    <None Include="ddkbuild.bat" />
-    <None Include="exclude.bat" />
-    <None Include="FilesChanged.bat" />
-    <None Include="mingw.bat" />
-    <None Include="odyfre.bat" />
-    <None Include="vm1.bat" />
-    <None Include="vm2.bat" />
-    <None Include="win7.bat" />
-    <None Include="ext4\MAKEFILE">
-      <Filter>ext4</Filter>
-    </None>
-    <None Include="ext4\Sources">
-      <Filter>ext4</Filter>
-    </None>
-    <None Include="COPYRIGHT.TXT">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="COPYRIGHT.TXT">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="COPYRIGHT.TXT">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="COPYRIGHT.TXT">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="FAQ.txt" />
-    <None Include="notes.txt" />
-    <None Include="readme.txt" />
-    <None Include="TODO.txt" />
-    <None Include="DIRS" />
-    <None Include="jbd\MAKEFILE">
-      <Filter>jbd</Filter>
-    </None>
-    <None Include="jbd\sources">
-      <Filter>jbd</Filter>
-    </None>
-    <None Include="nls\MAKEFILE">
-      <Filter>nls</Filter>
-    </None>
-    <None Include="nls\sources">
-      <Filter>nls</Filter>
-    </None>
-    <None Include="sys\MAKEFILE">
-      <Filter>sys</Filter>
-    </None>
-    <None Include="sys\sources">
-      <Filter>sys</Filter>
-    </None>
-    <None Include="TODO.txt">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="notes.txt">
-      <Filter>documents</Filter>
-    </None>
-    <None Include="FAQ.txt">
-      <Filter>documents</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <Filter Include="ext3">
-      <UniqueIdentifier>{9472ae84-72f8-4a0c-b1f5-facadbe76b0f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="ext4">
-      <UniqueIdentifier>{621bab59-4de9-4263-8c8c-3fdece60e4e5}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="jbd">
-      <UniqueIdentifier>{3715f6b2-0195-4dd9-88fc-9360096c01e4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="nls">
-      <UniqueIdentifier>{38546a89-db96-4e30-a960-19e384235eaa}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="inc">
-      <UniqueIdentifier>{863c3530-1902-490b-b3e0-4d6e1f4bc8a4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="sys">
-      <UniqueIdentifier>{5db68b79-6dcb-4030-ab0d-25689366ecac}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="inc\asm">
-      <UniqueIdentifier>{3e13b5bf-2352-4bf4-9c88-a9dc82f40068}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="inc\linux">
-      <UniqueIdentifier>{ee6107a6-737e-48a4-bc5e-d8ad435b7585}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="documents">
-      <UniqueIdentifier>{698db3f2-13ae-4242-86c4-d029338ca26f}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="include\common.h">
-      <Filter>inc</Filter>
-    </ClInclude>
-    <ClInclude Include="include\ext2fs.h">
-      <Filter>inc</Filter>
-    </ClInclude>
-    <ClInclude Include="include\ntifs.gnu.h">
-      <Filter>inc</Filter>
-    </ClInclude>
-    <ClInclude Include="include\resource.h">
-      <Filter>inc</Filter>
-    </ClInclude>
-    <ClInclude Include="include\asm\page.h">
-      <Filter>inc\asm</Filter>
-    </ClInclude>
-    <ClInclude Include="include\asm\semaphore.h">
-      <Filter>inc\asm</Filter>
-    </ClInclude>
-    <ClInclude Include="include\asm\uaccess.h">
-      <Filter>inc\asm</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\atomic.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\bit_spinlock.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\bitops.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\buffer_head.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\config.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\debugfs.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\errno.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\Ext2_fs.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext3_fs.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext3_fs_i.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext3_fs_sb.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext3_jbd.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext4.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext4_ext.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\ext4_jbd2.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\freezer.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\fs.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\group.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\highmem.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\init.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\jbd.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\journal-head.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\kernel.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\kthread.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\list.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\lockdep.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\log2.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\magic.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\mm.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\module.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\mutex.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\nls.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\pagemap.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\poison.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\proc_fs.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\rbtree.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\sched.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\slab.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\spinlock.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\stddef.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\string.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\time.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\timer.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\types.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-    <ClInclude Include="include\linux\version.h">
-      <Filter>inc\linux</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="ext3\generic.c">
-      <Filter>ext3</Filter>
-    </ClCompile>
-    <ClCompile Include="ext3\htree.c">
-      <Filter>ext3</Filter>
-    </ClCompile>
-    <ClCompile Include="ext3\indirect.c">
-      <Filter>ext3</Filter>
-    </ClCompile>
-    <ClCompile Include="ext3\recover.c">
-      <Filter>ext3</Filter>
-    </ClCompile>
-    <ClCompile Include="ext4\ext4_bh.c">
-      <Filter>ext4</Filter>
-    </ClCompile>
-    <ClCompile Include="ext4\ext4_extents.c">
-      <Filter>ext4</Filter>
-    </ClCompile>
-    <ClCompile Include="ext4\ext4_jbd2.c">
-      <Filter>ext4</Filter>
-    </ClCompile>
-    <ClCompile Include="ext4\extents.c">
-      <Filter>ext4</Filter>
-    </ClCompile>
-    <ClCompile Include="block.c" />
-    <ClCompile Include="cleanup.c" />
-    <ClCompile Include="close.c" />
-    <ClCompile Include="cmcb.c" />
-    <ClCompile Include="create.c" />
-    <ClCompile Include="debug.c" />
-    <ClCompile Include="devctl.c" />
-    <ClCompile Include="dirctl.c" />
-    <ClCompile Include="dispatch.c" />
-    <ClCompile Include="except.c" />
-    <ClCompile Include="fastio.c" />
-    <ClCompile Include="fileinfo.c" />
-    <ClCompile Include="flush.c" />
-    <ClCompile Include="fsctl.c" />
-    <ClCompile Include="init.c" />
-    <ClCompile Include="linux.c" />
-    <ClCompile Include="lock.c" />
-    <ClCompile Include="memory.c" />
-    <ClCompile Include="misc.c" />
-    <ClCompile Include="nls.c" />
-    <ClCompile Include="pnp.c" />
-    <ClCompile Include="rbtree.c" />
-    <ClCompile Include="read.c" />
-    <ClCompile Include="shutdown.c" />
-    <ClCompile Include="volinfo.c" />
-    <ClCompile Include="write.c" />
-    <ClCompile Include="jbd\recovery.c">
-      <Filter>jbd</Filter>
-    </ClCompile>
-    <ClCompile Include="jbd\replay.c">
-      <Filter>jbd</Filter>
-    </ClCompile>
-    <ClCompile Include="jbd\revoke.c">
-      <Filter>jbd</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_ascii.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_base.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp437.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp737.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp775.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp850.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp852.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp855.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp857.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp860.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp861.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp862.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp863.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp864.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp865.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp866.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp869.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp874.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp932.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp936.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp949.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp950.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp1250.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp1251.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_cp1255.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_euc-jp.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-1.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-2.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-3.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-4.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-5.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-6.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-7.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-9.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-13.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-14.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_iso8859-15.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_koi8-r.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_koi8-ru.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_koi8-u.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="nls\nls_utf8.c">
-      <Filter>nls</Filter>
-    </ClCompile>
-    <ClCompile Include="access.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="ext3fsd.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Text Include="FAQ.txt">
-      <Filter>documents</Filter>
-    </Text>
-    <Text Include="notes.txt">
-      <Filter>documents</Filter>
-    </Text>
-    <Text Include="readme.txt">
-      <Filter>documents</Filter>
-    </Text>
-    <Text Include="TODO.txt">
-      <Filter>documents</Filter>
-    </Text>
-  </ItemGroup>
-</Project>
\ Pas de fin de ligne à la fin du fichier
diff -uNr 0.63/Ext3Fsd/ext4/ext4_extents.c 0.66/Ext3Fsd/ext4/ext4_extents.c
--- 0.63/Ext3Fsd/ext4/ext4_extents.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/ext4/ext4_extents.c	2016-04-19 16:38:20.000000000 +0200
@@ -1096,6 +1096,77 @@
 	return err;
 }
 
+static int ext4_ext_shrink_indepth(void *icb,
+				   handle_t *handle,
+				   struct inode *inode,
+				   unsigned int flags,
+				   int *shrinked)
+{
+	struct ext4_extent_header *eh, *neh;
+	struct ext4_extent_idx *ix;
+	struct buffer_head *bh = NULL;
+	ext4_fsblk_t block;
+	int err = 0, depth = ext_depth(inode);
+	int neh_entries;
+	*shrinked = 0;
+
+	if (!depth)
+		return 0;
+
+	eh = ext_inode_hdr(inode);
+	if (le16_to_cpu(eh->eh_entries) != 1)
+		return 0;
+
+	ix = EXT_FIRST_INDEX(eh);
+	block = ext4_idx_pblock(ix);
+	bh = extents_bread(inode->i_sb, block);
+	if (!bh)
+		goto out;
+
+	/* set size of new block */
+	neh = ext_block_hdr(bh);
+	neh_entries = le16_to_cpu(neh->eh_entries);
+	if (!neh->eh_depth &&
+	    neh_entries > ext4_ext_space_root(inode, 0))
+		goto out;
+
+	if (neh->eh_depth &&
+	    neh_entries > ext4_ext_space_root_idx(inode, 0))
+		goto out;
+
+	/* old root could have indexes or leaves
+	 * so calculate e_max right way */
+	if (neh->eh_depth)
+		eh->eh_max = cpu_to_le16(ext4_ext_space_root_idx(inode, 0));
+	else
+		eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
+
+	eh->eh_magic = cpu_to_le16(EXT4_EXT_MAGIC);
+	eh->eh_entries = neh_entries;
+	if (neh->eh_depth) {
+		memmove(EXT_FIRST_INDEX(eh),
+			EXT_FIRST_INDEX(neh),
+			sizeof(struct ext4_extent_idx) * neh_entries);
+	} else {
+		memmove(EXT_FIRST_EXTENT(eh),
+			EXT_FIRST_EXTENT(neh),
+			sizeof(struct ext4_extent) * neh_entries);
+	}
+	le16_add_cpu(&eh->eh_depth, -1);
+
+	ext4_mark_inode_dirty(icb, handle, inode);
+	*shrinked = 1;
+out:
+	if (bh)
+		extents_brelse(bh);
+
+	if (*shrinked)
+		ext4_free_blocks(icb, handle, inode, NULL,
+				 block, 1, flags);
+
+	return err;
+}
+
 /*
  * ext4_ext_create_new_leaf:
  * finds empty index and adds new leaf.
@@ -1353,29 +1424,25 @@
  * with leaves.
  */
 ext4_lblk_t
-ext4_ext_next_allocated_block(struct ext4_ext_path *path)
+ext4_ext_next_allocated_block(struct ext4_ext_path *path, int at)
 {
-	int depth;
-
-	depth = path->p_depth;
-
-	if (depth == 0 && path->p_ext == NULL)
+	if (at == 0 && !path->p_ext && !path->p_idx)
 		return EXT_MAX_BLOCKS;
 
-	while (depth >= 0) {
-		if (depth == path->p_depth) {
+	while (at >= 0) {
+		if (at == path->p_depth) {
 			/* leaf */
-			if (path[depth].p_ext &&
-					path[depth].p_ext !=
-					EXT_LAST_EXTENT(path[depth].p_hdr))
-				return le32_to_cpu(path[depth].p_ext[1].ee_block);
+			if (path[at].p_ext &&
+				path[at].p_ext !=
+					EXT_LAST_EXTENT(path[at].p_hdr))
+			  return le32_to_cpu(path[at].p_ext[1].ee_block);
 		} else {
 			/* index */
-			if (path[depth].p_idx !=
-					EXT_LAST_INDEX(path[depth].p_hdr))
-				return le32_to_cpu(path[depth].p_idx[1].ei_block);
+			if (path[at].p_idx !=
+					EXT_LAST_INDEX(path[at].p_hdr))
+			  return le32_to_cpu(path[at].p_idx[1].ei_block);
 		}
-		depth--;
+		at--;
 	}
 
 	return EXT_MAX_BLOCKS;
@@ -1412,12 +1479,14 @@
 
 /*
  * ext4_ext_correct_indexes:
- * if leaf gets modified and modified extent is first in the leaf,
+ * if leaf/node gets modified and modified extent/index
+ * is first in the leaf/node,
  * then we have to correct all indexes above.
- * TODO: do we need to correct tree in all cases?
  */
-static int ext4_ext_correct_indexes(void *icb, handle_t *handle, struct inode *inode,
-		struct ext4_ext_path *path)
+static int ext4_ext_correct_indexes(void *icb, handle_t *handle,
+				    struct inode *inode,
+				    struct ext4_ext_path *path,
+				    int at)
 {
 	struct ext4_extent_header *eh;
 	int depth = ext_depth(inode);
@@ -1425,49 +1494,49 @@
 	__le32 border;
 	int k, err = 0;
 
-	eh = path[depth].p_hdr;
-	ex = path[depth].p_ext;
+	assert(at >= 0);
+	if (!at)
+		return 0;
 
-	if (unlikely(ex == NULL || eh == NULL)) {
-		EXT4_ERROR_INODE(inode,
-				"ex %p == NULL or eh %p == NULL", ex, eh);
-		return -EIO;
-	}
+	if (depth == at) {
+		eh = path[at].p_hdr;
+		ex = path[at].p_ext;
 
-	if (depth == 0) {
-		/* there is no tree at all */
-		return 0;
-	}
+		if (ex == NULL || eh == NULL)
+			return -EIO;
 
-	if (ex != EXT_FIRST_EXTENT(eh)) {
-		/* we correct tree if first leaf got modified only */
-		return 0;
-	}
+		if (at == 0) {
+			/* there is no tree at all */
+			return 0;
+		}
 
-	/*
-	 * TODO: we need correction if border is smaller than current one
-	 */
-	k = depth - 1;
-	border = path[depth].p_ext->ee_block;
-	err = ext4_ext_get_access(icb, handle, inode, path + k);
-	if (err)
-		return err;
-	path[k].p_idx->ei_block = border;
-	err = ext4_ext_dirty(icb, handle, inode, path + k);
-	if (err)
-		return err;
+		if (ex != EXT_FIRST_EXTENT(eh)) {
+			/* we correct tree if first leaf got modified only */
+			return 0;
+		}
 
-	while (k--) {
-		/* change all left-side indexes */
-		if (path[k+1].p_idx != EXT_FIRST_INDEX(path[k+1].p_hdr))
-			break;
-		err = ext4_ext_get_access(icb, handle, inode, path + k);
-		if (err)
-			break;
+		k = at - 1;
+		border = path[at].p_ext->ee_block;
 		path[k].p_idx->ei_block = border;
 		err = ext4_ext_dirty(icb, handle, inode, path + k);
 		if (err)
+			return err;
+
+	} else {
+		border = path[at].p_idx->ei_block;
+		k = at;
+	}
+
+	while (k) {
+		/* change all left-side indexes */
+		if (path[k].p_idx != EXT_FIRST_INDEX(path[k].p_hdr))
+			break;
+		path[k-1].p_idx->ei_block = border;
+		err = ext4_ext_dirty(icb, handle, inode, path + k-1);
+		if (err)
 			break;
+
+		k--;
 	}
 
 	return err;
@@ -1842,9 +1911,11 @@
 	if (!(gb_flags & EXT4_GET_BLOCKS_PRE_IO))
 		ext4_ext_try_to_merge(icb, handle, inode, path, nearex);
 
+	depth = ext_depth(inode);
 
 	/* time to correct all indexes above */
-	err = ext4_ext_correct_indexes(icb, handle, inode, path);
+	err = ext4_ext_correct_indexes(icb, handle,
+			inode, path, depth);
 	if (err)
 		goto cleanup;
 
@@ -1878,156 +1949,351 @@
 	return ret;
 }
 
-static int ext4_remove_blocks(void *icb, handle_t *handle, struct inode *inode,
-		struct ext4_extent *ex,
-		unsigned long from, unsigned long to)
-{
-	struct buffer_head *bh;
-	int i;
-
-	if (from >= le32_to_cpu(ex->ee_block)
-			&& to == le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex) - 1) {
-		/* tail removal */
-		unsigned long num, start;
-		num = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex) - from;
-		start = ext4_ext_pblock(ex) + ext4_ext_get_actual_len(ex) - num;
-		ext4_free_blocks(icb, handle, inode, NULL, start, num, 0);
-	} else if (from == le32_to_cpu(ex->ee_block)
-			&& to <= le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex) - 1) {
+static void ext4_ext_remove_blocks(
+		void *icb,
+		handle_t *handle,
+		struct inode *inode, struct ext4_extent *ex,
+		ext4_lblk_t from, ext4_lblk_t to)
+{
+	int len = to - from + 1;
+	ext4_lblk_t num;
+	ext4_fsblk_t start;
+	num = from - le32_to_cpu(ex->ee_block);
+	start = ext4_ext_pblock(ex) + num;
+	ext_debug("Freeing %lu at %I64u, %d\n", from, start, len);
+	ext4_free_blocks(icb, handle, inode, NULL,
+			 start, len, 0);
+}
+
+static int ext4_ext_remove_idx(void *icb,
+		handle_t *handle,
+		struct inode *inode,
+		struct ext4_ext_path *path,
+		int depth)
+{
+	int err, i = depth;
+	ext4_fsblk_t leaf;
+
+	/* free index block */
+	leaf = ext4_idx_pblock(path[i].p_idx);
+
+	if (path[i].p_idx != EXT_LAST_INDEX(path[i].p_hdr)) {
+		int len = EXT_LAST_INDEX(path[i].p_hdr) - path[i].p_idx;
+		memmove(path[i].p_idx, path[i].p_idx + 1,
+			len * sizeof(struct ext4_extent_idx));
+	}
+
+	le16_add_cpu(&path[i].p_hdr->eh_entries, -1);
+	err = ext4_ext_dirty(icb, handle, inode, path + i);
+	if (err)
+		return err;
+
+	ext_debug("IDX: Freeing %lu at %I64u, %d\n",
+		le32_to_cpu(path[i].p_idx->ei_block), leaf, 1);
+	ext4_free_blocks(icb, handle, inode, NULL,
+			 leaf, 1, 0);
+	return err;
+}
+
+static int ext4_ext_amalgamate(void *icb,
+			       handle_t *handle,
+			       struct inode *inode,
+			       struct ext4_ext_path *path,
+			       int at)
+{
+	int new_entries, right_entries;
+	int depth = ext_depth(inode);
+	struct ext4_ext_path *right_path = NULL;
+	ext4_lblk_t now;
+	int ret = 0;
+	if (!at)
+		return 0;
+
+	now = ext4_ext_next_allocated_block(path, at - 1);
+	if (now == EXT_MAX_BLOCKS)
+		goto out;
+
+	right_path = ext4_find_extent(inode, now, NULL, 0);
+	if (IS_ERR(right_path)) {
+		ret = PTR_ERR(right_path);
+		right_path = NULL;
+		goto out;
+	}
+
+	right_entries = le16_to_cpu(right_path[at].p_hdr->eh_entries);
+	new_entries = le16_to_cpu(path[at].p_hdr->eh_entries) +
+		      right_entries;
+	if (new_entries > path[at].p_hdr->eh_max) {
+		ret = 0;
+		goto out;
+	}
+	if (at == depth) {
+		struct ext4_extent *last_ex = EXT_LAST_EXTENT(path[at].p_hdr);
+		memmove(last_ex + 1,
+			EXT_FIRST_EXTENT(right_path[at].p_hdr),
+			right_entries * sizeof(struct ext4_extent));
 	} else {
+		struct ext4_extent_idx *last_ix = EXT_LAST_INDEX(path[at].p_hdr);
+		memmove(last_ix + 1,
+			EXT_FIRST_INDEX(right_path[at].p_hdr),
+			right_entries * sizeof(struct ext4_extent_idx));
+	}
+	path[at].p_hdr->eh_entries = cpu_to_le16(new_entries);
+	right_path[at].p_hdr->eh_entries = 0;
+	ext4_ext_dirty(icb, handle, inode, path + at);
+
+	/*
+	 * remove the empty node from index block above.
+	 */
+	depth = at;
+	while (depth > 0) {
+		struct ext4_extent_header *eh = right_path[depth].p_hdr;
+		if (eh->eh_entries == 0 && right_path[depth].p_bh != NULL) {
+			ext4_ext_drop_refs(right_path + depth);
+			ret = ext4_ext_remove_idx(icb, handle, inode, right_path, depth - 1);
+			if (ret)
+				goto out;
+
+		} else
+			break;
+
+		depth--;
 	}
-	return 0;
+	ret = ext4_ext_correct_indexes(icb, handle,
+			inode, right_path, depth);
+out:
+	if (right_path) {
+		ext4_ext_drop_refs(right_path);
+		kfree(right_path);
+	}
+
+	return ret;
+}
+
+static int ext4_ext_balance(void *icb,
+			    handle_t *handle,
+			    struct inode *inode,
+			    struct ext4_ext_path **path,
+			    int at)
+{
+	int ret, shrinked = 0;
+	int depth = at;
+
+	while (depth > 0) {
+		ret = ext4_ext_amalgamate(icb, handle,
+				inode, *path, depth);
+		if (ret)
+			goto out;
+
+		depth--;
+	}
+	do {
+		ret = ext4_ext_shrink_indepth(icb, handle,
+				inode, 0, &shrinked);
+	} while (!ret && shrinked);
+
+out:
+	return ret;
 }
 
 /*
- * routine removes index from the index block
- * it's used in truncate case only. thus all requests are for
- * last index in the block only
+ * NOTE: After removal, path should not be reused.
  */
-int ext4_ext_rm_idx(void *icb, handle_t *handle, struct inode *inode,
-		struct ext4_ext_path *path)
+int ext4_ext_remove_extent(void *icb,
+		handle_t *handle,
+		struct inode *inode, struct ext4_ext_path **path)
 {
-	int err;
-	ext4_fsblk_t leaf;
+	int len;
+	int err = 0;
+	ext4_lblk_t start;
+	uint16_t new_entries;
+	int depth = ext_depth(inode);
+	struct ext4_extent *ex = (*path)[depth].p_ext,
+			   *ex2 = ex + 1;
+	struct ext4_extent_header *eh = (*path)[depth].p_hdr;
+	if (!ex)
+		return -EINVAL;
+
+	start = le32_to_cpu(ex->ee_block);
+	len = ext4_ext_get_actual_len(ex);
+	new_entries = le16_to_cpu(eh->eh_entries) - 1;
+
+	ext4_ext_remove_blocks(icb, handle,
+			inode, ex, start, start + len - 1);
+	if (ex2 <= EXT_LAST_EXTENT(eh))
+		memmove(ex, ex2,
+			(EXT_LAST_EXTENT(eh) - ex2 + 1) * sizeof(struct ext4_extent));
+	eh->eh_entries = cpu_to_le16(new_entries);
+
+	ext4_ext_dirty(icb, handle, inode, (*path) + depth);
+
+	/*
+	 * If the node is free, then we should
+	 * remove it from index block above.
+	 */
+	while (depth > 0) {
+		eh = (*path)[depth].p_hdr;
+		if (eh->eh_entries == 0 && (*path)[depth].p_bh != NULL) {
+			ext4_ext_drop_refs((*path) + depth);
+			err = ext4_ext_remove_idx(icb, handle,
+					inode, *path, depth - 1);
+			if (err)
+				break;
+
+		} else
+			break;
+
+		depth--;
+	}
+	err = ext4_ext_correct_indexes(icb, handle,
+			inode, *path, depth);
+
+	if ((*path)->p_hdr->eh_entries == 0) {
+		/*
+		 * truncate to zero freed all the tree,
+		 * so we need to correct eh_depth
+		 */
+		ext_inode_hdr(inode)->eh_depth = 0;
+		ext_inode_hdr(inode)->eh_max =
+			cpu_to_le16(ext4_ext_space_root(inode, 0));
+		err = ext4_ext_dirty(icb, handle, inode, *path);
+	}
+	err = ext4_ext_balance(icb, handle, inode, path, depth);
 
-	/* free index block */
-	path--;
-	leaf = ext4_idx_pblock(path->p_idx);
-	BUG_ON(path->p_hdr->eh_entries == 0);
-	if ((err = ext4_ext_get_access(icb, handle, inode, path)))
-		return err;
-	path->p_hdr->eh_entries = cpu_to_le16(le16_to_cpu(path->p_hdr->eh_entries)-1);
-	if ((err = ext4_ext_dirty(icb, handle, inode, path)))
-		return err;
-	ext4_free_blocks(icb, handle, inode, NULL, leaf, 1, 0);
 	return err;
 }
 
-static int
-ext4_ext_rm_leaf(void *icb, handle_t *handle, struct inode *inode,
-		struct ext4_ext_path *path, unsigned long start)
+int __ext4_ext_truncate(void *icb,
+			handle_t *handle,
+			struct inode *inode,
+			ext4_lblk_t from, ext4_lblk_t to)
 {
-	int err = 0, correct_index = 0;
-	int depth = ext_depth(inode), credits;
-	struct ext4_extent_header *eh;
-	unsigned a, b, block, num;
-	unsigned long ex_ee_block;
-	unsigned short ex_ee_len;
+	int depth = ext_depth(inode), ret = -EIO;
 	struct ext4_extent *ex;
+	struct ext4_ext_path *path = NULL, *npath;
+	ext4_lblk_t now = from;
 
-	/* the header must be checked already in ext4_ext_remove_space() */
-	if (!path[depth].p_hdr)
-		path[depth].p_hdr = ext_block_hdr(path[depth].p_bh);
-	eh = path[depth].p_hdr;
-	BUG_ON(eh == NULL);
+	if (to < from)
+		return -EINVAL;
 
-	/* find where to start removing */
-	ex = EXT_LAST_EXTENT(eh);
+	npath = ext4_find_extent(inode, from, &path, 0);
+	if (IS_ERR(npath))
+		goto out;
 
-	ex_ee_block = le32_to_cpu(ex->ee_block);
-	ex_ee_len = ext4_ext_get_actual_len(ex);
+	path = npath;
+	ex = path[depth].p_ext;
+	if (!ex)
+		goto out;
 
-	while (ex >= EXT_FIRST_EXTENT(eh) &&
-			ex_ee_block + ex_ee_len > start) {
-		path[depth].p_ext = ex;
-
-		a = ex_ee_block > start ? ex_ee_block : start;
-		b = (unsigned long long)ex_ee_block + ex_ee_len - 1 < 
-			EXT_MAX_BLOCKS ? ex_ee_block + ex_ee_len - 1 : EXT_MAX_BLOCKS;
-
-
-		if (a != ex_ee_block && b != ex_ee_block + ex_ee_len - 1) {
-			block = 0;
-			num = 0;
-			BUG();
-		} else if (a != ex_ee_block) {
-			/* remove tail of the extent */
-			block = ex_ee_block;
-			num = a - block;
-		} else if (b != ex_ee_block + ex_ee_len - 1) {
-			/* remove head of the extent */
-			block = a;
-			num = b - a;
-			/* there is no "make a hole" API yet */
-			BUG();
-		} else {
-			/* remove whole extent: excellent! */
-			block = ex_ee_block;
-			num = 0;
-			BUG_ON(a != ex_ee_block);
-			BUG_ON(b != ex_ee_block + ex_ee_len - 1);
-		}
+	if (from < le32_to_cpu(ex->ee_block) &&
+	    to < le32_to_cpu(ex->ee_block)) {
+		ret = 0;
+		goto out;
+	}
+	/* If we do remove_space inside the range of an extent */
+	if ((le32_to_cpu(ex->ee_block) < from) &&
+	    (to < le32_to_cpu(ex->ee_block) +
+			ext4_ext_get_actual_len(ex) - 1)) {
 
-		/* at present, extent can't cross block group */
-		/* leaf + bitmap + group desc + sb + inode */
-		credits = 5;
-		if (ex == EXT_FIRST_EXTENT(eh)) {
-			correct_index = 1;
-			credits += (ext_depth(inode)) + 1;
-		}
+		struct ext4_extent newex;
+		int unwritten = ext4_ext_is_unwritten(ex);
+		ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block);
+		int len = ext4_ext_get_actual_len(ex);
+		ext4_fsblk_t newblock =
+			to + 1 - ee_block + ext4_ext_pblock(ex);
 
-		/*handle = ext4_ext_journal_restart(icb, handle, credits);*/
-		/*if (IS_ERR(icb, handle)) {*/
-		/*err = PTR_ERR(icb, handle);*/
-		/*goto out;*/
-		/*}*/
+		ex->ee_len = cpu_to_le16(from - ee_block);
+		if (unwritten)
+			ext4_ext_mark_unwritten(ex);
 
-		err = ext4_ext_get_access(icb, handle, inode, path + depth);
-		if (err)
-			goto out;
+		ext4_ext_dirty(icb, handle, inode, path + depth);
 
-		err = ext4_remove_blocks(icb, handle, inode, ex, a, b);
-		if (err)
+		ext4_ext_remove_blocks(icb, handle,
+				inode,
+				ex, from, to);
+
+		newex.ee_block = cpu_to_le32(to + 1);
+		newex.ee_len = cpu_to_le16(ee_block + len - 1 - to);
+		ext4_ext_store_pblock(&newex, newblock);
+		if (unwritten)
+			ext4_ext_mark_unwritten(&newex);
+
+		ret = ext4_ext_insert_extent(icb, handle,
+				inode, &path, &newex, 0);
+		goto out;
+	}
+	if (le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex) - 1 < from) {
+		now = ext4_ext_next_allocated_block(path, depth);
+		npath = ext4_find_extent(inode, now, &path, 0);
+		if (IS_ERR(npath))
 			goto out;
 
-		if (num == 0) {
-			/* this extent is removed entirely mark slot unused */
-			ext4_ext_store_pblock(ex, 0);
-			eh->eh_entries = cpu_to_le16(le16_to_cpu(eh->eh_entries)-1);
+		path = npath;
+		ex = path[depth].p_ext;
+	}
+	while (ex &&
+	       le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex) - 1 >= now &&
+	       le32_to_cpu(ex->ee_block) <= to) {
+		int len, new_len = 0;
+		int unwritten;
+		ext4_lblk_t start, new_start;
+		ext4_fsblk_t newblock;
+
+		new_start = start = le32_to_cpu(ex->ee_block);
+		len = ext4_ext_get_actual_len(ex);
+		newblock = ext4_ext_pblock(ex);
+		if (start < from) {
+			len -= from - start;
+			new_len = from - start;
+			start = from;
+		} else {
+			if (start + len - 1 > to) {
+				new_len = start + len - 1 - to;
+				len -= new_len;
+				new_start = to + 1;
+				newblock += to + 1 - start;
+			}
 		}
 
-		ex->ee_block = cpu_to_le32(block);
-		ex->ee_len = cpu_to_le16(num);
+		now = ext4_ext_next_allocated_block(path, depth);
+		if (!new_len) {
+			ret = ext4_ext_remove_extent(icb, handle,
+					inode, &path);
+			if (ret)
+				goto out;
 
-		err = ext4_ext_dirty(icb, handle, inode, path + depth);
-		if (err)
+		} else {
+			ext4_ext_remove_blocks(icb, handle,
+				inode,
+				ex, start, start + len - 1);
+			ex->ee_block = cpu_to_le32(new_start);
+			unwritten = ext4_ext_is_unwritten(ex);
+			ex->ee_len = cpu_to_le16(new_len);
+			ext4_ext_store_pblock(ex, newblock);
+			if (unwritten)
+				ext4_ext_mark_unwritten(ex);
+
+			ext4_ext_dirty(icb, handle,
+				inode, path + depth);
+		}
+		npath = ext4_find_extent(inode, now, &path, 0);
+		if (IS_ERR(npath))
 			goto out;
 
-		ex--;
-		ex_ee_block = le32_to_cpu(ex->ee_block);
-		ex_ee_len = ext4_ext_get_actual_len(ex);
+		path = npath;
+		depth = ext_depth(inode);
+		ex = path[depth].p_ext;
+	}
+out:
+	if (path) {
+		ext4_ext_drop_refs(path);
+		kfree(path);
 	}
 
-	if (correct_index && eh->eh_entries)
-		err = ext4_ext_correct_indexes(icb, handle, inode, path);
-
-	/* if this leaf is free, then we should
-	 * remove it from index block above */
-	if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL)
-		err = ext4_ext_rm_idx(icb, handle, inode, path + depth);
+	if (IS_ERR(npath))
+		ret = PTR_ERR(npath);
 
-out:
-	return err;
+	return ret;
 }
 
 /*
@@ -2169,136 +2435,6 @@
 	return err;
 }
 
-/*
- * returns 1 if current index have to be freed (even partial)
- */
-static int inline
-ext4_ext_more_to_rm(struct ext4_ext_path *path)
-{
-	BUG_ON(path->p_idx == NULL);
-
-	if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr))
-		return 0;
-
-	/*
-	 * if truncate on deeper level happened it it wasn't partial
-	 * so we have to consider current index for truncation
-	 */
-	if (le16_to_cpu(path->p_hdr->eh_entries) == path->p_block)
-		return 0;
-	return 1;
-}
-
-int ext4_ext_remove_space(void *icb, struct inode *inode, unsigned long start)
-{
-	struct super_block *sb = inode->i_sb;
-	int depth = ext_depth(inode);
-	struct ext4_ext_path *path;
-	handle_t *handle = NULL;
-	int i = 0, err = 0;
-
-	/* probably first extent we're gonna free will be last in block */
-	/*handle = ext4_journal_start(inode, depth + 1);*/
-	/*if (IS_ERR(icb, handle))*/
-	/*return PTR_ERR(icb, handle);*/
-
-	/*
-	 * we start scanning from right side freeing all the blocks
-	 * after i_size and walking into the deep
-	 */
-	path = kmalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_KERNEL);
-	if (path == NULL) {
-		ext4_journal_stop(icb, handle);
-		return -ENOMEM;
-	}
-	memset(path, 0, sizeof(struct ext4_ext_path) * (depth + 1));
-	path[0].p_hdr = ext_inode_hdr(inode);
-	if (ext4_ext_check_inode(inode)) {
-		err = -EIO;
-		goto out;
-	}
-	path[0].p_depth = depth;
-
-	while (i >= 0 && err == 0) {
-		if (i == depth) {
-			/* this is leaf block */
-			err = ext4_ext_rm_leaf(icb, handle, inode, path, start);
-			/* root level have p_bh == NULL, extents_brelse() eats this */
-			extents_brelse(path[i].p_bh);
-			path[i].p_bh = NULL;
-			i--;
-			continue;
-		}
-
-		/* this is index block */
-		if (!path[i].p_hdr) {
-			path[i].p_hdr = ext_block_hdr(path[i].p_bh);
-		}
-
-		if (!path[i].p_idx) {
-			/* this level hasn't touched yet */
-			path[i].p_idx = EXT_LAST_INDEX(path[i].p_hdr);
-			path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries)+1;
-		} else {
-			/* we've already was here, see at next index */
-			path[i].p_idx--;
-		}
-
-		if (ext4_ext_more_to_rm(path + i)) {
-			struct buffer_head *bh;
-			/* go to the next level */
-			memset(path + i + 1, 0, sizeof(*path));
-			bh = read_extent_tree_block(inode, ext4_idx_pblock(path[i].p_idx), path[0].p_depth - (i + 1), 0);
-			if (IS_ERR(bh)) {
-				/* should we reset i_size? */
-				err = -EIO;
-				break;
-			}
-			path[i+1].p_bh = bh;
-
-			/* put actual number of indexes to know is this
-			 * number got changed at the next iteration */
-			path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries);
-			i++;
-		} else {
-			/* we finish processing this index, go up */
-			if (path[i].p_hdr->eh_entries == 0 && i > 0) {
-				/* index is empty, remove it
-				 * handle must be already prepared by the
-				 * truncatei_leaf() */
-				err = ext4_ext_rm_idx(icb, handle, inode, path + i);
-			}
-			/* root level have p_bh == NULL, extents_brelse() eats this */
-			extents_brelse(path[i].p_bh);
-			path[i].p_bh = NULL;
-			i--;
-		}
-	}
-
-	/* TODO: flexible tree reduction should be here */
-	if (path->p_hdr->eh_entries == 0) {
-		/*
-		 * truncate to zero freed all the tree
-		 * so, we need to correct eh_depth
-		 */
-		err = ext4_ext_get_access(icb, handle, inode, path);
-		if (err == 0) {
-			ext_inode_hdr(inode)->eh_depth = 0;
-			ext_inode_hdr(inode)->eh_max =
-				cpu_to_le16(ext4_ext_space_root(inode, 0));
-			err = ext4_ext_dirty(icb, handle, inode, path);
-		}
-	}
-out:
-	if (path) {
-		ext4_ext_drop_refs(path);
-		kfree(path);
-	}
-	ext4_journal_stop(icb, handle);
-
-	return err;
-}
-
 int ext4_ext_tree_init(void *icb, handle_t *handle, struct inode *inode)
 {
 	struct ext4_extent_header *eh;
@@ -2437,7 +2573,7 @@
 
 	/* find next allocated block so that we know how many
 	 * blocks we can allocate without ovelapping next extent */
-	next = ext4_ext_next_allocated_block(path);
+	next = ext4_ext_next_allocated_block(path, depth);
 	BUG_ON(next <= iblock);
 	allocated = next - iblock;
 	if (flags & EXT4_GET_BLOCKS_PRE_IO && max_blocks > EXT_UNWRITTEN_MAX_LEN)
@@ -2500,7 +2636,8 @@
 
 int ext4_ext_truncate(void *icb, struct inode *inode, unsigned long start)
 {
-    int ret = ext4_ext_remove_space(icb, inode, start);
+	int ret = __ext4_ext_truncate(icb, NULL, inode,
+			start, EXT_MAX_BLOCKS);
 
 	/* Save modifications on i_blocks field of the inode. */
 	if (!ret)
diff -uNr 0.63/Ext3Fsd/fastio.c 0.66/Ext3Fsd/fastio.c
--- 0.63/Ext3Fsd/fastio.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/fastio.c	2016-04-19 16:38:20.000000000 +0200
@@ -17,6 +17,9 @@
 
 /* DEFINITIONS *************************************************************/
 
+#define FASTIO_DEBUG_LEVEL DL_NVR
+
+
 #ifdef ALLOC_PRAGMA
 
 #pragma alloc_text(PAGE, Ext2FastIoRead)
@@ -213,30 +216,34 @@
             __leave;
         }
 
-        if (ExAcquireResourceExclusiveLite(&Fcb->MainResource, Wait))
-            Locked = TRUE;
-        else
+        if (!ExAcquireResourceSharedLite(Fcb->Header.Resource, Wait)) {
             __leave;
+        }
+        Locked = TRUE;
 
         if (IsWritingToEof(*FileOffset) ||
+            Fcb->Header.ValidDataLength.QuadPart < FileOffset->QuadPart + Length ||
             Fcb->Header.FileSize.QuadPart < FileOffset->QuadPart + Length ) {
             Status = FALSE;
             __leave;
         }
 
+        if (Locked) {
+            ExReleaseResourceLite(Fcb->Header.Resource);
+            Locked = FALSE;
+        }
+
         Status = FsRtlCopyWrite(FileObject, FileOffset, Length, Wait,
                                 LockKey, Buffer, IoStatus, DeviceObject);
         if (Status) {
             if (IoStatus)
                 Length = (ULONG)IoStatus->Information;
-            if (Fcb->Header.ValidDataLength.QuadPart < FileOffset->QuadPart + Length)
-                Fcb->Header.ValidDataLength.QuadPart = FileOffset->QuadPart + Length;
         }
 
     } __finally {
 
         if (Locked) {
-            ExReleaseResourceLite(&Fcb->MainResource);
+            ExReleaseResourceLite(Fcb->Header.Resource);
         }
 
         FsRtlExitFileSystem();
@@ -977,3 +984,137 @@
 
     return bResult;
 }
+
+
+VOID
+Ext2AcquireForCreateSection (
+    IN PFILE_OBJECT FileObject
+)
+
+{
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    if (Fcb->Header.Resource != NULL) {
+        ExAcquireResourceExclusiveLite(Fcb->Header.Resource, TRUE);
+    }
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2AcquireForCreateSection:  Fcb=%p\n", Fcb));
+}
+
+VOID
+Ext2ReleaseForCreateSection (
+    IN PFILE_OBJECT FileObject
+)
+{
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2ReleaseForCreateSection:  Fcb=%p\n", Fcb));
+
+    if (Fcb->Header.Resource != NULL) {
+        ExReleaseResourceLite(Fcb->Header.Resource);
+    }
+}
+
+
+NTSTATUS
+Ext2AcquireFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER EndingOffset,
+    OUT PERESOURCE *ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+)
+
+{
+    BOOLEAN ResourceAcquired = FALSE;
+
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    *ResourceToRelease = Fcb->Header.Resource;
+    ResourceAcquired = ExAcquireResourceExclusiveLite(*ResourceToRelease, FALSE);
+    if (!ResourceAcquired) {
+        *ResourceToRelease = NULL;
+    }
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2AcquireFileForModWrite:  Fcb=%p Acquired=%d\n",
+                             Fcb, ResourceAcquired));
+
+    return (ResourceAcquired ? STATUS_SUCCESS : STATUS_CANT_WAIT);
+}
+
+NTSTATUS
+Ext2ReleaseFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PERESOURCE ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+)
+{
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2ReleaseFileForModWrite: Fcb=%p\n", Fcb));
+
+    if (ResourceToRelease != NULL) {
+        ASSERT(ResourceToRelease == Fcb->Header.Resource);
+        ExReleaseResourceLite(ResourceToRelease);
+    } else {
+        DbgBreak();
+    }
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+Ext2AcquireFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+)
+{
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    if (Fcb->Header.Resource != NULL) {
+        ExAcquireResourceExclusiveLite(Fcb->Header.Resource, TRUE);
+    }
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2AcquireFileForCcFlush: Fcb=%p\n", Fcb));
+
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+Ext2ReleaseFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+)
+{
+    PEXT2_FCB Fcb = FileObject->FsContext;
+
+    DEBUG(FASTIO_DEBUG_LEVEL, ("Ext2ReleaseFileForCcFlush: Fcb=%p\n", Fcb));
+
+    if (Fcb->Header.Resource != NULL) {
+        ExReleaseResourceLite(Fcb->Header.Resource);
+    }
+
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+Ext2PreAcquireForCreateSection(
+    IN PFS_FILTER_CALLBACK_DATA cd,
+    OUT PVOID *cc
+    )
+{
+    PEXT2_FCB Fcb = (PEXT2_FCB)cd->FileObject->FsContext;
+    NTSTATUS        status;
+
+    ASSERT(cd->Operation == FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION);
+    ExAcquireResourceExclusiveLite(Fcb->Header.Resource, TRUE);
+    if (cd->Parameters.AcquireForSectionSynchronization.SyncType != SyncTypeCreateSection) {
+        status = STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY;
+    } else if (Fcb->ShareAccess.Writers == 0) {
+        status = STATUS_FILE_LOCKED_WITH_ONLY_READERS;
+    } else {
+        status = STATUS_FILE_LOCKED_WITH_WRITERS;
+    }
+
+    return status;
+}
diff -uNr 0.63/Ext3Fsd/fileinfo.c 0.66/Ext3Fsd/fileinfo.c
--- 0.63/Ext3Fsd/fileinfo.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/fileinfo.c	2016-04-19 16:38:20.000000000 +0200
@@ -554,13 +554,6 @@
             VcbMainResourceAcquired = TRUE;
         }
 
-        if (IsVcbReadOnly(Vcb)) {
-            if (FileInformationClass != FilePositionInformation) {
-                Status = STATUS_MEDIA_WRITE_PROTECTED;
-                __leave;
-            }
-        }
-
         if (FlagOn(Vcb->Flags, VCB_VOLUME_LOCKED)) {
             Status = STATUS_ACCESS_DENIED;
             __leave;
@@ -596,6 +589,17 @@
             Mcb = Fcb->Mcb;
         }
 
+        if (FileInformationClass != FilePositionInformation) {
+            if (IsVcbReadOnly(Vcb)) {
+                Status = STATUS_MEDIA_WRITE_PROTECTED;
+                __leave;
+            }
+            if (!Ext2CheckFileAccess(Vcb, Mcb, Ext2FileCanWrite)) {
+                Status = STATUS_ACCESS_DENIED;
+                __leave;
+            }
+        }
+
         if ( !IsDirectory(Fcb) && !FlagOn(Fcb->Flags, FCB_PAGE_FILE) &&
                 ((FileInformationClass == FileEndOfFileInformation) ||
                  (FileInformationClass == FileValidDataLengthInformation) ||
@@ -1289,8 +1293,9 @@
         DEBUG(DL_INF, ( "Ext2SetDispositionInformation: Removing %wZ.\n",
                         &Mcb->FullName));
 
-        /* always allow deleting on symlinks */
-        if (Ccb->SymLink == NULL) {
+        if (Ccb->SymLink || IsInodeSymLink(&Mcb->Inode)) {
+            /* always allow deleting on symlinks */
+        } else {
             status = Ext2IsFileRemovable(IrpContext, Vcb, Fcb, Ccb);
         }
 
diff -uNr 0.63/Ext3Fsd/flush.c 0.66/Ext3Fsd/flush.c
--- 0.63/Ext3Fsd/flush.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/flush.c	2016-04-19 16:38:20.000000000 +0200
@@ -81,6 +81,9 @@
 
     DEBUG(DL_INF, ( "Ext2FlushVolume: Flushing Vcb ...\n"));
 
+    /* discard buffer_headers for group_desc */
+    Ext2DropGroup(Vcb);
+
     ExAcquireSharedStarveExclusive(&Vcb->PagingIoResource, TRUE);
     ExReleaseResourceLite(&Vcb->PagingIoResource);
 
diff -uNr 0.63/Ext3Fsd/fsctl.c 0.66/Ext3Fsd/fsctl.c
--- 0.63/Ext3Fsd/fsctl.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/fsctl.c	2016-04-19 16:38:20.000000000 +0200
@@ -1420,7 +1420,8 @@
     
     __try {
 
-        if (!Mcb || !IsInodeSymLink(&Mcb->Inode)) {
+        if (!Mcb || !IsInodeSymLink(&Mcb->Inode) ||
+            !IsFlagOn(Ccb->Flags, CCB_OPEN_REPARSE_POINT)) {
             Status = STATUS_NOT_A_REPARSE_POINT;
             __leave;
         }
@@ -1565,7 +1566,6 @@
     return Status;
 }
 
-
 NTSTATUS
 Ext2SetReparsePoint (IN PEXT2_IRP_CONTEXT IrpContext)
 {
@@ -1671,15 +1671,31 @@
             }
         }
 
+        /* free all data blocks of the inode (to be set as symlink) */
+        {
+            LARGE_INTEGER zero = {0};
+            Status = Ext2TruncateFile(IrpContext, Vcb, Mcb, &zero);
+        }
+
+        /* decrease dir count of group desc and vcb stat */
+        if (S_ISDIR(Mcb->Inode.i_mode)) {
+
+            ULONG group = (Mcb->Inode.i_ino - 1) / INODES_PER_GROUP;
+            Ext2UpdateGroupDirStat(IrpContext, Vcb, group);
+
+            /* drop extra reference for dir inode */
+            ext3_dec_count(&Mcb->Inode);
+        }
+
         /* overwrite inode mode as type SYMLINK */
-        Mcb->Inode.i_mode = S_IFLNK | S_IRWXUGO;
         Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode);
         SetFlag(Mcb->FileAttr, FILE_ATTRIBUTE_REPARSE_POINT);
 
         Status = Ext2WriteSymlink(IrpContext, Vcb, Mcb, OemNameBuffer,
                                   OemNameLength, &BytesWritten);
         if (NT_SUCCESS(Status)) {
-            Status = Ext2SetFileType(IrpContext, Vcb, ParentDcb, Mcb);
+            Ext2SetFileType(IrpContext, Vcb, ParentDcb, Mcb,
+                            S_IFLNK | S_IRWXUGO);
         }
 
     } __finally {
@@ -1797,7 +1813,8 @@
             }
         }
 
-        if (!Mcb) {
+        if (!Mcb || !IsInodeSymLink(&Mcb->Inode) ||
+            !IsFlagOn(Ccb->Flags, CCB_OPEN_REPARSE_POINT)) {
             Status = STATUS_NOT_A_REPARSE_POINT;
             __leave;
         }
@@ -1823,15 +1840,9 @@
         if (!NT_SUCCESS(Status)) {
             __leave;
         }
-        if (IsFlagOn(SUPER_BLOCK->s_feature_incompat, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
-            SetFlag(Mcb->Inode.i_flags, EXT4_EXTENTS_FL);
-        }
-        ClearFlag(Mcb->FileAttr, FILE_ATTRIBUTE_REPARSE_POINT);
-        ClearFlag(Mcb->Inode.i_flags, S_IFLNK);
-        Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode);
-        if (NT_SUCCESS(Status)) {
-            Status = Ext2SetFileType(IrpContext, Vcb, ParentDcb, Mcb);
-        }
+
+        /* inode is to be removed */
+        SetFlag(Ccb->Flags, CCB_DELETE_ON_CLOSE);
 
     } __finally {
 
@@ -2700,6 +2711,9 @@
             FlushBeforePurge = FALSE;
         }
 
+        /* discard buffer_headers for group_desc */
+        Ext2DropGroup(Vcb);
+
         FcbListEntry= NULL;
         InitializeListHead(&FcbList);
 
diff -uNr 0.63/Ext3Fsd/include/common.h 0.66/Ext3Fsd/include/common.h
--- 0.63/Ext3Fsd/include/common.h	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/include/common.h	2016-04-19 16:38:20.000000000 +0200
@@ -167,8 +167,8 @@
     BOOLEAN             bExt3Writable;
     BOOLEAN             bExt2;
     BOOLEAN             bExt3;
-    UCHAR               Codepage[CODEPAGE_MAXLEN];
-} EXT2_VOLUME_PROPERTY;
+    CHAR                Codepage[CODEPAGE_MAXLEN];
+} EXT2_VOLUME_PROPERTY, *PEXT2_VOLUME_PROPERTY;
 
 #ifdef __cplusplus
 typedef struct _EXT2_VOLUME_PROPERTY2:EXT2_VOLUME_PROPERTY {
@@ -196,14 +196,24 @@
 
 } EXT2_VOLUME_PROPERTY2, *PEXT2_VOLUME_PROPERTY2;
 
-#define EXT2_VPROP3_AUTOMOUNT 0x0000000000000001
+#define EXT2_VPROP3_AUTOMOUNT (1ui64 << 0)
+#define EXT2_VPROP3_USERIDS   (1ui64 << 1)
 
+#ifdef __cplusplus
+typedef struct _EXT2_VOLUME_PROPERTY3:EXT2_VOLUME_PROPERTY2 {
+#else   // __cplusplus
 typedef struct _EXT2_VOLUME_PROPERTY3 {
-    EXT2_VOLUME_PROPERTY2  Prop2;
-    unsigned __int64       Flags;
-    int                    AutoMount:1;
-    int                    Reserved1:31;
-    int                    Reserved2[31];
+    EXT2_VOLUME_PROPERTY2 ;
+#endif  // __cplusplus
+    unsigned __int64       Flags2;
+    ULONG                  AutoMount:1;
+    ULONG                  EIDS:1;
+    ULONG                  Reserved1:30;
+    USHORT                 uid;
+    USHORT                 gid;
+    USHORT                 euid;
+    USHORT                 egid;
+    ULONG                  Reserved2[29];
 } EXT2_VOLUME_PROPERTY3, *PEXT2_VOLUME_PROPERTY3;
 
 /* Ext2Fsd driver version and built time */
diff -uNr 0.63/Ext3Fsd/include/ext2fs.h 0.66/Ext3Fsd/include/ext2fs.h
--- 0.63/Ext3Fsd/include/ext2fs.h	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/include/ext2fs.h	2016-04-19 16:38:20.000000000 +0200
@@ -41,7 +41,7 @@
 
 /* STRUCTS & CONSTS******************************************************/
 
-#define EXT2FSD_VERSION                 "0.63"
+#define EXT2FSD_VERSION                 "0.66"
 
 
 /* WDK DEFINITIONS ******************************************************/
@@ -104,6 +104,26 @@
 #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"
@@ -124,6 +144,10 @@
 #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"
 
@@ -452,6 +476,17 @@
 // Data that is not specific to a mounted volume
 //
 
+typedef VOID (*EXT2_REAPER_RELEASE)(PVOID);
+
+typedef struct _EXT2_REAPER {
+        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 */
@@ -467,6 +502,9 @@
     /* 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;
@@ -484,10 +522,8 @@
     LIST_ENTRY                  VcbList;
 
     /* Cleaning thread related: resource cleaner */
-    struct {
-        KEVENT                  Engine;
-        KEVENT                  Wait;
-    } Reaper;
+    EXT2_REAPER                 McbReaper;
+    EXT2_REAPER                 bhReaper;
 
     /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
     NPAGED_LOOKASIDE_LIST       Ext2IrpContextLookasideList;
@@ -500,11 +536,14 @@
 
     /* 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;
@@ -587,8 +626,11 @@
     /* 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;
@@ -657,12 +699,6 @@
     BOOLEAN                     IsExt3fs;
     PEXT2_SUPER_BLOCK           SuperBlock;
 
-    /*
-        // Bitmap Block per group
-        PRTL_BITMAP                 BlockBitMaps;
-        PRTL_BITMAP                 InodeBitMaps;
-    */
-
     // Block / Cluster size
     ULONG                       BlockSize;
 
@@ -733,6 +769,7 @@
 #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
@@ -1127,7 +1164,6 @@
 PMDL
 Ext2CreateMdl (
     IN PVOID Buffer,
-    IN BOOLEAN bPaged,
     IN ULONG Length,
     IN LOCK_OPERATION Operation
 );
@@ -1234,43 +1270,6 @@
 VOID
 Ext2NoOpRelease (IN PVOID Fcb);
 
-VOID
-Ext2AcquireForCreateSection (
-    IN PFILE_OBJECT FileObject
-);
-
-VOID
-Ext2ReleaseForCreateSection (
-    IN PFILE_OBJECT FileObject
-);
-
-NTSTATUS
-Ext2AcquireFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PLARGE_INTEGER EndingOffset,
-    OUT PERESOURCE *ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS
-Ext2ReleaseFileForModWrite (
-    IN PFILE_OBJECT FileObject,
-    IN PERESOURCE ResourceToRelease,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS
-Ext2AcquireFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
-NTSTATUS
-Ext2ReleaseFileForCcFlush (
-    IN PFILE_OBJECT FileObject,
-    IN PDEVICE_OBJECT DeviceObject
-);
-
 
 //
 // Create.c
@@ -1455,21 +1454,21 @@
 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
 );
 
@@ -1885,6 +1884,13 @@
 );
 
 NTSTATUS
+Ext2UpdateGroupDirStat(
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PEXT2_VCB            Vcb,
+    IN ULONG                Group
+);
+
+NTSTATUS
 Ext2FreeInode(
     IN PEXT2_IRP_CONTEXT    IrpContext,
     IN PEXT2_VCB            Vcb,
@@ -1907,7 +1913,8 @@
     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
@@ -2079,6 +2086,49 @@
     OUT PIO_STATUS_BLOCK                IoStatus,
     IN PDEVICE_OBJECT                   DeviceObject);
 
+VOID
+Ext2AcquireForCreateSection (
+    IN PFILE_OBJECT FileObject
+);
+
+VOID
+Ext2ReleaseForCreateSection (
+    IN PFILE_OBJECT FileObject
+);
+
+NTSTATUS
+Ext2AcquireFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PLARGE_INTEGER EndingOffset,
+    OUT PERESOURCE *ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+Ext2ReleaseFileForModWrite (
+    IN PFILE_OBJECT FileObject,
+    IN PERESOURCE ResourceToRelease,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+Ext2AcquireFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+NTSTATUS
+Ext2ReleaseFileForCcFlush (
+    IN PFILE_OBJECT FileObject,
+    IN PDEVICE_OBJECT DeviceObject
+);
+
+
+NTSTATUS
+Ext2PreAcquireForCreateSection(
+    IN PFS_FILTER_CALLBACK_DATA cd,
+    OUT PVOID *cc
+    );
 
 //
 // FileInfo.c
@@ -2368,8 +2418,10 @@
 // Init.c
 //
 
+NTSTATUS
+Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath);
 BOOLEAN
-Ext2QueryGlobalParameters (IN PUNICODE_STRING  RegistryPath);
+Ext2QueryRegistrySettings(IN PUNICODE_STRING  RegistryPath);
 
 VOID
 DriverUnload (IN PDRIVER_OBJECT DriverObject);
@@ -2431,6 +2483,17 @@
 // Memory.c
 //
 
+VOID
+Ext2McbReaperThread(
+    PVOID   Context
+);
+
+VOID
+Ext2bhReaperThread(
+    PVOID   Context
+);
+
+
 PEXT2_IRP_CONTEXT
 Ext2AllocateIrpContext (IN PDEVICE_OBJECT   DeviceObject,
                         IN PIRP             Irp );
@@ -2735,7 +2798,9 @@
 );
 
 NTSTATUS
-Ext2StartReaperThread();
+Ext2StartReaper(PEXT2_REAPER, EXT2_REAPER_RELEASE);
+VOID
+Ext2StopReaper(PEXT2_REAPER Reaper);
 
 //
 // Misc.c
@@ -2914,6 +2979,7 @@
     OUT PULONG              dwReturn
 );
 
+
 VOID
 Ext2StartFloppyFlushDpc (
     PEXT2_VCB   Vcb,
diff -uNr 0.63/Ext3Fsd/include/linux/atomic.h 0.66/Ext3Fsd/include/linux/atomic.h
--- 0.63/Ext3Fsd/include/linux/atomic.h	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/include/linux/atomic.h	2016-04-19 16:38:20.000000000 +0200
@@ -8,7 +8,7 @@
 //
 
 typedef struct {
-    volatile int counter;
+    volatile LONG  counter;
 } atomic_t;
 
 #define ATOMIC_INIT(i)	(i)
diff -uNr 0.63/Ext3Fsd/include/linux/ext3_fs_sb.h 0.66/Ext3Fsd/include/linux/ext3_fs_sb.h
--- 0.63/Ext3Fsd/include/linux/ext3_fs_sb.h	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/include/linux/ext3_fs_sb.h	2016-04-19 16:38:20.000000000 +0200
@@ -22,8 +22,18 @@
 /*
  * third extended-fs super-block data in memory
  */
+
+struct ext3_gd {
+    ext3_fsblk_t            block;
+    struct ext4_group_desc *gd;
+    struct buffer_head     *bh;
+};
+
 struct ext3_sb_info {
 
+    ERESOURCE           s_gd_lock;
+    struct ext3_gd     *s_gd;
+
     unsigned long s_desc_size;      /* size of group desc */
     unsigned long s_gdb_count;	/* Number of group descriptor blocks */
     unsigned long s_desc_per_block;	/* Number of group descriptors per block */
@@ -36,7 +46,6 @@
     int s_addr_per_block_bits;
     int s_desc_per_block_bits;
 
-    ext3_fsblk_t  *s_group_desc;
 
 #if 0
     unsigned long s_frag_size;	/* Size of a fragment in bytes */
diff -uNr 0.63/Ext3Fsd/include/linux/module.h 0.66/Ext3Fsd/include/linux/module.h
--- 0.63/Ext3Fsd/include/linux/module.h	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/include/linux/module.h	2016-04-19 16:38:20.000000000 +0200
@@ -546,9 +546,11 @@
     PFILE_OBJECT            bd_volume;  /* streaming object file */
     LARGE_MCB               bd_extents; /* dirty extents */
 
-    spinlock_t              bd_bh_lock;    /**/
-    kmem_cache_t *          bd_bh_cache;   /* memory cache for buffer_head */
-    struct rb_root          bd_bh_root;    /* buffer_head red-black tree root */
+    kmem_cache_t *          bd_bh_cache;/* memory cache for buffer_head */
+    ERESOURCE               bd_bh_lock; /* lock for bh tree and reaper list */
+    struct rb_root          bd_bh_root; /* buffer_head red-black tree root */
+    LIST_ENTRY              bd_bh_free; /* reaper list */
+    KEVENT                  bd_bh_notify; /* notification event for cleanup */
 };
 
 //
@@ -704,6 +706,7 @@
  * for backward compatibility reasons (e.g. submit_bh).
  */
 struct buffer_head {
+    LIST_ENTRY    b_link;                   /* to be added to reaper list */
     unsigned long b_state;		            /* buffer state bitmap (see above) */
     struct page *b_page;                    /* the page this bh is mapped to */
     PMDL         b_mdl;                     /* MDL of the locked buffer */
@@ -720,7 +723,10 @@
     // struct list_head b_assoc_buffers;    /* associated with another mapping */
     // struct address_space *b_assoc_map;   /* mapping this buffer is associated with */
     atomic_t b_count;		                /* users using this buffer_head */
-    struct rb_node b_rb_node;                /* Red-black tree node entry */
+    struct rb_node b_rb_node;               /* Red-black tree node entry */
+
+    LARGE_INTEGER  b_ts_creat;              /* creation time*/
+    LARGE_INTEGER  b_ts_drop;               /* drop time (to be released) */
 };
 
 
diff -uNr 0.63/Ext3Fsd/init.c 0.66/Ext3Fsd/init.c
--- 0.63/Ext3Fsd/init.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/init.c	2016-04-19 16:38:20.000000000 +0200
@@ -33,6 +33,7 @@
 
 #ifdef ALLOC_PRAGMA
 #pragma alloc_text(INIT, Ext2QueryGlobalParameters)
+#pragma alloc_text(INIT, Ext2QueryRegistrySettings)
 #pragma alloc_text(INIT, DriverEntry)
 #if EXT2_UNLOAD
 #pragma alloc_text(PAGE, DriverUnload)
@@ -99,140 +100,249 @@
 
 #endif
 
-BOOLEAN
-Ext2QueryGlobalParameters( IN PUNICODE_STRING  RegistryPath)
+NTSTATUS
+Ext2RegistryQueryCallback(
+    IN PWSTR ValueName,
+    IN ULONG ValueType,
+    IN PVOID ValueData,
+    IN ULONG ValueLength,
+    IN PVOID Context,
+    IN PVOID EntryContext
+    )
 {
-    NTSTATUS                    Status;
-    UNICODE_STRING              ParameterPath;
-    RTL_QUERY_REGISTRY_TABLE    QueryTable[2];
+    ULONG  i = 0;
+    BYTE   *s, *t;
 
-    ULONG                       WritingSupport = 0;
-    ULONG                       CheckingBitmap = 0;
-    ULONG                       Ext3ForceWriting = 0;
-    ULONG                       AutoMount = 0;
+    if (NULL == ValueName || NULL == ValueData)
+        return STATUS_SUCCESS;
 
-    UNICODE_STRING              UniName;
-    ANSI_STRING                 AnsiName;
+    if (ValueType == REG_DWORD && wcslen(ValueName) == wcslen(WRITING_SUPPORT) &&
+        _wcsnicmp(ValueName, WRITING_SUPPORT, wcslen(WRITING_SUPPORT)) == 0) {
 
-    WCHAR                       UniBuffer[CODEPAGE_MAXLEN];
-    USHORT                      Buffer[HIDINGPAT_LEN];
+        if (ValueData && ValueLength == sizeof(DWORD)) {
+            if (*((PULONG)ValueData)) {
+                SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
+            } else {
+                ClearLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
+            }
+        }
+    } else if (ValueType == REG_DWORD && wcslen(ValueName) == wcslen(CHECKING_BITMAP) &&
+        _wcsnicmp(ValueName, CHECKING_BITMAP, wcslen(CHECKING_BITMAP)) == 0) {
 
-    ParameterPath.Length = 0;
+        if (ValueData && ValueLength == sizeof(DWORD)) {
+            if (*((PULONG)ValueData)) {
+                SetLongFlag(Ext2Global->Flags, EXT2_CHECKING_BITMAP);
+            } else {
+                ClearLongFlag(Ext2Global->Flags, EXT2_CHECKING_BITMAP);
+            }
+        }
+    } else if (ValueType == REG_DWORD && wcslen(ValueName) == wcslen(EXT3_FORCEWRITING) &&
+        _wcsnicmp(ValueName, EXT3_FORCEWRITING, wcslen(EXT3_FORCEWRITING)) == 0) {
 
-    ParameterPath.MaximumLength =
-        RegistryPath->Length + sizeof(PARAMETERS_KEY) + sizeof(WCHAR);
+        if (ValueData && ValueLength == sizeof(DWORD)) {
+            if (*((PULONG)ValueData)) {
+                SetLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
+                SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
+            } else {
+                ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
+            }
+        }
+    } else if (ValueType == REG_DWORD && wcslen(ValueName) == wcslen(AUTO_MOUNT) &&
+        _wcsnicmp(ValueName, AUTO_MOUNT, wcslen(AUTO_MOUNT)) == 0) {
 
-    ParameterPath.Buffer =
-        (PWSTR) Ext2AllocatePool(
-            PagedPool,
-            ParameterPath.MaximumLength,
-            'LG2E'
-        );
+        if (ValueData && ValueLength == sizeof(DWORD)) {
+            if (*((PULONG)ValueData)) {
+                SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+            } else {
+                ClearLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+            }
+        }
+    } else if (ValueType == REG_SZ && wcslen(ValueName) == wcslen(CODEPAGE_NAME) &&
+        _wcsnicmp(ValueName, CODEPAGE_NAME, wcslen(CODEPAGE_NAME)) == 0) {
 
-    if (!ParameterPath.Buffer) {
-        DbgBreak();
-        DEBUG(DL_ERR, ( "Ex2QueryParameters: failed to allocate Parameters...\n"));
-        return FALSE;
+        if (ValueData && ValueLength <= sizeof(WCHAR) * CODEPAGE_MAXLEN) {
+            RtlCopyMemory(&Ext2Global->Codepage.PageName[0],
+                          ValueData, ValueLength);
+        }
+    } else if (ValueType == REG_SZ && wcslen(ValueName) == wcslen(HIDING_PREFIX) &&
+        _wcsnicmp(ValueName, HIDING_PREFIX, wcslen(HIDING_PREFIX)) == 0) {
+
+        if (ValueData && ValueLength <= sizeof(WCHAR) * HIDINGPAT_LEN) {
+            RtlCopyMemory(&Ext2Global->wHidingPrefix[0],
+                          ValueData, ValueLength);
+        }
+    } else  if (ValueType == REG_SZ && wcslen(ValueName) == wcslen(HIDING_SUFFIX) &&
+        _wcsnicmp(ValueName, HIDING_SUFFIX, wcslen(HIDING_SUFFIX)) == 0) {
+
+        if (ValueData && ValueLength <= sizeof(WCHAR) * HIDINGPAT_LEN) {
+            RtlCopyMemory(&Ext2Global->wHidingSuffix[0],
+                          ValueData, ValueLength);
+        }
     }
 
-    RtlCopyUnicodeString(&ParameterPath, RegistryPath);
-    RtlAppendUnicodeToString(&ParameterPath, PARAMETERS_KEY);
 
-    /* querying value of WritingSupport */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
+    return STATUS_SUCCESS;
+}
 
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
+NTSTATUS
+Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath)
+{
+    RTL_QUERY_REGISTRY_TABLE    QueryTable[8];
+    int                         i = 0;
+    NTSTATUS                    Status;
+
+    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 8);
+
+    /*
+     * 1 writing support
+     */
+    QueryTable[i].Flags = 0;
     QueryTable[0].Name = WRITING_SUPPORT;
-    QueryTable[0].EntryContext = &WritingSupport;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL        );
+    /*
+     * 2 checking bitmap
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = CHECKING_BITMAP;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
-    DEBUG(DL_ERR, ( "Ext2QueryParameters: WritingSupport=%xh\n", WritingSupport));
+    /*
+     * 3 force writing
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = EXT3_FORCEWRITING;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
-    /* querying value of CheckingBitmap */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = CHECKING_BITMAP;
-    QueryTable[0].EntryContext = &CheckingBitmap;
+    /*
+     * 4 automount
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = AUTO_MOUNT;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL        );
+    /*
+     * 5 codepage
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = CODEPAGE_NAME;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
+
+    /*
+     * 6 hidden prefix
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = HIDING_PREFIX;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
-    DEBUG(DL_ERR, ( "Ext2QueryParameters: CheckingBitmap=%xh\n", CheckingBitmap));
 
-    /* querying value of Ext3ForceWriting */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = EXT3_FORCEWRITING;
-    QueryTable[0].EntryContext = &Ext3ForceWriting;
+    /*
+     * 7 hidden suffix
+     */
+    QueryTable[i].Flags = 0;
+    QueryTable[i].Name = HIDING_SUFFIX;
+    QueryTable[i].DefaultType = REG_NONE;
+    QueryTable[i].DefaultLength = 0;
+    QueryTable[i].DefaultData = NULL;
+    QueryTable[i].EntryContext = NULL;
+    QueryTable[i].QueryRoutine = Ext2RegistryQueryCallback;
+    i++;
 
     Status = RtlQueryRegistryValues(
                  RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
+                 RegistryPath->Buffer,
                  &QueryTable[0],
                  NULL,
-                 NULL        );
+                 NULL
+            );
 
-    DEBUG(DL_ERR, ( "Ext2QueryParameters: Ext3ForceWriting=%xh\n", Ext3ForceWriting));
+    return NT_SUCCESS(Status);
+}
 
 
-    /* querying value of AutoMount */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
+BOOLEAN
+Ext2QueryRegistrySettings(IN PUNICODE_STRING  RegistryPath)
+{
+    UNICODE_STRING              ParameterPath;
+    UNICODE_STRING              UniName;
+    ANSI_STRING                 AnsiName;
 
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = AUTO_MOUNT;
-    QueryTable[0].EntryContext = &AutoMount;
+    ULONG                       WritingSupport = 0;
+    ULONG                       CheckingBitmap = 0;
+    ULONG                       Ext3ForceWriting = 0;
+    ULONG                       AutoMount = 0;
 
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL        );
+    WCHAR                       UniBuffer[CODEPAGE_MAXLEN];
+    USHORT                      Buffer[HIDINGPAT_LEN];
 
-    SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
-    if (NT_SUCCESS(Status) && AutoMount == 0) {
-        ClearLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
+    NTSTATUS                    Status;
+
+    ParameterPath.Length = 0;
+    ParameterPath.MaximumLength =
+        RegistryPath->Length + sizeof(PARAMETERS_KEY) + sizeof(WCHAR);
+    ParameterPath.Buffer =
+        (PWSTR) Ext2AllocatePool(
+            PagedPool,
+            ParameterPath.MaximumLength,
+            'LG2E'
+        );
+    if (!ParameterPath.Buffer) {
+        DbgBreak();
+        DEBUG(DL_ERR, ( "Ex2QueryParameters: failed to allocate Parameters...\n"));
+        return FALSE;
     }
 
-    DEBUG(DL_ERR, ( "Ext2QueryParameters: AutoMount=%xh\n", AutoMount));
+    RtlCopyUnicodeString(&ParameterPath, RegistryPath);
+    RtlAppendUnicodeToString(&ParameterPath, PARAMETERS_KEY);
 
-    /* querying codepage */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = CODEPAGE_NAME;
-    QueryTable[0].EntryContext = &(UniName);
-    UniName.MaximumLength = CODEPAGE_MAXLEN * sizeof(WCHAR);
-    UniName.Length = 0;
-    UniName.Buffer = (PWSTR)UniBuffer;
+    /* enable automount of ext2/3/4 volumes */
+    SetLongFlag(Ext2Global->Flags, EXT2_AUTO_MOUNT);
 
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL        );
+    /* query parameter settings from registry */
+    Ext2QueryGlobalParameters(&ParameterPath);
 
-    if (NT_SUCCESS(Status)) {
-        DEBUG(DL_ERR, ( "Ext2QueryParameters: Ext2CodePage=%wZ\n", &UniName));
+    /* set global codepage settings */
+    if (wcslen(&Ext2Global->Codepage.PageName[0])) {
+        UniName.Length = sizeof(WCHAR) * wcslen(&Ext2Global->Codepage.PageName[0]);
+        UniName.MaximumLength = CODEPAGE_MAXLEN * sizeof(WCHAR);
+        UniName.Buffer = &Ext2Global->Codepage.PageName[0];
         AnsiName.MaximumLength = CODEPAGE_MAXLEN;
         AnsiName.Length = 0;
-        AnsiName.Buffer = &(Ext2Global->Codepage.AnsiName[0]);
-
+        AnsiName.Buffer = &Ext2Global->Codepage.AnsiName[0];
         Status = RtlUnicodeStringToAnsiString(
                      &AnsiName,
                      &UniName,
                      FALSE);
-
         if (!NT_SUCCESS(Status)) {
             DEBUG(DL_ERR, ( "Ext2QueryParameters: Wrong CodePage %wZ ...\n", &UniName));
             RtlCopyMemory(&(Ext2Global->Codepage.AnsiName[0]),"default\0", 8);
@@ -243,25 +353,13 @@
     }
     Ext2Global->Codepage.AnsiName[CODEPAGE_MAXLEN - 1] = 0;
 
-    /* querying name hiding patterns: prefix*/
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = HIDING_PREFIX;
-    QueryTable[0].EntryContext = &(UniName);
-    UniName.MaximumLength = HIDINGPAT_LEN * sizeof(WCHAR);
-    UniName.Length = 0;
-    UniName.Buffer = Buffer;
 
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL        );
-
-    if (NT_SUCCESS(Status)) {
-        DEBUG(DL_ERR, ( "Ext2QueryParameters: HidingPrefix=%wZ\n", &UniName));
-        AnsiName.MaximumLength =HIDINGPAT_LEN;
+    /* set global hidden prefix pattern */
+    if (wcslen(&Ext2Global->wHidingPrefix[0])) {
+        UniName.Length = sizeof(WCHAR) * wcslen(&Ext2Global->wHidingPrefix[0]);
+        UniName.MaximumLength = HIDINGPAT_LEN * sizeof(WCHAR);
+        UniName.Buffer = &Ext2Global->wHidingPrefix[0];
+        AnsiName.MaximumLength = HIDINGPAT_LEN;
         AnsiName.Length = 0;
         AnsiName.Buffer = &(Ext2Global->sHidingPrefix[0]);
 
@@ -279,26 +377,12 @@
     }
     Ext2Global->sHidingPrefix[HIDINGPAT_LEN - 1] = 0;
 
-    /* querying name hiding patterns: suffix */
-    RtlZeroMemory(&QueryTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
-    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
-    QueryTable[0].Name = HIDING_SUFFIX;
-    QueryTable[0].EntryContext = &(UniName);
-    UniName.MaximumLength = HIDINGPAT_LEN * sizeof(WCHAR);
-    UniName.Length = 0;
-    UniName.Buffer = Buffer;
-
-    Status = RtlQueryRegistryValues(
-                 RTL_REGISTRY_ABSOLUTE,
-                 ParameterPath.Buffer,
-                 &QueryTable[0],
-                 NULL,
-                 NULL
-             );
-
-    if (NT_SUCCESS(Status)) {
 
-        DEBUG(DL_ERR, ( "Ext2QueryParameters: HidingSuffix=%wZ\n", &UniName));
+    /* set global hidden suffix pattern */
+    if (wcslen(&Ext2Global->wHidingSuffix[0])) {
+        UniName.Length = sizeof(WCHAR) * wcslen(&Ext2Global->wHidingSuffix[0]);
+        UniName.MaximumLength = HIDINGPAT_LEN * sizeof(WCHAR);
+        UniName.Buffer = &Ext2Global->wHidingSuffix[0];
         AnsiName.MaximumLength = HIDINGPAT_LEN;
         AnsiName.Length = 0;
         AnsiName.Buffer = &(Ext2Global->sHidingSuffix[0]);
@@ -317,29 +401,6 @@
     }
     Ext2Global->sHidingPrefix[HIDINGPAT_LEN - 1] = 0;
 
-    {
-        if (WritingSupport) {
-            SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
-        } else {
-            ClearLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
-        }
-
-        if (CheckingBitmap) {
-            SetLongFlag(Ext2Global->Flags, EXT2_CHECKING_BITMAP);
-        } else {
-            ClearLongFlag(Ext2Global->Flags, EXT2_CHECKING_BITMAP);
-        }
-
-        if (Ext3ForceWriting) {
-            DbgPrint("Ext2Fsd -- Warning: Ext3ForceWriting enabled !!!\n");
-
-            SetLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
-            SetLongFlag(Ext2Global->Flags, EXT2_SUPPORT_WRITING);
-        } else {
-            ClearLongFlag(Ext2Global->Flags, EXT3_FORCE_WRITING);
-        }
-    }
-
     Ext2Global->RegistryPath.Buffer = ParameterPath.Buffer;
     Ext2Global->RegistryPath.Length = 0;
     Ext2Global->RegistryPath.MaximumLength = ParameterPath.MaximumLength;
@@ -358,6 +419,23 @@
                (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \
 )
 
+VOID
+Ext2EresourceAlignmentChecking()
+{
+    /* Verify ERESOURCE alignment in structures */
+    CL_ASSERT((FIELD_OFFSET(EXT2_GLOBAL, Resource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, MainResource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, PagingIoResource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, MetaInode) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, MetaBlock) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, McbLock) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, bd.bd_bh_lock) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_VCB, sbi.s_gd_lock) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_FCBVCB, MainResource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_FCBVCB, PagingIoResource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_FCB, MainResource) & 7) == 0);
+    CL_ASSERT((FIELD_OFFSET(EXT2_FCB, PagingIoResource) & 7) == 0);
+}
 
 /*
  * NAME: DriverEntry
@@ -382,24 +460,12 @@
     PFAST_IO_DISPATCH           FastIoDispatch;
     PCACHE_MANAGER_CALLBACKS    CacheManagerCallbacks;
 
-    LARGE_INTEGER               Timeout;
     NTSTATUS                    Status;
 
     int                         rc = 0;
     BOOLEAN                     linux_lib_inited = FALSE;
     BOOLEAN                     journal_module_inited = FALSE;
 
-    /* Verify ERESOURCE alignment in structures */
-    ASSERT((FIELD_OFFSET(EXT2_GLOBAL, Resource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_VCB, MainResource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_VCB, PagingIoResource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_VCB, MetaLock) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_VCB, McbLock) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_FCBVCB, MainResource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_FCBVCB, PagingIoResource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_FCB, MainResource) & 7) == 0);
-    ASSERT((FIELD_OFFSET(EXT2_FCB, PagingIoResource) & 7) == 0);
-
     /* Verity super block ... */
     ASSERT(sizeof(EXT2_SUPER_BLOCK) == 1024);
     ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, s_magic) == 56);
@@ -452,12 +518,8 @@
     InitializeListHead(&(Ext2Global->VcbList));
     ExInitializeResourceLite(&(Ext2Global->Resource));
 
-    /* Reaper thread engine event */
-    KeInitializeEvent(&Ext2Global->Reaper.Engine,
-                      SynchronizationEvent, FALSE);
-
     /* query registry settings */
-    Ext2QueryGlobalParameters(RegistryPath);
+    Ext2QueryRegistrySettings(RegistryPath);
 
     /* create Ext2Fsd cdrom fs deivce */
     RtlInitUnicodeString(&DeviceName, CDROM_NAME);
@@ -492,21 +554,18 @@
     }
 
     /* start resource reaper thread */
-    Status= Ext2StartReaperThread();
+    Status= Ext2StartReaper(
+                &Ext2Global->McbReaper,
+                Ext2McbReaperThread);
     if (!NT_SUCCESS(Status)) {
         goto errorout;
     }
-    /* make sure Reaperthread is started */
-    Timeout.QuadPart = (LONGLONG)-10*1000*1000*10; /* 10 seconds */
-    Status = KeWaitForSingleObject(
-                 &(Ext2Global->Reaper.Engine),
-                 Executive,
-                 KernelMode,
-                 FALSE,
-                 &Timeout
-             );
-    if (Status != STATUS_SUCCESS) {
-        Status = STATUS_INSUFFICIENT_RESOURCES;
+
+    Status= Ext2StartReaper(
+                &Ext2Global->bhReaper,
+                Ext2bhReaperThread);
+    if (!NT_SUCCESS(Status)) {
+        Ext2StopReaper(&Ext2Global->McbReaper);
         goto errorout;
     }
 
@@ -562,12 +621,16 @@
     FastIoDispatch->FastIoUnlockAll               = Ext2FastIoUnlockAll;
     FastIoDispatch->FastIoUnlockAllByKey          = Ext2FastIoUnlockAllByKey;
     FastIoDispatch->FastIoQueryNetworkOpenInfo    = Ext2FastIoQueryNetworkOpenInfo;
+
+    FastIoDispatch->AcquireForModWrite            = Ext2AcquireFileForModWrite;
+    FastIoDispatch->ReleaseForModWrite            = Ext2ReleaseFileForModWrite;
     FastIoDispatch->AcquireForModWrite            = Ext2AcquireFileForModWrite;
     FastIoDispatch->ReleaseForModWrite            = Ext2ReleaseFileForModWrite;
     FastIoDispatch->AcquireForCcFlush             = Ext2AcquireFileForCcFlush;
     FastIoDispatch->ReleaseForCcFlush             = Ext2ReleaseFileForCcFlush;
     FastIoDispatch->AcquireFileForNtCreateSection = Ext2AcquireForCreateSection;
     FastIoDispatch->ReleaseFileForNtCreateSection = Ext2ReleaseForCreateSection;
+
     DriverObject->FastIoDispatch = FastIoDispatch;
 
     //
@@ -631,6 +694,19 @@
     Ext2Global->CacheManagerNoOpCallbacks.AcquireForReadAhead  = Ext2NoOpAcquire;
     Ext2Global->CacheManagerNoOpCallbacks.ReleaseFromReadAhead = Ext2NoOpRelease;
 
+
+#ifndef _WIN2K_TARGET_
+    //
+    // Initialize FS Filter callbacks
+    //
+
+    RtlZeroMemory(&Ext2Global->FilterCallbacks,  sizeof(FS_FILTER_CALLBACKS));
+    Ext2Global->FilterCallbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS);
+    Ext2Global->FilterCallbacks.PreAcquireForSectionSynchronization = Ext2PreAcquireForCreateSection;
+    FsRtlRegisterFileSystemFilterCallbacks(DriverObject,  &Ext2Global->FilterCallbacks );
+
+#endif
+
     //
     // Initialize the global data
     //
diff -uNr 0.63/Ext3Fsd/linux.c 0.66/Ext3Fsd/linux.c
--- 0.63/Ext3Fsd/linux.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/linux.c	2016-04-19 16:38:20.000000000 +0200
@@ -329,10 +329,16 @@
     struct buffer_head * bh = NULL;
     bh = kmem_cache_alloc(g_jbh.bh_cache, GFP_NOFS);
     if (bh) {
+        atomic_inc(&g_jbh.bh_count);
+        atomic_inc(&g_jbh.bh_acount);
+
         memset(bh, 0, sizeof(struct buffer_head));
+        InitializeListHead(&bh->b_link);
+        KeQuerySystemTime(&bh->b_ts_creat);
         DEBUG(DL_BH, ("bh=%p allocated.\n", bh));
         INC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head));
     }
+
     return bh;
 }
 
@@ -344,13 +350,9 @@
 
             DEBUG(DL_BH, ("bh=%p mdl=%p (Flags:%xh VA:%p) released.\n", bh, bh->b_mdl,
                           bh->b_mdl->MdlFlags, bh->b_mdl->MappedSystemVa));
-            if (IsFlagOn(bh->b_mdl->MdlFlags, MDL_PAGES_LOCKED)) {
-                /* MmUnlockPages will release it's VA */
-                MmUnlockPages(bh->b_mdl);
-            } else if (IsFlagOn(bh->b_mdl->MdlFlags, MDL_MAPPED_TO_SYSTEM_VA)) {
+            if (IsFlagOn(bh->b_mdl->MdlFlags, MDL_MAPPED_TO_SYSTEM_VA)) {
                 MmUnmapLockedPages(bh->b_mdl->MappedSystemVa, bh->b_mdl);
             }
-
             Ext2DestroyMdl(bh->b_mdl);
         }
         if (bh->b_bcb) {
@@ -360,6 +362,7 @@
         DEBUG(DL_BH, ("bh=%p freed.\n", bh));
         DEC_MEM_COUNT(PS_BUFF_HEAD, bh, sizeof(struct buffer_head));
         kmem_cache_free(g_jbh.bh_cache, bh);
+        atomic_dec(&g_jbh.bh_count);
     }
 }
 
@@ -436,7 +439,6 @@
     PVOID         bcb = NULL;
     PVOID         ptr = NULL;
 
-    KIRQL irql = 0;
     struct list_head *entry;
 
     /* allocate buffer_head and initialize it */
@@ -449,15 +451,15 @@
     }
 
     /* search the bdev bh list */
-    spin_lock_irqsave(&bdev->bd_bh_lock, irql);
+    ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE);
     tbh = buffer_head_search(bdev, block);
     if (tbh) {
         bh = tbh;
         get_bh(bh);
-        spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+        ExReleaseResourceLite(&bdev->bd_bh_lock);
         goto errorout;
     }
-    spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    ExReleaseResourceLite(&bdev->bd_bh_lock);
 
     bh = new_buffer_head();
     if (!bh) {
@@ -467,8 +469,6 @@
     bh->b_blocknr = block;
     bh->b_size = size;
     bh->b_data = NULL;
-    atomic_inc(&g_jbh.bh_count);
-    atomic_inc(&g_jbh.bh_acount);
 
 again:
 
@@ -499,13 +499,14 @@
         set_buffer_uptodate(bh);
     }
 
-    bh->b_mdl = Ext2CreateMdl(ptr, TRUE, bh->b_size, IoModifyAccess);
+    bh->b_mdl = Ext2CreateMdl(ptr, bh->b_size, IoModifyAccess);
     if (bh->b_mdl) {
         /* muse map the PTE to NonCached zone. journal recovery will
            access the PTE under spinlock: DISPATCH_LEVEL IRQL */
         bh->b_data = MmMapLockedPagesSpecifyCache(
                          bh->b_mdl, KernelMode, MmNonCached,
                          NULL,FALSE, HighPagePriority);
+        /* bh->b_data = MmMapLockedPages(bh->b_mdl, KernelMode); */
     }
     if (!bh->b_mdl || !bh->b_data) {
         free_buffer_head(bh);
@@ -518,20 +519,21 @@
     DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p mdl=%p (Flags:%xh VA:%p)\n",
                   Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_mdl, bh->b_mdl->MdlFlags, bh->b_data));
 
-    spin_lock_irqsave(&bdev->bd_bh_lock, irql);
-
+    ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE);
     /* do search again here */
     tbh = buffer_head_search(bdev, block);
     if (tbh) {
         free_buffer_head(bh);
         bh = tbh;
         get_bh(bh);
-        spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+        RemoveEntryList(&bh->b_link);
+        InitializeListHead(&bh->b_link);
+        ExReleaseResourceLite(&bdev->bd_bh_lock);
         goto errorout;
-    } else
+    } else {
         buffer_head_insert(bdev, bh);
-
-    spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    }
+    ExReleaseResourceLite(&bdev->bd_bh_lock);
 
     /* we get it */
 errorout:
@@ -602,7 +604,7 @@
 }
 
 struct buffer_head *
-get_block_bh(
+get_block_bh_pin(
     struct block_device *   bdev,
     sector_t                block,
     unsigned long           size,
@@ -612,7 +614,6 @@
     PEXT2_VCB Vcb = bdev->bd_priv;
     LARGE_INTEGER offset;
 
-    KIRQL irql = 0;
     struct list_head *entry;
 
     /* allocate buffer_head and initialize it */
@@ -625,15 +626,15 @@
     }
 
     /* search the bdev bh list */
-    spin_lock_irqsave(&bdev->bd_bh_lock, irql);
+    ExAcquireSharedStarveExclusive(&bdev->bd_bh_lock, TRUE);
     tbh = buffer_head_search(bdev, block);
     if (tbh) {
         bh = tbh;
         get_bh(bh);
-        spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+        ExReleaseResourceLite(&bdev->bd_bh_lock);
         goto errorout;
     }
-    spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    ExReleaseResourceLite(&bdev->bd_bh_lock);
 
     bh = new_buffer_head();
     if (!bh) {
@@ -643,8 +644,6 @@
     bh->b_blocknr = block;
     bh->b_size = size;
     bh->b_data = NULL;
-    atomic_inc(&g_jbh.bh_count);
-    atomic_inc(&g_jbh.bh_acount);
 
 again:
 
@@ -656,7 +655,7 @@
                             &offset,
                             bh->b_size,
                             FALSE,
-                            PIN_WAIT | PIN_EXCLUSIVE,
+                            PIN_WAIT,
                             &bh->b_bcb,
                             &bh->b_data)) {
             Ext2Sleep(100);
@@ -675,33 +674,34 @@
         set_buffer_uptodate(bh);
     }
 
+    if (bh->b_bcb)
+        CcSetBcbOwnerPointer(bh->b_bcb, (PVOID)((ERESOURCE_THREAD)bh | 0x3));
+
     if (!bh->b_data) {
         free_buffer_head(bh);
         bh = NULL;
         goto errorout;
     }
-
     get_bh(bh);
-    CcSetBcbOwnerPointer(bh->b_bcb, (PVOID)((ERESOURCE_THREAD)bh | 0x3));
 
     DEBUG(DL_BH, ("getblk: Vcb=%p bhcount=%u block=%u bh=%p ptr=%p.\n",
                   Vcb, atomic_read(&g_jbh.bh_count), block, bh, bh->b_data));
 
-    spin_lock_irqsave(&bdev->bd_bh_lock, irql);
-
+    ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE);
     /* do search again here */
     tbh = buffer_head_search(bdev, block);
     if (tbh) {
         get_bh(tbh);
-        spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+        ExReleaseResourceLite(&bdev->bd_bh_lock);
         free_buffer_head(bh);
         bh = tbh;
+        RemoveEntryList(&bh->b_link);
+        InitializeListHead(&bh->b_link);
         goto errorout;
     } else {
         buffer_head_insert(bdev, bh);
     }
-
-    spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    ExReleaseResourceLite(&bdev->bd_bh_lock);
 
     /* we get it */
 errorout:
@@ -709,7 +709,7 @@
     return bh;
 }
 
-int submit_bh(int rw, struct buffer_head *bh)
+int submit_bh_pin(int rw, struct buffer_head *bh)
 {
     struct block_device *bdev = bh->b_bdev;
     PEXT2_VCB            Vcb  = bdev->bd_priv;
@@ -744,6 +744,43 @@
     return 0;
 }
 
+#if 0
+
+struct buffer_head *
+get_block_bh(
+    struct block_device *   bdev,
+    sector_t                block,
+    unsigned long           size,
+    int                     zero
+) 
+{
+    return get_block_bh_mdl(bdev, block, size, zero);
+}
+
+int submit_bh(int rw, struct buffer_head *bh)
+{
+    return submit_bh_mdl(rw, bh);
+}
+
+#else
+
+struct buffer_head *
+get_block_bh(
+    struct block_device *   bdev,
+    sector_t                block,
+    unsigned long           size,
+    int                     zero
+) 
+{
+    return get_block_bh_pin(bdev, block, size, zero);
+}
+
+int submit_bh(int rw, struct buffer_head *bh)
+{
+    return submit_bh_pin(rw, bh);
+}
+#endif
+
 struct buffer_head *
 __getblk(
     struct block_device *   bdev,
@@ -758,7 +795,6 @@
 {
     struct block_device *bdev = bh->b_bdev;
     PEXT2_VCB Vcb = (PEXT2_VCB)bdev->bd_priv;
-    KIRQL   irql = 0;
 
     ASSERT(Vcb->Identifier.Type == EXT2VCB);
 
@@ -767,20 +803,30 @@
         ll_rw_block(WRITE, 1, &bh);
     }
 
-    spin_lock_irqsave(&bdev->bd_bh_lock, irql);
-    if (!atomic_dec_and_test(&bh->b_count)) {
-        spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    if (1 == atomic_read(&bh->b_count)) {
+    } else if (atomic_dec_and_test(&bh->b_count)) {
+        atomic_inc(&bh->b_count);
+    } else {
+        return;
+    }
+
+    ExAcquireResourceExclusiveLite(&bdev->bd_bh_lock, TRUE);
+    if (atomic_dec_and_test(&bh->b_count)) {
+        ASSERT(0 == atomic_read(&bh->b_count));
+    } else {
+        ExReleaseResourceLite(&bdev->bd_bh_lock);
         return;
     }
     buffer_head_remove(bdev, bh);
-    spin_unlock_irqrestore(&bdev->bd_bh_lock, irql);
+    KeQuerySystemTime(&bh->b_ts_drop);
+    InsertTailList(&Vcb->bd.bd_bh_free, &bh->b_link);
+    KeClearEvent(&Vcb->bd.bd_bh_notify);
+    ExReleaseResourceLite(&bdev->bd_bh_lock);
+    KeSetEvent(&Ext2Global->bhReaper.Wait, 0, FALSE);
 
     DEBUG(DL_BH, ("brelse: cnt=%u size=%u blk=%10.10xh bh=%p ptr=%p\n",
                   atomic_read(&g_jbh.bh_count) - 1, bh->b_size,
                   bh->b_blocknr, bh, bh->b_data ));
-
-    free_buffer_head(bh);
-    atomic_dec(&g_jbh.bh_count);
 }
 
 
@@ -863,10 +909,7 @@
 int sync_blockdev(struct block_device *bdev)
 {
     PEXT2_VCB Vcb = (PEXT2_VCB) bdev->bd_priv;
-
-    if (0 == atomic_read(&g_jbh.bh_count)) {
-        Ext2FlushVolume(NULL, Vcb, FALSE);
-    }
+    Ext2FlushVolume(NULL, Vcb, FALSE);
     return 0;
 }
 
diff -uNr 0.63/Ext3Fsd/memory.c 0.66/Ext3Fsd/memory.c
--- 0.63/Ext3Fsd/memory.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/memory.c	2016-04-19 16:38:20.000000000 +0200
@@ -31,7 +31,8 @@
 #pragma alloc_text(PAGE, Ext2DestroyVcb)
 #pragma alloc_text(PAGE, Ext2SyncUninitializeCacheMap)
 #pragma alloc_text(PAGE, Ext2ReaperThread)
-#pragma alloc_text(PAGE, Ext2StartReaperThread)
+#pragma alloc_text(PAGE, Ext2StartReaper)
+#pragma alloc_text(PAGE, Ext2StopReaper)
 #endif
 
 PEXT2_IRP_CONTEXT
@@ -1402,7 +1403,7 @@
 
     /* need wake the reaper thread if there are many Mcb allocated */
     if (Ext2Global->PerfStat.Current.Mcb > (((ULONG)Ext2Global->MaxDepth) * 4)) {
-        KeSetEvent(&Ext2Global->Reaper.Wait, 0, FALSE);
+        KeSetEvent(&Ext2Global->McbReaper.Wait, 0, FALSE);
     }
 
     /* allocate Mcb from LookasideList */
@@ -1980,7 +1981,7 @@
 VOID
 Ext2ParseRegistryVolumeParams(
     IN  PUNICODE_STRING         Params,
-    OUT PEXT2_VOLUME_PROPERTY2  Property
+    OUT PEXT2_VOLUME_PROPERTY3  Property
 )
 {
     WCHAR       Codepage[CODEPAGE_MAXLEN];
@@ -1988,11 +1989,15 @@
     WCHAR       Suffix[HIDINGPAT_LEN];
     USHORT      MountPoint[4];
     UCHAR       DrvLetter[4];
+    WCHAR       wUID[8], wGID[8], wEUID[8], wEGID[8];
+    CHAR        sUID[8], sGID[8], sEUID[8], sEGID[8];
 
     BOOLEAN     bWriteSupport = FALSE,
                 bCheckBitmap = FALSE,
                 bCodeName = FALSE,
                 bMountPoint = FALSE;
+    BOOLEAN     bUID = 0, bGID = 0, bEUID = 0, bEGID = 0;
+
     struct {
         PWCHAR   Name;      /* parameters name */
         PBOOLEAN bExist;    /* is it contained in params */
@@ -2018,6 +2023,11 @@
         {MOUNT_POINT, &bMountPoint, 4,
          &MountPoint[0], &DrvLetter[0]},
 
+        {UID,  &bUID,  8, &wUID[0],  &sUID[0],},
+        {GID,  &bGID,  8, &wGID[0],  &sGID[0]},
+        {EUID, &bEUID, 8, &wEUID[0], &sEUID[0]},
+        {EGID, &bEGID, 8, &wEGID[0], &sEGID[0]},
+
         /* end */
         {NULL, NULL, 0, NULL}
     };
@@ -2030,9 +2040,9 @@
     RtlZeroMemory(MountPoint, sizeof(USHORT) * 4);
     RtlZeroMemory(DrvLetter, sizeof(CHAR) * 4);
 
-    RtlZeroMemory(Property, sizeof(EXT2_VOLUME_PROPERTY2));
+    RtlZeroMemory(Property, sizeof(EXT2_VOLUME_PROPERTY3));
     Property->Magic = EXT2_VOLUME_PROPERTY_MAGIC;
-    Property->Command = APP_CMD_SET_PROPERTY2;
+    Property->Command = APP_CMD_SET_PROPERTY3;
 
     for (i=0; ParamPattern[i].Name != NULL; i++) {
 
@@ -2088,6 +2098,22 @@
         Property->DrvLetter = DrvLetter[0];
         Property->DrvLetter |= 0x80;
     }
+
+    if (bUID && bGID) {
+        SetFlag(Property->Flags2, EXT2_VPROP3_USERIDS);
+        sUID[7] = sGID[7] = sEUID[7] = sEGID[7] = 0;
+        Property->uid = (USHORT)atoi(sUID);
+        Property->gid = (USHORT)atoi(sGID);
+        if (bEUID) {
+            Property->euid = (USHORT)atoi(sEUID);
+            Property->egid = (USHORT)atoi(sEGID);
+            Property->EIDS = TRUE;
+        } else {
+            Property->EIDS = FALSE;
+        }
+    } else {
+        ClearFlag(Property->Flags2, EXT2_VPROP3_USERIDS);
+    }
 }
 
 NTSTATUS
@@ -2100,7 +2126,7 @@
     if (NT_SUCCESS(Status)) {
 
         /* set Vcb settings from registery */
-        EXT2_VOLUME_PROPERTY2  Property;
+        EXT2_VOLUME_PROPERTY3  Property;
         Ext2ParseRegistryVolumeParams(&VolumeParams, &Property);
         Ext2ProcessVolumeProperty(Vcb, &Property, sizeof(Property));
 
@@ -2240,6 +2266,7 @@
     BOOLEAN                     NotifySyncInitialized = FALSE;
     BOOLEAN                     ExtentsInitialized = FALSE;
     BOOLEAN                     InodeLookasideInitialized = FALSE;
+    BOOLEAN                     GroupLoaded = FALSE;
 
     __try {
 
@@ -2286,8 +2313,10 @@
         /* initialize eresources */
         ExInitializeResourceLite(&Vcb->MainResource);
         ExInitializeResourceLite(&Vcb->PagingIoResource);
-        ExInitializeResourceLite(&Vcb->MetaLock);
+        ExInitializeResourceLite(&Vcb->MetaInode);
+        ExInitializeResourceLite(&Vcb->MetaBlock);
         ExInitializeResourceLite(&Vcb->McbLock);
+        ExInitializeResourceLite(&Vcb->sbi.s_gd_lock);
 #ifndef _WIN2K_TARGET_
         ExInitializeFastMutex(&Vcb->Mutex);
         FsRtlSetupAdvancedHeader(&Vcb->Header,  &Vcb->Mutex);
@@ -2360,15 +2389,7 @@
         /* initialize UUID and serial number */
         if (Ext2IsNullUuid(sb->s_uuid)) {
             ExUuidCreate((UUID *)sb->s_uuid);
-        } else {
-            /* query parameters from registry */
-            if (!NT_SUCCESS(Ext2PerformRegistryVolumeParams(Vcb))) {
-                /* don't mount this volume */
-                Status = STATUS_UNRECOGNIZED_VOLUME;
-                __leave;
-            }
         }
-
         Vpb->SerialNumber = ((ULONG*)sb->s_uuid)[0] +
                             ((ULONG*)sb->s_uuid)[1] +
                             ((ULONG*)sb->s_uuid)[2] +
@@ -2464,7 +2485,10 @@
         Vcb->bd.bd_volume = Vcb->Volume;
         Vcb->bd.bd_priv = (void *) Vcb;
         memset(&Vcb->bd.bd_bh_root, 0, sizeof(struct rb_root));
-        spin_lock_init(&Vcb->bd.bd_bh_lock);
+        InitializeListHead(&Vcb->bd.bd_bh_free);
+        ExInitializeResourceLite(&Vcb->bd.bd_bh_lock);
+        KeInitializeEvent(&Vcb->bd.bd_bh_notify,
+                           NotificationEvent, TRUE);
         Vcb->bd.bd_bh_cache = kmem_cache_create("bd_bh_buffer",
                                                 Vcb->BlockSize, 0, 0, NULL);
         if (!Vcb->bd.bd_bh_cache) {
@@ -2593,6 +2617,7 @@
             Status = STATUS_UNSUCCESSFUL;
             __leave;
         }
+        GroupLoaded = TRUE;
 
         /* recovery journal since it's ext3 */
         if (Vcb->IsExt3fs) {
@@ -2649,6 +2674,10 @@
 
         /* get anything doen, then refer target device */
         ObReferenceObject(Vcb->TargetDeviceObject);
+
+        /* query parameters from registry */
+        Ext2PerformRegistryVolumeParams(Vcb);
+
         SetLongFlag(Vcb->Flags, VCB_INITIALIZED);
 
     } __finally {
@@ -2664,9 +2693,11 @@
             }
 
             if (ExtentsInitialized) {
-                Ext2DropGroup(Vcb);
-                if (Vcb->bd.bd_bh_cache)
+                if (Vcb->bd.bd_bh_cache) {
+                    if (GroupLoaded)
+                        Ext2PutGroup(Vcb);
                     kmem_cache_destroy(Vcb->bd.bd_bh_cache);
+                }
                 FsRtlUninitializeLargeMcb(&(Vcb->Extents));
             }
 
@@ -2683,7 +2714,9 @@
 
             if (VcbResourceInitialized) {
                 ExDeleteResourceLite(&Vcb->McbLock);
-                ExDeleteResourceLite(&Vcb->MetaLock);
+                ExDeleteResourceLite(&Vcb->MetaInode);
+                ExDeleteResourceLite(&Vcb->MetaBlock);
+                ExDeleteResourceLite(&Vcb->sbi.s_gd_lock);
                 ExDeleteResourceLite(&Vcb->MainResource);
                 ExDeleteResourceLite(&Vcb->PagingIoResource);
             }
@@ -2745,6 +2778,7 @@
 
     if (Vcb->bd.bd_bh_cache)
         kmem_cache_destroy(Vcb->bd.bd_bh_cache);
+    ExDeleteResourceLite(&Vcb->bd.bd_bh_lock);
 
     if (Vcb->SuperBlock) {
         Ext2FreePool(Vcb->SuperBlock, EXT2_SB_MAGIC);
@@ -2763,7 +2797,9 @@
 
     ExDeleteNPagedLookasideList(&(Vcb->InodeLookasideList));
     ExDeleteResourceLite(&Vcb->McbLock);
-    ExDeleteResourceLite(&Vcb->MetaLock);
+    ExDeleteResourceLite(&Vcb->MetaInode);
+    ExDeleteResourceLite(&Vcb->MetaBlock);
+    ExDeleteResourceLite(&Vcb->sbi.s_gd_lock);
     ExDeleteResourceLite(&Vcb->PagingIoResource);
     ExDeleteResourceLite(&Vcb->MainResource);
 
@@ -2928,16 +2964,11 @@
 
 /* Reaper thread to release unused Mcb blocks */
 VOID
-Ext2ReaperThread(
+Ext2McbReaperThread(
     PVOID   Context
 )
 {
-    BOOLEAN         GlobalAcquired = FALSE;
-
-    BOOLEAN         DidNothing = TRUE;
-    BOOLEAN         LastState  = TRUE;
-    BOOLEAN         WaitLock;
-
+    PEXT2_REAPER    Reaper = Context;
     PLIST_ENTRY     List = NULL;
     LARGE_INTEGER   Timeout;
 
@@ -2946,13 +2977,19 @@
 
     ULONG           i, NumOfMcbs;
 
+    BOOLEAN         GlobalAcquired = FALSE;
+
+    BOOLEAN         DidNothing = TRUE;
+    BOOLEAN         LastState  = TRUE;
+    BOOLEAN         WaitLock;
+
     __try {
 
         /* wake up DirverEntry */
-        KeSetEvent(&Ext2Global->Reaper.Engine, 0, FALSE);
+        KeSetEvent(&Reaper->Engine, 0, FALSE);
 
         /* now process looping */
-        while (TRUE) {
+        while (!IsFlagOn(Reaper->Flags, EXT2_REAPER_FLAG_STOP)) {
 
             WaitLock = FALSE;
 
@@ -2995,13 +3032,16 @@
 
             /* wait until it is waken or it times out */
             KeWaitForSingleObject(
-                &(Ext2Global->Reaper.Wait),
+                &Reaper->Wait,
                 Executive,
                 KernelMode,
                 FALSE,
                 &Timeout
             );
 
+            if (IsFlagOn(Reaper->Flags, EXT2_REAPER_FLAG_STOP))
+                break;
+
             DidNothing = TRUE;
 
             /* acquire global exclusive lock */
@@ -3040,22 +3080,157 @@
         if (GlobalAcquired) {
             ExReleaseResourceLite(&Ext2Global->Resource);
         }
+
+        KeSetEvent(&Reaper->Engine, 0, FALSE);
     }
 
     PsTerminateSystemThread(STATUS_SUCCESS);
 }
 
 
+/* get the first Mcb record in Vcb->McbList */
+
+BOOLEAN
+Ext2QueryUnusedBH(PEXT2_VCB Vcb, PLIST_ENTRY head)
+{
+    struct buffer_head *bh = NULL;
+    PLIST_ENTRY list = NULL;
+    LARGE_INTEGER now;
+    BOOLEAN       wake = FALSE;
+
+    KeQuerySystemTime(&now);
+
+    ExAcquireResourceExclusiveLite(&Vcb->bd.bd_bh_lock, TRUE);
+    while (!IsListEmpty(&Vcb->bd.bd_bh_free)) {
+        list = RemoveHeadList(&Vcb->bd.bd_bh_free);
+        bh = CONTAINING_RECORD(list, struct buffer_head, b_link);
+        if (atomic_read(&bh->b_count)) {
+            InitializeListHead(&bh->b_link);
+            continue;
+        }
+
+        if ( IsFlagOn(Vcb->Flags, VCB_BEING_DROPPED) ||
+            (bh->b_ts_drop.QuadPart + (LONGLONG)10*1000*1000*15) > now.QuadPart ||
+            (bh->b_ts_creat.QuadPart + (LONGLONG)10*1000*1000*180) > now.QuadPart) {
+            InsertTailList(head, &bh->b_link);
+        } else {
+            InsertHeadList(&Vcb->bd.bd_bh_free, &bh->b_link);
+            break;
+        }
+    }
+    wake = IsListEmpty(&Vcb->bd.bd_bh_free);
+    ExReleaseResourceLite(&Vcb->bd.bd_bh_lock);
+
+    if (wake)
+        KeSetEvent(&Vcb->bd.bd_bh_notify, 0, FALSE);
+
+    return IsFlagOn(Vcb->Flags, VCB_BEING_DROPPED);
+}
+
+
+/* Reaper thread to release unused buffer heads */
+VOID
+Ext2bhReaperThread(
+    PVOID   Context
+)
+{
+    PEXT2_REAPER    Reaper = Context;
+    PEXT2_VCB       Vcb = NULL;
+    LIST_ENTRY      List, *Link;
+    LARGE_INTEGER   Timeout;
+
+    BOOLEAN         GlobalAcquired = FALSE;
+    BOOLEAN         DidNothing = FALSE;
+    BOOLEAN         NonWait = FALSE;
+
+    __try {
+
+        /* wake up DirverEntry */
+        KeSetEvent(&Reaper->Engine, 0, FALSE);
+
+        /* now process looping */
+        while (!IsFlagOn(Reaper->Flags, EXT2_REAPER_FLAG_STOP)) {
+
+            /* wait until it is waken or it times out */
+            if (NonWait) {
+                Timeout.QuadPart = (LONGLONG)-10*1000*10;
+                NonWait = FALSE;
+            } else if (DidNothing) {
+                Timeout.QuadPart = Timeout.QuadPart * 2;
+            } else {
+                Timeout.QuadPart = (LONGLONG)-10*1000*1000*10; /* 10 seconds */
+            }
+            KeWaitForSingleObject(
+                &Reaper->Wait,
+                Executive,
+                KernelMode,
+                FALSE,
+                &Timeout
+            );
+
+            if (IsFlagOn(Reaper->Flags, EXT2_REAPER_FLAG_STOP))
+                break;
+
+            InitializeListHead(&List);
+
+            /* acquire global exclusive lock */
+            ExAcquireResourceSharedLite(&Ext2Global->Resource, TRUE);
+            GlobalAcquired = TRUE;
+            /* search all Vcb to get unused resources freed to system */
+            for (Link = Ext2Global->VcbList.Flink;
+                 Link != &(Ext2Global->VcbList);
+                 Link = Link->Flink ) {
+
+                Vcb = CONTAINING_RECORD(Link, EXT2_VCB, Next);
+                if (Ext2QueryUnusedBH(Vcb, &List))
+                    NonWait = TRUE;
+            }
+            if (GlobalAcquired) {
+                ExReleaseResourceLite(&Ext2Global->Resource);
+                GlobalAcquired = FALSE;
+            }
+
+            DidNothing = IsListEmpty(&List);
+            while (!IsListEmpty(&List)) {
+                struct buffer_head *bh;
+                Link = RemoveHeadList(&List);
+                bh = CONTAINING_RECORD(Link, struct buffer_head, b_link);
+                ASSERT(0 == atomic_read(&bh->b_count));
+                free_buffer_head(bh);
+            }
+        }
+
+    } __finally {
+
+        if (GlobalAcquired) {
+            ExReleaseResourceLite(&Ext2Global->Resource);
+        }
+
+        KeSetEvent(&Reaper->Engine, 0, FALSE);
+    }
+
+    PsTerminateSystemThread(STATUS_SUCCESS);
+}
+
 NTSTATUS
-Ext2StartReaperThread()
+Ext2StartReaper(PEXT2_REAPER Reaper, EXT2_REAPER_RELEASE Free)
 {
     NTSTATUS status = STATUS_SUCCESS;
     OBJECT_ATTRIBUTES  oa;
     HANDLE   handle = 0;
+    LARGE_INTEGER timeout;
+
+    Reaper->Free = Free;
 
     /* initialize wait event */
     KeInitializeEvent(
-        &Ext2Global->Reaper.Wait,
+        &Reaper->Wait,
+        SynchronizationEvent, FALSE
+    );
+
+    /* Reaper thread engine event */
+    KeInitializeEvent(
+        &Reaper->Engine,
         SynchronizationEvent, FALSE
     );
 
@@ -3076,13 +3251,45 @@
                  &oa,
                  NULL,
                  NULL,
-                 Ext2ReaperThread,
-                 NULL
+                 Free,
+                 (PVOID)Reaper
              );
 
     if (NT_SUCCESS(status)) {
         ZwClose(handle);
+
+        /* make sure Reaperthread is started */
+        timeout.QuadPart = (LONGLONG)-10*1000*1000*2; /* 2 seconds */
+        status = KeWaitForSingleObject(
+                     &Reaper->Engine,
+                     Executive,
+                     KernelMode,
+                     FALSE,
+                     &timeout
+                 );
+        if (status != STATUS_SUCCESS) {
+            status = STATUS_INSUFFICIENT_RESOURCES;
+        }
     }
 
     return status;
 }
+
+
+VOID
+Ext2StopReaper(PEXT2_REAPER Reaper)
+{
+    LARGE_INTEGER timeout;
+
+    Reaper->Flags |= EXT2_REAPER_FLAG_STOP;
+    KeSetEvent(&Reaper->Wait, 0, FALSE);
+
+    /* make sure Reaperthread is started */
+    timeout.QuadPart = (LONGLONG)-10*1000*1000*2; /* 2 seconds */
+    KeWaitForSingleObject(
+                     &Reaper->Engine,
+                     Executive,
+                     KernelMode,
+                     FALSE,
+                     &timeout);
+}
diff -uNr 0.63/Ext3Fsd/notes.txt 0.66/Ext3Fsd/notes.txt
--- 0.63/Ext3Fsd/notes.txt	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/notes.txt	2016-04-19 16:38:20.000000000 +0200
@@ -1,53 +1,40 @@
-
-==================================
-Release Notes for Ext2Fsd V0.63
-==================================
-
-Features implemented or bugfix since V0.62:
-
-  Features:
-    1, Symlink (ReparsePoint) support implemented by ngkaho1234. See his
-       repository for more details: http://github.com/ngkaho1234/Ext3Fsd.git
-    2, Hard links support implemented
-    3, Win10 TH2 drive letter assignment supported
-    4, Case-insensitive-search supported (caused by dentry hash)
-    5, Peformance improvements for metadata operations
-
-  Bugs fixed:
-    1, BSOD when trying to format or dismount EXT4 volumes
-    2, invalid extent content for newly created inodes
-    3, Possible data corruption (zero data) under high pressure (WDK building)
-    4, Splash screen of Ext2Mgr removed
-
-Supported Ext3/4 features by 0.63:
-
-    1, flexible inode size: > 128 bytes, up to block size
-    2, dir_index:    htree directory index
-    3, filetype:     extra file mode in dentry
-    4, large_file:   > 4G files supported
-    5, sparse_super: super block backup in group descriptor
-    6, uninit_bg:    fast fsck and group checksum
-    7, extent:       full support with extending and shrinking.
-    8, journal:      only support replay for internal journal
-    9, flex_bg:      first flexible metadata group
-   10, symlink and hardlink
-
-Unsupported Ext3/4 features:
-
-    1, journal: log-based operations, external journal
-    2, EA (extended attributes), ACL support
-
-Features to be implemented in next release:
-
-    1, mounted as given user: privilege checking with given uid & gid
-    2, EA and ACL security checking
-
-WARNINGS:
- 
-    The driver may crash your system and ruin your data unexpectedly,
-    since there might be software conflicts and I could only test it
-    on some of the popular platforms. You should use it with care and
-    use it at your own risk!
-
-Matt <mattwu@163.com>
-http://www.ext2fsd.com
+==================================
+Release Notes for Ext2Fsd V0.66
+==================================
+
+Features implemented or bugfix:
+
+    1, FIXME: BSOD when mounting as readonly
+    2, FIXME: Ext2Srv service blocked by Antivirus
+
+Supported Ext3/4 features:
+
+    1, flexible inode size: > 128 bytes, up to block size
+    2, dir_index:    htree directory index
+    3, filetype:     extra file mode in dentry
+    4, large_file:   > 4G files supported
+    5, sparse_super: super block backup in group descriptor
+    6, uninit_bg:    fast fsck and group checksum
+    7, extent:       full support with extending and shrinking.
+    8, journal:      only support replay for internal journal
+    9, flex_bg:      first flexible metadata group
+   10, symlink and hardlink
+
+Unsupported Ext3/4 features:
+
+    1, journal: log-based operations, external journal
+    2, EA (extended attributes), ACL support
+
+Features to be implemented in next release:
+    1, Extents management improvement
+    2, EA and ACL security checking
+
+WARNINGS:
+ 
+    The driver may crash your system and ruin your data unexpectedly,
+    since there might be software conflicts and I could only test it
+    on some of the popular platforms. You should use it with care and
+    use it at your own risk!
+
+Matt <mattwu@163.com>
+http://www.ext2fsd.com
diff -uNr 0.63/Ext3Fsd/read.c 0.66/Ext3Fsd/read.c
--- 0.63/Ext3Fsd/read.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/read.c	2016-04-19 16:38:20.000000000 +0200
@@ -582,7 +582,7 @@
 
         } else {
 
-            if (Nocache) {
+            if (Nocache && Ccb != NULL && Fcb->SectionObject.DataSectionObject) {
 
                 if (!ExAcquireResourceExclusiveLite(
                             &Fcb->MainResource,
@@ -592,14 +592,23 @@
                 }
                 MainResourceAcquired = TRUE;
 
-                if (FileObject->SectionObjectPointer->DataSectionObject != NULL) {
-                    CcFlushCache( FileObject->SectionObjectPointer,
-                                 &ByteOffset,
-                                  Length,
-                                 &Irp->IoStatus );
-                    if (!NT_SUCCESS(Irp->IoStatus.Status))
-                        __leave;
+                CcFlushCache(&Fcb->SectionObject,
+                             &ByteOffset,
+                              Length,
+                             &Irp->IoStatus );
+                if (!NT_SUCCESS(Irp->IoStatus.Status))
+                    __leave;
+                ClearLongFlag(Fcb->Flags, FCB_FILE_MODIFIED);
+
+                if (ExAcquireResourceExclusiveLite(&(Fcb->PagingIoResource), TRUE)) {
+                    ExReleaseResourceLite(&(Fcb->PagingIoResource));
                 }
+                CcPurgeCacheSection( &Fcb->SectionObject,
+                                     NULL,
+                                     0,
+                                     FALSE );
+
+                ExConvertExclusiveToShared(&Fcb->MainResource);
 
             } else {
 
diff -uNr 0.63/Ext3Fsd/readme.txt 0.66/Ext3Fsd/readme.txt
--- 0.63/Ext3Fsd/readme.txt	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/readme.txt	2016-04-19 16:38:20.000000000 +0200
@@ -1,632 +1,664 @@
-======================
- About Ext2Fsd
-======================
-
-Ext2Fsd project is an ext2 file system driver for Windows (2000/2003/XP/7/8).
-
-It's a free software. Everyone can distribute and modify it under GNU GPLv2.
-
-======================
- Author & Homepage
-======================
-
-Matt<mattwu@163.com>
-http://www.ext2fsd.com
-
-
-======================
- Credits 
-======================
-
-Here, I owe all my thanks to Bo Branten<bosse@acc.umu.se> for his
-project romfs and his great contribution of the free version ntifs.h
-
-Everyone can get to him at http://www.acc.umu.se/~bosse/.
-
-
-======================
- Revision history
-======================
-
-48, V0.63:   2016-03-12
-
-Modifications from V0.62:
-
-Features:
-    1, Symlink (ReparsePoint) support implemented by ngkaho1234. See his
-       repository for more details: http://github.com/ngkaho1234/Ext3Fsd.git
-    2, Hard links support implemented
-    3, Win10 TH2 drive letter assignment supported
-    4, Case-insensitive-search supported (caused by dentry hash)
-    5, Peformance improvements for metadata operations
-
-Bugs fixed:
-    1, BSOD when trying to format or dismount EXT4 volumes
-    2, invalid extent content for newly created inodes
-    3, Possible data corruption (zero data) under high pressure (WDK building)
-    4, Splash screen of Ext2Mgr removed 
-
-47, V0.62:   2015-06-09
-
-Modifications from V0.61:
-
-    1, FIXME: STEAM game cache (data) validation failures
-              for direct-io mode, wrong reading length in bytes reported
-    2, FIXME: WDK sources compiling random failures
-
-46, V0.61:   2015-06-08
-
-Modifications from V0.60:
-
-    1, FIXME: Ext4 unwritten-extent supported to avoid possible data corruption
-              MSB of ee_len field of unwritten extent is used as only a flag. It
-              was mistakenly treated as extent length (block numbers) in V0.60
-    2, FIXME: Manually clear file to zero for indirect-block file that is newly
-              created but not yet written
-
-
-45, V0.60:   2015-06-01
-
-Modifications from V0.53:
-
-    1, Ext4 extent writing support (developed by ngkaho1234 @ gmail.com)
-       See his repository for more details:
-       http://github.com/ngkaho1234/Ext3Fsd.git
-    2, Size manipulation and i/o path revised for support of indirect and
-       extent-based mappings
-    3, 16T volume supported (tested and confirmed with 4T volume)
-       Version 0.53 and previous versions only support up to 2T volume
-       ticket: https://sourceforge.net/p/ext2fsd/bugs/134/
-    4, Deletion acceleration: truncation optimized for indirect-based files
-    5, Size-expanding disabled in IRP_MJ_CREATE for better performance.
-       Windows sometimes would truncate file size back to 0
-    6, Support Volume exclusive-open for e2fsprogs utils. Any attempts
-       will be denied while EXT4 volume is being checked (e2fsck).
-    7, FIXME:  Possible zero-content returned (requesting data from file tail)
-    8, FIXME:  File ByteOffset updated for FO_SYNCHRONOUS_IO open (async i/o)
-       ticket: https://sourceforge.net/p/ext2fsd/bugs/133/
-    9, FIXME:  don't do byte or range round up for paging i/o requests
-       ticket: https://sourceforge.net/p/ext2fsd/bugs/129/
-   10, FIXME:  occasional block bitmap difference issue, cased by checksum
-               caculation in uninit_bg group initializing
-
-44, V0.53:   2014-08-25
-
-Modifications from V0.52:
-
-    1, FIXME: BSOD with VHD/VHDX mounting on Win8
-    2, FIXME: Mke2fs failed to format mounted EXT2 volumes
-    3, Enable writing with global or volume ext3-force-writi
-    4, Support ext4 dir hash (UNSIGNED cases for legacy/half
-    5, Fixed several warnings reported by scan.coverity.com
-
-
-43, V0.52:   2014-05-10
-
-Modifications from V0.51:
-
-    1, Feature: Windows 8 supported
-    2, Feature: Force-writing supported
-    3, FIXME: data loss with TeraCopy when moving directories
-    4, FIXME: ATTO Disk Benchnmark fails with direct i/o tests
-    5, FIXME: files become invisible with empty hidden pattens
-    6, FIXME: possible hang with concurrent access attempts
-              upon the same file
-    7, FIXME: BSOD due to pagable code sections
-
-42, V0.51:   2011-07-10
-
-Modifications from V0.50:
-
-    1, FIXME: Data corruption issue, especially for multiple-thread
-       writing on XP system
-    2, FIXME: Set ValidDataLength only for FileEndOfFileInformation
-       w/ AdvanceOnly    
-    3, Support writing to ext4 volumes w/ flex_bg
-    4, Code cleanup and enhancement for global/volume property settings
-
-41, V0.50:   2011-02-01
-
-Modifications from V0.48:
-
-    1, Ext4 extent readonly support by Bo Branten. Writing is
-       possible but with no size-extending
-    2, Ext3 directory index (hash-tree) support
-    3, Fast fsck (uninit_bg) and group block checksum support
-    4, Ext4 64k block size support
-    5, Symlink/special inodes open/read/deletion support
-    6, Buffer head implemented over cache pages
-    7, Memory allocation optimization for flexible-size inodes
-    8, Improve file deletion: don't grab global lock when deleting
-    9, FIXME: return zero-content for sparse file gaps
-   10, FIXME: check available spaces before blocks allocation
-   11, FIXME: refresh stale root dir content after journal replay
-   12, FIXME: incompatible dentry management for 64k block size
-   13, FIXME: don't do journal replay for devices set as readonly
-   14, FIXME: Win7 cmd.exe always reports file sizes as zero
-   15, FIXME: Win7 memory throttling issue calling CcPinRead
-   16, FIXME: Ext3Fsd Build issues (SLIST/div64 for Win2k, browser files)
-   17, FIXME: Compiling test failure (fastio doesn't update i_size)
-   18, FIXME: Possible Mcb memory leak for symbolic links
-
-40, V0.48:   2009-07-26
-
-Modifications from V0.47:
-
-    1, Acronis TrueImage compatible issue solved:
-       Verified with Acronis True Image Home 2009. Also verified with
-       FreeOFTE 3.0, TrueCrypt 6.2a.
-    2, Driver code-signed for Vista and Server 2008
-    3, Code improvements for FastIo routines and drive letter & mount
-       points management
-
-39, V0.47:   2009-06-01
-
-Modifications from V0.46:
-
-    1, Bo Branten's 5+ patches merged, lots ifstest failures resolved
-    2, Mount point automatic assignment for USB key and other removable
-       disks or removable media devices
-
-38, V0.46:   2008-05-24
-
-Modifications from V0.46:
-
-    1, ext3 journal check and replay implemented. If the journal is
-       not empty ext2fsd will replay the journal and make the file
-       system consistent as an ext2 file system.
-    2, flexible-inode-size supported. recent Linux are using 256-byte
-       inode that fails 0.45 and before to show all the files.
-    3, FIXME: 2 minor issues that mislead EditPlus. EditPlus is always
-       trying to open any file with directory_only flag set to judge
-       whether the target is a directory or file, when the file isn't
-       a directory, the open request should be denied. But Ext2Fsd 0.45
-       and before doesn't. Another issue is that ext2 file time on disk
-       has different precision against windows (1 second vs 100 nano
-       second), which causes EditPlus thinks the file is being changed.
-    4, FIXME: a severe bug (likely happen on win2k system) which cause
-       dirty caches missed and slow down the whole system. 
-    5, many other minor changes: bulk block allocation/release, possible
-       inode allocation dead-loop when all inodes are used out, Ext2Mgr
-       win2k support, other performance improvements.
-
-37, V0.45:   2008-02-19
-
-Modifications from V0.44:
-
-    1, set hidden attribute for all files starting with "."
-    2, update cache window size when writing to file end
-    3, reaper resources allocated during file creation
-
-36, V0.44:   2008-02-09
-
-Modifications from V0.43:
-
-    1, Ext2Fsd: LastWriteTime/LastAccessTime update
-    2, Ext2Mgr: Show driver/app versions in About dialog
-
-35, V0.43:   2008-02-01
-
-Modifications from V0.42:
-
-    1, Ext2Fsd: hidden/system attribute handling
-    2, Ext2Mgr: Added manifest to cope with UAC
-
-34, V0.42:   2008-01-26
-
-Features implemented:
-    1, Mountpoint auto mount/removal supported for removable disks
-
-33, V0.41:   2008-01-25
-
-Modifications from V0.40:
-
-Bugs/Problems Fixed:
-
-    1,  Some files couldn't be shown in explorer with utf8 codepage
-    2,  System always pops "device is busy" when removing USB disks
-
-Features implemented:
-
-    1, Ext2Fsd: Updated codepage encodings to latest Linux kernel
-    2, Ext2Mgr: Added Chinese translation which is in high demand
-                Enhanced mountpoints management for removable devices
-
-32, V0.40:   2008-01-13
-
-Modifications from V0.39
-
-Bugs/Problems Fixed:
-
-    1,  Directory inode isn't freed after directory deletion
-    2,  Retrieval pointers implemented for extents mapping
-    3,  Correct the handling of STATUS_CANT_WAIT. Vista's Cache
-        Manager often fails us on PingRead when copying bunch of
-        files/directories from ext2 volumes, and thus it results
-        in zero-data-content in copied files
-    4,  Optimize space allocation to minimize fragments
-
-31, V0.39:   2008-01-09
-
-Modifications from V0.38
-
-  Bugs Fixed:
-
-    1, Disk space isn't released after deleting big files larger than
-       (BLOCK_SIZE * (12 + BLOCK_SIZE/4 + BLOCK_SIZE * BLOCK_SIZE / 16))
-       That's 4,299,210,752 in case BLOCK_SIZE is 4096.
-
-30, V0.38:   2008-01-04
-
-Modifications from V0.37
-
-  Bugs Fixed:
-
-     1, File block extents management improved to decrease CPU usage
-     2, Re-queue request when cache manager can't prepare pages in time
-     3, Possible deletion of it's hardlink entry when removing a file
-     4, Prohibit to create file with same names to dead symlinks
-     5, Wrong inode type in directory entry for symbol links
-     6, Possible memory leak when failed to overwrite file
-     7, Memory leak in Ext2FreeMcb, it's counted but not freed.
-     8, Possible loss of inode/dentry update: Ext2WriteVolume might
-        miss the dirty windows with SECTOR_SIZE aligned borders
-     9, SpinLock related routines shouldn't be resident in paged zone
-    10, Possible lost of files in directory listing
-
-29, V0.37:   2007-12-25
-
-  Bugs Fixed:
-
-      1, files >=4G couldn't be copy&paste to ext2 volume, caused by a hardcode
-         limit in Ext2CreateFile
-      2, failure of "No enough memory" when renaming files under directories
-         it likely happens when renaming files under subdirectory with Samba
-         or Linux kernel CIFS.
-      3, possible deadlock in renaming with simultaneous access on the same file
-      4, possible wrong entry (hardlinks) deletion instead of itself: it's
-         rare to happen but possible when renaming, moving or deleting files. 
-      5, entry management routines enhancement 
-      6, 64k-block support
-
-28, V0.36:   2007-12-22
-
-  Bugs Fixed:
-
-      1, BSOD caused by symlink pointing to itself or others
-      2, bug in new inode allocation algorithm 
-      3, "." and ".." are treated as separate inodes
-      4, remove unnecessary local variables to reduce stack
-         overflow chances especially for nested symlinks
-      5, overall optimizations on block allocation/release/mapping 
-      6, non-consistent Mcb reference issue (broken by symlinks)
-      7, memory leaks of BLOCK_DATA when expanding file
-      8, buffer overflow in Ext2Printf only for checked build
-      9, bug in handling exception of working cdroms ejection
-
-  Features Newly Implemented:
-
-      1, remove the execute bit ('x') for all newly created files 
-      2, enhance memory reaper mechanism of all Xcbs (Fcb/Mcb)
-      3, big block support (up to 32k) 
-      4, statistics of memory allocation / irp handling
-
-  Ext2 Volume Manager:
-
-      1, crash with RAW disk (non-partitioned)
-      2, wrong message box poped when setting service property
-      3, more partition types recognized
-      4, support memory/irp statistics
-      5, keyboard handling, as convenient as using mouse
-
-27, V0.35:   2007-12-02
-
-   Bugs Fixed:
-
-      1, Corrected change notification message for renaming
-      2, e2fsck i_size issue: Ext2SetInformation doesn't free
-         extra blocks when shrinking FileEndOfFileInformation
-      3, BSOD with symlink since it's treated as a file
-
-   Features Newly Implemented:
-
-      1, Symbolic link support on most operations but creating 
-      2, Property settings per volume, more flexible
-      3, Hiding files with specified prefix and suffix
-      4, Different implements on driver letter assignment
-      5, CDROM support to mount CD/DVD burned in EXT2 format
-      6, "Move and Replace (overwrite)" support
-      7, Install Ext2Mgr as a service
-
-26, V0.31A:  2007-01-06
-
-    Bugs/Problems Fixed:
-
-      1, Disable the partition type changing, which causes linux could not boot
-      2, Added the test-signature to AMD64 drivers for vista system
-
-25, V0.31:   2006-11-06
-
-   Bugs Fixed:
-
-      1, Wrong ERESOURCE referenced in Ext2DeleteFile
-      2, Stale path name referenced for directory notification
-      3, Codepage names inconsistent between Ext2Fsd and Ext2Mgr
-
-   Features Newly Implemented:
-
-      1, Vista supported 
-
-24, V0.30:   2006-10-21
-
-   Main Bugs Fixed:
-
-      1, Incorrect removable media support
-      2, Wrong file size, timestamps reporting
-      3, Some minor memory leaks 
-      4, Improper usage of ERESOURCE locking
-      5, Wrong handling of some special I/O
-      6, Incorrect codepage loading sequence
-      7, Mke2fs is much improved
-
-   Main Features Newly Supported:
-
-      1, Network sharing, Oplocks handling
-      2, Ext2 Volume Manager (codepage, attributes)
-
-23, V0.25:   2005-07-27
-
-    Bug Fixed:
-
-      1, File allocation blocks are not freed when being deleted
-      2, Other minor modifications on the program logics ...
-
-    Features Newly Supported:
-
-      1, Floppy support implemented. 
-      2, Win64 (X86 64) support.
-
-
-22, V0.24:   2005-03-28
-
-    Bug Fixed:
-
-      1, Codepage support errors fixed.
-      2, Ext2LookupFileName: should fail when it's not a real path.
-      3, Ext2FastIoQueryNetworkOpenInfo: Fcb not initialized.
-
-    Features Newly Supported:
-
-      1, Sparse file support. 
-      2, Setup and config tools by Jared Breland.
-
-
-21, V0.23:   2005-01-09
-
-    Bug Fixed:
-
-      1, Ext2ReadSync: Thread stack is paged out, which causes "Event" is invalid.
-      2, Ext2InitializeVcb: Ext2Global->McbList is referred before initializing.
-
-    Features Newly Supported:
-
-      1, Multi codepages supported
-        In registry, there's a new item named "CodePage", just change it to the
-        codepage name you want to use. The codepage name is the same to linux
-        system.
-
-        Here's the codepages list: 
-
-        big5    cp1251  cp1255  cp437   cp737   cp775   cp850   cp852   cp855
-        cp857   cp860   cp861   cp862   cp863   cp864   cp865   cp866   cp869
-        cp874   cp949   cp950   euc_jp  euc_kr  iso8859_1       iso8859_13 
-        iso8859_14  iso8859_15  iso8859_2   iso8859_3   iso8859_4   iso8859_5
-        iso8859_6   iso8859_7   iso8859_8   iso8859_9   koi8_r  koi8_ru koi8_u
-        sjis    tis_620 cp936   gb2312  utf8
-
-        If you don't specify it or make a wrong page type, system default OEM
-        codepage will be used.
-
-
-20, V0.22b:  2004-11-05
-
-    Bugs Fixed:
-      1, Deleting and copying files from/to a directory frequently corrupts
-         the directory. E2fsck will report "directory corrupted". This bug
-         is cuased by Ext2AddEntry.
-
-19, V0.22a:  2004-10-28
-
-    Bugs Fixed:
-      1, Fsck error reports: "inode is in use, but has dtime set." for
-         deleted directories. This bug caused by non-zero i_links_count
-         of deleted directory inode.
-      2, When many files (Normally > 255 files, reported by Zhoujingg)
-         are deleted, the dir entry may cross blocks, which will cause
-         ext2/ext3 driver could not correctly read the directory entries.
-
-18, V0.22:  2004-10-04
-
-    Bugs Fixed:
-      1, Mcb part overflows the stack
-      2, Delay-writing errors: cache lost
-      3, Bad file type for newly created files
-
-    Features Newly Supported:
-      1, Optimize the Mcb management part and the function of Ext2SaveGroup
-      2, Big files (> 4G) accessing
-
-17, V0.21:  2004-06-09
-
-    Bugs Fixed:
-      1, Ext2Flush does not complete the IRP for READ_ONLY mode.
-      2, Delayed close tries to refer completed Irps.
-      3, Directory content does NOT ends with zero-inode entry. Ext2ScanDir
-         and Ext2QueryDirectory do a wrong way to enum entries. Thanks to 
-         "Bomb" <bomb_hero@163.com>
-      4, Ext2MountVolume still returns STATUS_SUCCESS for non-ext2 volumes.
-      5, Ext2SetRenameInfo always treats "Rename" as "Move"
-
-    Features Newly Supported:
-      1, Various sector sizes support from 512 to 4096.
-      2, Compatible for windows nt 4.0.
-      3, Removable disk supported (CDROM is to be supported in next version.)
-      4, Volumes umounting works (Force dismount supported)...
-      5, Floppy partially support (NOT complete yet) ...
-      6, Add CheckingBitmap / Ext3ForceWriting parameter key in the registry
-      7, Quick format supported (directly access on mounted ext2 volumes.)
-
-16, V0.20:  2003-12-26
-      1, Merge Petr Borsodi's  patches for several problems.
-      2, Unicode/OEM characters support.?
-      3, Change notifications is supported.
-      4, Totally Optimize and upgrade.
-      5, ......
-
-15, V0.10A: 2003-01-14
-      1, FIXME: Deadlock caused by CcPurgeCacheSection for readonly volumes
-
-14, V0.10:  2003-01-03
-      1, Merge xjaguar's patch: Ext2NewInode and Ext2NewBlock fail on one
-         group ext2 system.
-      2, Merge Bo Branten's patch: Sync modifications of Romfs.
-      3, FIXME: Ext2Flush causes crash when shutting down. Thanks Petr Borsodi
-         for his clues.
-      4, FIXME: Crash when playing media files (mpg, wav ...)
-      5, ......
-
-13, V0.09A: 2002-08-03
-      1, Add mcb feature to keep cache coherence between volume and file
-         streams 
-      2, Skip "AdvacneOnly" when setting FileEndOfFileInformation.
-      3, Add file stream dirty flag in order to flush it when cleanup.
-      4, Some corrections of lock operations
-      5, Fix volume size reporting in Ext2QueryVolumeInformation
-
-12, V0.09: 2002-07-25
-      1, Fix some minor bugs
-      2, Redesign some internal architectures
-      3, Add writing support (Ext3 is not supported yet.)
-           1) File write.c: writing functions 
-           2) File flush.c: do flushing
-           3) File shutdown.c: prepare for system shutdown 
-           4) Many modifications in create.c/fileinfo.c/volinfo.c ...
-
-11, V0.08: 2002-05-28
-      1, Fix page-fault bsod when reading bad-size inodes
-      2, Fix a minor bug in Ext2GetBlock
-      3, Add binary-tree-mechanism to store the info of opened files
-
-10, V0.07A: 2002-05-17
-      1, Merge Boose's patch: make ext2fsd cooperating with his ntifs.h
-         (verion r36) and winxp ddk.
-      2, Fix wild-cases matching in Ext2QueryDirectory
-
- 9, V0.07: 2002-05-14
-      1, FIXME: only some minor bugs
-      2, Add access protection of some sharable members
-      3, Add booting start support
-      4, Change the driver's name to ext2fsd.sys
-
- 8, V0.06: 2002-03-12
-      1, FIXME: BSOD when playing wav/mpeg/avi with IE embedded media player.
-      2, Some optimizations in Ext2QueryDirectionary and Ext2ScanDir.
-
- 7, V0.05: 2002-03-01
-      1, FIXME: Ext2Create: Ext2ScanDir returns wrong fcb.
-      2, Support file executing now.
-
- 6, V0.04: 2002-02-20
-      1, Add caching support. 
-
- 5, V0.03: 2002-02
-      (It's an internal version, not released.)
-      1, Keep up with romfs: add byte-range lock and directory change
-         notification.
-
- 4, V0.02: 2002-02-07
-      1, Add large ext2 partition support. 
-
- 3, V0.01: 2002-01-26
-      1, Make it public at http://www.ext2fsd.com.
-
- 2, 2001-10
-      1, Non-public pre-release of ext2fsd was born.
-
- 1, 2001-08
-      1, I began the journey of file system driver developing with romfs
-
-
-======================
- Bugs
-======================
-
-(Nobody can expect that ext2fsd is bug-free.)
-Any bugs, please mail to me.
-
-
-======================
- How to install
-======================
-
-1, Build this project, and ext2fsd.sys will be created.
-2, Copy ext2fsd.sys to %system32%\drivers.
-3, Import the ext2fsd.reg into your system registry.
-4, After rebooting your machine, run "net start ext2fsd" at a dos shell.
-5, Use mount/unmount tools to mount or unmount a disk partition.
-6, You can unload ext2fsd from system with unload tool.
-
-After version 0.10, these is an easy way:
-
-1, Just run "Setup.bat" in "Setup" subdir for the first time. Then just
-   run "net start ext2fsd" in a dos shell to start the driver.
-
-      After v0.23, you need specify your system version:
-
-        setup 2k: to install ext2fsd for windows 200
-        setup xp: to install ext2fsd for windows xp
-
-
-2, Then you can mount the ext2 partitions without rebooting.
-
-
-======================
- How to uninstall
-======================
-
-1, Just run uninstall.bat in the Ext2Fsd.zip package.
-   .OR.
-2, Use the "Add/Remove Programs" in "Control Panel", click the item of
-   "linux ext2 file system driver" to remove the program.
-   .OR.
-3, Manually remove the ext2fsd projects files. 
-   a) Remove the registry: HKLM\...\Ext2Fsd & Uninstall ...
-   b) Remove Mount.exe/Mke2fs.exe from $(SystemRoot)\system32
-   c) Remove Ext2Fsd.sys from $(SystemRoot)\system32\drivers
-   d) Remove ext2fsd.inf from $(SystemRoot)\inf
-
-
-======================
- Writing support
-======================
-
-Two ways are optional to enable writing support.
-
-1, Change the value of "Parameters\WritingSupport" in ext2fsd.reg to 1, then
-   import the reg file into system registry.
-   Or modify the registry directly. Like this:
-
-   -------------------------------------------------------------------------
-   [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ext2Fsd\Parameters]
-   "WritingSupport"=dword:00000001
-   -------------------------------------------------------------------------
-
-   Notes: Reboot is need.
-
-   Or
-
-2, Change the definition of EXT2_READ_ONLY to 0, and recompile ext2fsd, then
-   overwrite the original one. (See line 27 in ext2fs.h)
-
-
-Please refer FAQ.txt for more information.
+======================
+ About Ext2Fsd
+======================
+
+Ext2Fsd project is an ext2/3/4 file system driver for Windows (2k/XP/7/8/10).
+
+It's a free software. Everyone can distribute or modify it under GNU GPLv2.
+
+======================
+ Author & Homepage
+======================
+
+Matt Wu <mattwu@163.com>
+http://www.ext2fsd.com
+
+
+======================
+ Credits 
+======================
+
+Thanks to Bo Branten<bosse@acc.umu.se> for his project romfs and his great
+contribution of the free version ntifs.h.
+
+Everyone can get to him at http://www.acc.umu.se/~bosse/.
+
+
+======================
+ Revision history
+======================
+
+51, V0.66    2016-04-13
+
+Modifications from V0.65:
+
+    1, FIXME: BSOD when mounting as readonly
+    2, FIXME: Ext2Srv service blocked by Antivirus
+
+50, V0.65    2016-04-10
+
+Modifications from V0.64:
+
+Features:
+    1, major performance improvements (small files meta-operatios)
+    2, memory pressure handling for buffer-head structures reclaim
+    3, back support for Windows 2000 (i386, 32bit)
+    4, no bothering user with notification message for Ext2Mgr
+    5, project improvement: Ext2Mgr to be built with WDK or VS2008
+
+49, V0.64    2016-04-04
+
+Modifications from V0.63:
+
+Features:
+    1, Drive letter assignment mechanism refined
+    2, Mount as specified user (uid/gid) supported
+
+Bugs fixed:
+    1, Symlink creation breaks metedata statistics for inodes
+    2, Unexpected drive letter removal for virtual devices
+    3, Resource lock rules refined to consolidate consistency
+    4, Kernel codes improved to make Ext3Fsd more secure
+
+48, V0.63:   2016-03-12
+
+Modifications from V0.62:
+
+Features:
+    1, Symlink (ReparsePoint) support implemented by ngkaho1234. See his
+       repository for more details: http://github.com/ngkaho1234/Ext3Fsd.git
+    2, Hard links support implemented
+    3, Win10 TH2 drive letter assignment supported
+    4, Case-insensitive-search supported (caused by dentry hash)
+    5, Peformance improvements for metadata operations
+
+Bugs fixed:
+    1, BSOD when trying to format or dismount EXT4 volumes
+    2, invalid extent content for newly created inodes
+    3, Possible data corruption (zero data) under high pressure (WDK building)
+    4, Splash screen of Ext2Mgr removed 
+
+47, V0.62:   2015-06-09
+
+Modifications from V0.61:
+
+    1, FIXME: STEAM game cache (data) validation failures
+              for direct-io mode, wrong reading length in bytes reported
+    2, FIXME: WDK sources compiling random failures
+
+46, V0.61:   2015-06-08
+
+Modifications from V0.60:
+
+    1, FIXME: Ext4 unwritten-extent supported to avoid possible data corruption
+              MSB of ee_len field of unwritten extent is used as only a flag. It
+              was mistakenly treated as extent length (block numbers) in V0.60
+    2, FIXME: Manually clear file to zero for indirect-block file that is newly
+              created but not yet written
+
+
+45, V0.60:   2015-06-01
+
+Modifications from V0.53:
+
+    1, Ext4 extent writing support (developed by ngkaho1234 @ gmail.com)
+       See his repository for more details:
+       http://github.com/ngkaho1234/Ext3Fsd.git
+    2, Size manipulation and i/o path revised for support of indirect and
+       extent-based mappings
+    3, 16T volume supported (tested and confirmed with 4T volume)
+       Version 0.53 and previous versions only support up to 2T volume
+       ticket: https://sourceforge.net/p/ext2fsd/bugs/134/
+    4, Deletion acceleration: truncation optimized for indirect-based files
+    5, Size-expanding disabled in IRP_MJ_CREATE for better performance.
+       Windows sometimes would truncate file size back to 0
+    6, Support Volume exclusive-open for e2fsprogs utils. Any attempts
+       will be denied while EXT4 volume is being checked (e2fsck).
+    7, FIXME:  Possible zero-content returned (requesting data from file tail)
+    8, FIXME:  File ByteOffset updated for FO_SYNCHRONOUS_IO open (async i/o)
+       ticket: https://sourceforge.net/p/ext2fsd/bugs/133/
+    9, FIXME:  don't do byte or range round up for paging i/o requests
+       ticket: https://sourceforge.net/p/ext2fsd/bugs/129/
+   10, FIXME:  occasional block bitmap difference issue, cased by checksum
+               caculation in uninit_bg group initializing
+
+44, V0.53:   2014-08-25
+
+Modifications from V0.52:
+
+    1, FIXME: BSOD with VHD/VHDX mounting on Win8
+    2, FIXME: Mke2fs failed to format mounted EXT2 volumes
+    3, Enable writing with global or volume ext3-force-writi
+    4, Support ext4 dir hash (UNSIGNED cases for legacy/half
+    5, Fixed several warnings reported by scan.coverity.com
+
+
+43, V0.52:   2014-05-10
+
+Modifications from V0.51:
+
+    1, Feature: Windows 8 supported
+    2, Feature: Force-writing supported
+    3, FIXME: data loss with TeraCopy when moving directories
+    4, FIXME: ATTO Disk Benchnmark fails with direct i/o tests
+    5, FIXME: files become invisible with empty hidden pattens
+    6, FIXME: possible hang with concurrent access attempts
+              upon the same file
+    7, FIXME: BSOD due to pagable code sections
+
+42, V0.51:   2011-07-10
+
+Modifications from V0.50:
+
+    1, FIXME: Data corruption issue, especially for multiple-thread
+       writing on XP system
+    2, FIXME: Set ValidDataLength only for FileEndOfFileInformation
+       w/ AdvanceOnly    
+    3, Support writing to ext4 volumes w/ flex_bg
+    4, Code cleanup and enhancement for global/volume property settings
+
+41, V0.50:   2011-02-01
+
+Modifications from V0.48:
+
+    1, Ext4 extent readonly support by Bo Branten. Writing is
+       possible but with no size-extending
+    2, Ext3 directory index (hash-tree) support
+    3, Fast fsck (uninit_bg) and group block checksum support
+    4, Ext4 64k block size support
+    5, Symlink/special inodes open/read/deletion support
+    6, Buffer head implemented over cache pages
+    7, Memory allocation optimization for flexible-size inodes
+    8, Improve file deletion: don't grab global lock when deleting
+    9, FIXME: return zero-content for sparse file gaps
+   10, FIXME: check available spaces before blocks allocation
+   11, FIXME: refresh stale root dir content after journal replay
+   12, FIXME: incompatible dentry management for 64k block size
+   13, FIXME: don't do journal replay for devices set as readonly
+   14, FIXME: Win7 cmd.exe always reports file sizes as zero
+   15, FIXME: Win7 memory throttling issue calling CcPinRead
+   16, FIXME: Ext3Fsd Build issues (SLIST/div64 for Win2k, browser files)
+   17, FIXME: Compiling test failure (fastio doesn't update i_size)
+   18, FIXME: Possible Mcb memory leak for symbolic links
+
+40, V0.48:   2009-07-26
+
+Modifications from V0.47:
+
+    1, Acronis TrueImage compatible issue solved:
+       Verified with Acronis True Image Home 2009. Also verified with
+       FreeOFTE 3.0, TrueCrypt 6.2a.
+    2, Driver code-signed for Vista and Server 2008
+    3, Code improvements for FastIo routines and drive letter & mount
+       points management
+
+39, V0.47:   2009-06-01
+
+Modifications from V0.46:
+
+    1, Bo Branten's 5+ patches merged, lots ifstest failures resolved
+    2, Mount point automatic assignment for USB key and other removable
+       disks or removable media devices
+
+38, V0.46:   2008-05-24
+
+Modifications from V0.46:
+
+    1, ext3 journal check and replay implemented. If the journal is
+       not empty ext2fsd will replay the journal and make the file
+       system consistent as an ext2 file system.
+    2, flexible-inode-size supported. recent Linux are using 256-byte
+       inode that fails 0.45 and before to show all the files.
+    3, FIXME: 2 minor issues that mislead EditPlus. EditPlus is always
+       trying to open any file with directory_only flag set to judge
+       whether the target is a directory or file, when the file isn't
+       a directory, the open request should be denied. But Ext2Fsd 0.45
+       and before doesn't. Another issue is that ext2 file time on disk
+       has different precision against windows (1 second vs 100 nano
+       second), which causes EditPlus thinks the file is being changed.
+    4, FIXME: a severe bug (likely happen on win2k system) which cause
+       dirty caches missed and slow down the whole system. 
+    5, many other minor changes: bulk block allocation/release, possible
+       inode allocation dead-loop when all inodes are used out, Ext2Mgr
+       win2k support, other performance improvements.
+
+37, V0.45:   2008-02-19
+
+Modifications from V0.44:
+
+    1, set hidden attribute for all files starting with "."
+    2, update cache window size when writing to file end
+    3, reaper resources allocated during file creation
+
+36, V0.44:   2008-02-09
+
+Modifications from V0.43:
+
+    1, Ext2Fsd: LastWriteTime/LastAccessTime update
+    2, Ext2Mgr: Show driver/app versions in About dialog
+
+35, V0.43:   2008-02-01
+
+Modifications from V0.42:
+
+    1, Ext2Fsd: hidden/system attribute handling
+    2, Ext2Mgr: Added manifest to cope with UAC
+
+34, V0.42:   2008-01-26
+
+Features implemented:
+    1, Mountpoint auto mount/removal supported for removable disks
+
+33, V0.41:   2008-01-25
+
+Modifications from V0.40:
+
+Bugs/Problems Fixed:
+
+    1,  Some files couldn't be shown in explorer with utf8 codepage
+    2,  System always pops "device is busy" when removing USB disks
+
+Features implemented:
+
+    1, Ext2Fsd: Updated codepage encodings to latest Linux kernel
+    2, Ext2Mgr: Added Chinese translation which is in high demand
+                Enhanced mountpoints management for removable devices
+
+32, V0.40:   2008-01-13
+
+Modifications from V0.39
+
+Bugs/Problems Fixed:
+
+    1,  Directory inode isn't freed after directory deletion
+    2,  Retrieval pointers implemented for extents mapping
+    3,  Correct the handling of STATUS_CANT_WAIT. Vista's Cache
+        Manager often fails us on PingRead when copying bunch of
+        files/directories from ext2 volumes, and thus it results
+        in zero-data-content in copied files
+    4,  Optimize space allocation to minimize fragments
+
+31, V0.39:   2008-01-09
+
+Modifications from V0.38
+
+  Bugs Fixed:
+
+    1, Disk space isn't released after deleting big files larger than
+       (BLOCK_SIZE * (12 + BLOCK_SIZE/4 + BLOCK_SIZE * BLOCK_SIZE / 16))
+       That's 4,299,210,752 in case BLOCK_SIZE is 4096.
+
+30, V0.38:   2008-01-04
+
+Modifications from V0.37
+
+  Bugs Fixed:
+
+     1, File block extents management improved to decrease CPU usage
+     2, Re-queue request when cache manager can't prepare pages in time
+     3, Possible deletion of it's hardlink entry when removing a file
+     4, Prohibit to create file with same names to dead symlinks
+     5, Wrong inode type in directory entry for symbol links
+     6, Possible memory leak when failed to overwrite file
+     7, Memory leak in Ext2FreeMcb, it's counted but not freed.
+     8, Possible loss of inode/dentry update: Ext2WriteVolume might
+        miss the dirty windows with SECTOR_SIZE aligned borders
+     9, SpinLock related routines shouldn't be resident in paged zone
+    10, Possible lost of files in directory listing
+
+29, V0.37:   2007-12-25
+
+  Bugs Fixed:
+
+      1, files >=4G couldn't be copy&paste to ext2 volume, caused by a hardcode
+         limit in Ext2CreateFile
+      2, failure of "No enough memory" when renaming files under directories
+         it likely happens when renaming files under subdirectory with Samba
+         or Linux kernel CIFS.
+      3, possible deadlock in renaming with simultaneous access on the same file
+      4, possible wrong entry (hardlinks) deletion instead of itself: it's
+         rare to happen but possible when renaming, moving or deleting files. 
+      5, entry management routines enhancement 
+      6, 64k-block support
+
+28, V0.36:   2007-12-22
+
+  Bugs Fixed:
+
+      1, BSOD caused by symlink pointing to itself or others
+      2, bug in new inode allocation algorithm 
+      3, "." and ".." are treated as separate inodes
+      4, remove unnecessary local variables to reduce stack
+         overflow chances especially for nested symlinks
+      5, overall optimizations on block allocation/release/mapping 
+      6, non-consistent Mcb reference issue (broken by symlinks)
+      7, memory leaks of BLOCK_DATA when expanding file
+      8, buffer overflow in Ext2Printf only for checked build
+      9, bug in handling exception of working cdroms ejection
+
+  Features Newly Implemented:
+
+      1, remove the execute bit ('x') for all newly created files 
+      2, enhance memory reaper mechanism of all Xcbs (Fcb/Mcb)
+      3, big block support (up to 32k) 
+      4, statistics of memory allocation / irp handling
+
+  Ext2 Volume Manager:
+
+      1, crash with RAW disk (non-partitioned)
+      2, wrong message box poped when setting service property
+      3, more partition types recognized
+      4, support memory/irp statistics
+      5, keyboard handling, as convenient as using mouse
+
+27, V0.35:   2007-12-02
+
+   Bugs Fixed:
+
+      1, Corrected change notification message for renaming
+      2, e2fsck i_size issue: Ext2SetInformation doesn't free
+         extra blocks when shrinking FileEndOfFileInformation
+      3, BSOD with symlink since it's treated as a file
+
+   Features Newly Implemented:
+
+      1, Symbolic link support on most operations but creating 
+      2, Property settings per volume, more flexible
+      3, Hiding files with specified prefix and suffix
+      4, Different implements on driver letter assignment
+      5, CDROM support to mount CD/DVD burned in EXT2 format
+      6, "Move and Replace (overwrite)" support
+      7, Install Ext2Mgr as a service
+
+26, V0.31A:  2007-01-06
+
+    Bugs/Problems Fixed:
+
+      1, Disable the partition type changing, which causes linux could not boot
+      2, Added the test-signature to AMD64 drivers for vista system
+
+25, V0.31:   2006-11-06
+
+   Bugs Fixed:
+
+      1, Wrong ERESOURCE referenced in Ext2DeleteFile
+      2, Stale path name referenced for directory notification
+      3, Codepage names inconsistent between Ext2Fsd and Ext2Mgr
+
+   Features Newly Implemented:
+
+      1, Vista supported 
+
+24, V0.30:   2006-10-21
+
+   Main Bugs Fixed:
+
+      1, Incorrect removable media support
+      2, Wrong file size, timestamps reporting
+      3, Some minor memory leaks 
+      4, Improper usage of ERESOURCE locking
+      5, Wrong handling of some special I/O
+      6, Incorrect codepage loading sequence
+      7, Mke2fs is much improved
+
+   Main Features Newly Supported:
+
+      1, Network sharing, Oplocks handling
+      2, Ext2 Volume Manager (codepage, attributes)
+
+23, V0.25:   2005-07-27
+
+    Bug Fixed:
+
+      1, File allocation blocks are not freed when being deleted
+      2, Other minor modifications on the program logics ...
+
+    Features Newly Supported:
+
+      1, Floppy support implemented. 
+      2, Win64 (X86 64) support.
+
+
+22, V0.24:   2005-03-28
+
+    Bug Fixed:
+
+      1, Codepage support errors fixed.
+      2, Ext2LookupFileName: should fail when it's not a real path.
+      3, Ext2FastIoQueryNetworkOpenInfo: Fcb not initialized.
+
+    Features Newly Supported:
+
+      1, Sparse file support. 
+      2, Setup and config tools by Jared Breland.
+
+
+21, V0.23:   2005-01-09
+
+    Bug Fixed:
+
+      1, Ext2ReadSync: Thread stack is paged out, which causes "Event" is invalid.
+      2, Ext2InitializeVcb: Ext2Global->McbList is referred before initializing.
+
+    Features Newly Supported:
+
+      1, Multi codepages supported
+        In registry, there's a new item named "CodePage", just change it to the
+        codepage name you want to use. The codepage name is the same to linux
+        system.
+
+        Here's the codepages list: 
+
+        big5    cp1251  cp1255  cp437   cp737   cp775   cp850   cp852   cp855
+        cp857   cp860   cp861   cp862   cp863   cp864   cp865   cp866   cp869
+        cp874   cp949   cp950   euc_jp  euc_kr  iso8859_1       iso8859_13 
+        iso8859_14  iso8859_15  iso8859_2   iso8859_3   iso8859_4   iso8859_5
+        iso8859_6   iso8859_7   iso8859_8   iso8859_9   koi8_r  koi8_ru koi8_u
+        sjis    tis_620 cp936   gb2312  utf8
+
+        If you don't specify it or make a wrong page type, system default OEM
+        codepage will be used.
+
+
+20, V0.22b:  2004-11-05
+
+    Bugs Fixed:
+      1, Deleting and copying files from/to a directory frequently corrupts
+         the directory. E2fsck will report "directory corrupted". This bug
+         is cuased by Ext2AddEntry.
+
+19, V0.22a:  2004-10-28
+
+    Bugs Fixed:
+      1, Fsck error reports: "inode is in use, but has dtime set." for
+         deleted directories. This bug caused by non-zero i_links_count
+         of deleted directory inode.
+      2, When many files (Normally > 255 files, reported by Zhoujingg)
+         are deleted, the dir entry may cross blocks, which will cause
+         ext2/ext3 driver could not correctly read the directory entries.
+
+18, V0.22:  2004-10-04
+
+    Bugs Fixed:
+      1, Mcb part overflows the stack
+      2, Delay-writing errors: cache lost
+      3, Bad file type for newly created files
+
+    Features Newly Supported:
+      1, Optimize the Mcb management part and the function of Ext2SaveGroup
+      2, Big files (> 4G) accessing
+
+17, V0.21:  2004-06-09
+
+    Bugs Fixed:
+      1, Ext2Flush does not complete the IRP for READ_ONLY mode.
+      2, Delayed close tries to refer completed Irps.
+      3, Directory content does NOT ends with zero-inode entry. Ext2ScanDir
+         and Ext2QueryDirectory do a wrong way to enum entries. Thanks to 
+         "Bomb" <bomb_hero@163.com>
+      4, Ext2MountVolume still returns STATUS_SUCCESS for non-ext2 volumes.
+      5, Ext2SetRenameInfo always treats "Rename" as "Move"
+
+    Features Newly Supported:
+      1, Various sector sizes support from 512 to 4096.
+      2, Compatible for windows nt 4.0.
+      3, Removable disk supported (CDROM is to be supported in next version.)
+      4, Volumes umounting works (Force dismount supported)...
+      5, Floppy partially support (NOT complete yet) ...
+      6, Add CheckingBitmap / Ext3ForceWriting parameter key in the registry
+      7, Quick format supported (directly access on mounted ext2 volumes.)
+
+16, V0.20:  2003-12-26
+      1, Merge Petr Borsodi's  patches for several problems.
+      2, Unicode/OEM characters support.?
+      3, Change notifications is supported.
+      4, Totally Optimize and upgrade.
+      5, ......
+
+15, V0.10A: 2003-01-14
+      1, FIXME: Deadlock caused by CcPurgeCacheSection for readonly volumes
+
+14, V0.10:  2003-01-03
+      1, Merge xjaguar's patch: Ext2NewInode and Ext2NewBlock fail on one
+         group ext2 system.
+      2, Merge Bo Branten's patch: Sync modifications of Romfs.
+      3, FIXME: Ext2Flush causes crash when shutting down. Thanks Petr Borsodi
+         for his clues.
+      4, FIXME: Crash when playing media files (mpg, wav ...)
+      5, ......
+
+13, V0.09A: 2002-08-03
+      1, Add mcb feature to keep cache coherence between volume and file
+         streams 
+      2, Skip "AdvacneOnly" when setting FileEndOfFileInformation.
+      3, Add file stream dirty flag in order to flush it when cleanup.
+      4, Some corrections of lock operations
+      5, Fix volume size reporting in Ext2QueryVolumeInformation
+
+12, V0.09: 2002-07-25
+      1, Fix some minor bugs
+      2, Redesign some internal architectures
+      3, Add writing support (Ext3 is not supported yet.)
+           1) File write.c: writing functions 
+           2) File flush.c: do flushing
+           3) File shutdown.c: prepare for system shutdown 
+           4) Many modifications in create.c/fileinfo.c/volinfo.c ...
+
+11, V0.08: 2002-05-28
+      1, Fix page-fault bsod when reading bad-size inodes
+      2, Fix a minor bug in Ext2GetBlock
+      3, Add binary-tree-mechanism to store the info of opened files
+
+10, V0.07A: 2002-05-17
+      1, Merge Boose's patch: make ext2fsd cooperating with his ntifs.h
+         (verion r36) and winxp ddk.
+      2, Fix wild-cases matching in Ext2QueryDirectory
+
+ 9, V0.07: 2002-05-14
+      1, FIXME: only some minor bugs
+      2, Add access protection of some sharable members
+      3, Add booting start support
+      4, Change the driver's name to ext2fsd.sys
+
+ 8, V0.06: 2002-03-12
+      1, FIXME: BSOD when playing wav/mpeg/avi with IE embedded media player.
+      2, Some optimizations in Ext2QueryDirectionary and Ext2ScanDir.
+
+ 7, V0.05: 2002-03-01
+      1, FIXME: Ext2Create: Ext2ScanDir returns wrong fcb.
+      2, Support file executing now.
+
+ 6, V0.04: 2002-02-20
+      1, Add caching support. 
+
+ 5, V0.03: 2002-02
+      (It's an internal version, not released.)
+      1, Keep up with romfs: add byte-range lock and directory change
+         notification.
+
+ 4, V0.02: 2002-02-07
+      1, Add large ext2 partition support. 
+
+ 3, V0.01: 2002-01-26
+      1, Make it public at http://www.ext2fsd.com.
+
+ 2, 2001-10
+      1, Non-public pre-release of ext2fsd was born.
+
+ 1, 2001-08
+      1, I began the journey of file system driver developing with romfs
+
+
+======================
+ Bugs
+======================
+
+(Nobody can expect that ext2fsd is bug-free.)
+Any bugs, please mail to me.
+
+
+======================
+ How to install
+======================
+
+1, Build this project, and ext2fsd.sys will be created.
+2, Copy ext2fsd.sys to %system32%\drivers.
+3, Import the ext2fsd.reg into your system registry.
+4, After rebooting your machine, run "net start ext2fsd" at a dos shell.
+5, Use mount/unmount tools to mount or unmount a disk partition.
+6, You can unload ext2fsd from system with unload tool.
+
+After version 0.10, these is an easy way:
+
+1, Just run "Setup.bat" in "Setup" subdir for the first time. Then just
+   run "net start ext2fsd" in a dos shell to start the driver.
+
+      After v0.23, you need specify your system version:
+
+        setup 2k: to install ext2fsd for windows 200
+        setup xp: to install ext2fsd for windows xp
+
+
+2, Then you can mount the ext2 partitions without rebooting.
+
+
+======================
+ How to uninstall
+======================
+
+1, Just run uninstall.bat in the Ext2Fsd.zip package.
+   .OR.
+2, Use the "Add/Remove Programs" in "Control Panel", click the item of
+   "linux ext2 file system driver" to remove the program.
+   .OR.
+3, Manually remove the ext2fsd projects files. 
+   a) Remove the registry: HKLM\...\Ext2Fsd & Uninstall ...
+   b) Remove Mount.exe/Mke2fs.exe from $(SystemRoot)\system32
+   c) Remove Ext2Fsd.sys from $(SystemRoot)\system32\drivers
+   d) Remove ext2fsd.inf from $(SystemRoot)\inf
+
+
+======================
+ Writing support
+======================
+
+Two ways are optional to enable writing support.
+
+1, Change the value of "Parameters\WritingSupport" in ext2fsd.reg to 1, then
+   import the reg file into system registry.
+   Or modify the registry directly. Like this:
+
+   -------------------------------------------------------------------------
+   [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Ext2Fsd\Parameters]
+   "WritingSupport"=dword:00000001
+   -------------------------------------------------------------------------
+
+   Notes: Reboot is need.
+
+   Or
+
+2, Change the definition of EXT2_READ_ONLY to 0, and recompile ext2fsd, then
+   overwrite the original one. (See line 27 in ext2fs.h)
+
+
+Please refer FAQ.txt for more information.
diff -uNr 0.63/Ext3Fsd/write.c 0.66/Ext3Fsd/write.c
--- 0.63/Ext3Fsd/write.c	2016-03-13 15:29:21.000000000 +0100
+++ 0.66/Ext3Fsd/write.c	2016-04-19 16:38:20.000000000 +0200
@@ -934,6 +934,11 @@
 
         } else {
 
+            if (!Ext2CheckFileAccess(Vcb, Fcb->Mcb, Ext2FileCanWrite)) {
+                Status = STATUS_ACCESS_DENIED;
+                __leave;
+            }
+
             if (IsDirectory(Fcb)) {
                 __leave;
             }
