diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\cleanup.c ext2fsd\src\Ext3Fsd\cleanup.c --- ext2fsd.bak\src\Ext3Fsd\cleanup.c Sun Jul 26 13:50:04 2009 +++ ext2fsd\src\Ext3Fsd\cleanup.c Fri Oct 09 20:43:34 2009 @@ -220,11 +220,13 @@ Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpCon // if (!FsRtlGetNextFileLock(&Fcb->FileLockAnchor, TRUE)) { if (Fcb->Header.IsFastIoPossible != FastIoIsPossible) { +#if EXT2_DEBUG DEBUG(DL_INF, (": %-16.16s %-31s %wZ\n", Ext2GetCurrentProcessName(), "FastIoIsPossible", &Fcb->Mcb->FullName )); +#endif Fcb->Header.IsFastIoPossible = FastIoIsPossible; } diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\cmcb.c ext2fsd\src\Ext3Fsd\cmcb.c --- ext2fsd.bak\src\Ext3Fsd\cmcb.c Fri Jun 05 15:07:28 2009 +++ ext2fsd\src\Ext3Fsd\cmcb.c Fri Oct 09 20:43:50 2009 @@ -50,8 +50,10 @@ Ext2AcquireForLazyWrite ( ASSERT((Fcb->Identifier.Type == EXT2FCB) && (Fcb->Identifier.Size == sizeof(EXT2_FCB))); +#if EXT2_DEBUG DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForLazyWrite: %s %s Fcb=%p\n", Ext2GetCurrentProcessName(), "ACQUIRE_FOR_LAZY_WRITE", Fcb)); +#endif if(!ExAcquireResourceSharedLite( &Fcb->PagingIoResource, Wait)) { @@ -83,8 +85,10 @@ Ext2ReleaseFromLazyWrite (IN PVOID Conte ASSERT((Fcb->Identifier.Type == EXT2FCB) && (Fcb->Identifier.Size == sizeof(EXT2_FCB))); +#if EXT2_DEBUG DEBUG(CMCB_DEBUG_LEVEL, ( "Ext2ReleaseFromLazyWrite: %s %s Fcb=%p\n", Ext2GetCurrentProcessName(), "RELEASE_FROM_LAZY_WRITE", Fcb)); +#endif ASSERT(Fcb->LazyWriterThread == PsGetCurrentThread()); Fcb->LazyWriterThread = NULL; diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\create.c ext2fsd\src\Ext3Fsd\create.c --- ext2fsd.bak\src\Ext3Fsd\create.c Sun Jul 26 08:01:18 2009 +++ ext2fsd\src\Ext3Fsd\create.c Mon May 03 15:22:09 2010 @@ -998,6 +998,7 @@ Dissecting: // We need to create a new one ? if ((CreateDisposition == FILE_CREATE ) || + (CreateDisposition == FILE_SUPERSEDE) || (CreateDisposition == FILE_OPEN_IF) || (CreateDisposition == FILE_OVERWRITE_IF)) { diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\dispatch.c ext2fsd\src\Ext3Fsd\dispatch.c --- ext2fsd.bak\src\Ext3Fsd\dispatch.c Sun Jan 13 16:06:02 2008 +++ ext2fsd\src\Ext3Fsd\dispatch.c Fri Jul 23 20:05:17 2010 @@ -134,7 +134,8 @@ Ext2LockIrp ( (IrpContext->MinorFunction == IRP_MN_USER_FS_REQUEST) ) { PEXTENDED_IO_STACK_LOCATION EIrpSp = (PEXTENDED_IO_STACK_LOCATION)IrpSp; if ( (EIrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_GET_VOLUME_BITMAP) || - (EIrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_GET_RETRIEVAL_POINTERS) ) { + (EIrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_GET_RETRIEVAL_POINTERS) || + (EIrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_GET_RETRIEVAL_POINTER_BASE) ) { ULONG Length = EIrpSp->Parameters.FileSystemControl.OutputBufferLength; Ext2LockUserBuffer(Irp, Length, IoWriteAccess); } diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\ext3\generic.c ext2fsd\src\Ext3Fsd\ext3\generic.c --- ext2fsd.bak\src\Ext3Fsd\ext3\generic.c Fri May 23 23:08:52 2008 +++ ext2fsd\src\Ext3Fsd\ext3\generic.c Fri Jul 30 10:55:18 2010 @@ -10,6 +10,7 @@ /* INCLUDES *****************************************************************/ #include "ext2fs.h" +#include "linux\ext4_ext.h" /* GLOBALS ***************************************************************/ @@ -40,6 +41,8 @@ Ext2IsBlockEmpty(PULONG BlockArray, ULON #pragma alloc_text(PAGE, Ext2GetBlock) #pragma alloc_text(PAGE, Ext2BlockMap) +#pragma alloc_text(PAGE, Ext2ExtentMap) +#pragma alloc_text(PAGE, Ext2ExtentSearch) #pragma alloc_text(PAGE, Ext2UpdateVcbStat) #pragma alloc_text(PAGE, Ext2NewBlock) @@ -746,6 +749,134 @@ Ext2BlockMap( errorout: return Status; +} + +NTSTATUS +Ext2ExtentMap( + IN PEXT2_IRP_CONTEXT IrpContext, + IN PEXT2_VCB Vcb, + IN PEXT2_MCB Mcb, + IN ULONG Index, + IN BOOLEAN Alloc, + OUT PULONG Block, + OUT PULONG Number + ) +{ + EXT4_EXTENT_HEADER *eh; + + eh = get_ext4_header(Mcb->Inode); + + return Ext2ExtentSearch( + IrpContext, + Vcb, + Mcb, + Index, + Alloc, + eh, + FALSE, + NULL, + Block, + Number + ); +} + +NTSTATUS +Ext2ExtentSearch( + IN PEXT2_IRP_CONTEXT IrpContext, + IN PEXT2_VCB Vcb, + IN PEXT2_MCB Mcb, + IN ULONG Index, + IN BOOLEAN Alloc, + IN PVOID ExtentHeader, + IN BOOLEAN UnpinBcb, + IN PBCB BcbToUnpin, + OUT PULONG Block, + OUT PULONG Number + ) +{ + EXT4_EXTENT_HEADER *eh; + EXT4_EXTENT_IDX *ei; + EXT4_EXTENT *ex; + LARGE_INTEGER offset; + PBCB bcb; + PVOID ib; + int i; + NTSTATUS status; + + *Block = 0; + *Number = 0; + + eh = (EXT4_EXTENT_HEADER *) ExtentHeader; + + if (eh != NULL && eh->eh_magic == EXT4_EXT_MAGIC) { + DEBUG(DL_INF, ("eh_magic=%x eh_entries=%u eh_max=%u eh_depth=%u eh_generation=%u\n", (ULONG)eh->eh_magic, (ULONG)eh->eh_entries, (ULONG)eh->eh_max, (ULONG)eh->eh_depth, eh->eh_generation )); + if (eh->eh_depth == 0) { + ex = EXT_FIRST_EXTENT(eh); + for (i = 0; i < eh->eh_entries; i++, ex++) { + DEBUG(DL_INF, ("ee_block=%u ee_len=%u ee_start_hi=%u ee_start_lo=%u ext_to_block(extent)=%u\n", ex->ee_block, (ULONG)ex->ee_len, (ULONG)ex->ee_start_hi, ex->ee_start_lo, ext_to_block(ex) )); + if (Index >= ex->ee_block && Index < ex->ee_block + ex->ee_len) { + *Block = (ULONG) (ext_to_block(ex) + (Index - ex->ee_block)); + *Number = ex->ee_block + ex->ee_len - Index; + DEBUG(DL_INF, ("Index=%u Block=%u Number=%u\n", Index, *Block, *Number )); + if (UnpinBcb) { + CcUnpinData(BcbToUnpin); + } + return STATUS_SUCCESS; + } + } + DEBUG(DL_ERR, ("Ext2ExtentSearch: search for extent entry failed on file or directory %wZ\n", &Mcb->FullName )); + if (Alloc) { + DEBUG(DL_ERR, ("possible because extending a file or directory that is stored using ext4 exents is not supported yet\n" )); + } + DEBUG(DL_ERR, ("eh_magic=%x eh_entries=%u eh_max=%u eh_depth=%u eh_generation=%u lbn=%u\n", (ULONG)eh->eh_magic, (ULONG)eh->eh_entries, (ULONG)eh->eh_max, (ULONG)eh->eh_depth, eh->eh_generation, Index )); + DEBUG(DL_ERR, ("ee_block=%u ee_len=%u ee_start_hi=%u ee_start_lo=%u ext_to_block(extent)=%u\n", ex->ee_block, (ULONG)ex->ee_len, (ULONG)ex->ee_start_hi, ex->ee_start_lo, ext_to_block(ex) )); + } else { + ei = EXT_FIRST_INDEX(eh); + DEBUG(DL_INF, ("Index=%u ei_block=%u eh_entries=%u\n", Index, ei->ei_block, eh->eh_entries )); + for (i = 0; i < eh->eh_entries; i++, ei++) { + if (i == eh->eh_entries - 1 || Index < (ei+1)->ei_block) { + DEBUG(DL_INF, ("idx_to_block(index)=%u\n", idx_to_block(ei) )); + offset.QuadPart = idx_to_block(ei) * Vcb->BlockSize; + status = STATUS_SUCCESS; + __try { + if ( !CcPinRead ( + Vcb->Volume, + &offset, + Vcb->BlockSize, + Ext2CanIWait(), + &bcb, + &ib )) { + status = STATUS_CANT_WAIT; + } + } __except (EXCEPTION_EXECUTE_HANDLER) { + status = GetExceptionCode(); + } + if (!NT_SUCCESS(status)) { + DEBUG(DL_ERR, ("Ext2ExtentSearch: CcPinRead failed with status %x\n", status )); + return status; + } + return Ext2ExtentSearch( + IrpContext, + Vcb, + Mcb, + Index, + Alloc, + ib, + TRUE, + bcb, + Block, + Number + ); + } + } + } + } + + if (UnpinBcb) { + CcUnpinData(BcbToUnpin); + } + + return STATUS_DISK_CORRUPT_ERROR; } VOID diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\ext3\Sources ext2fsd\src\Ext3Fsd\ext3\Sources --- ext2fsd.bak\src\Ext3Fsd\ext3\Sources Thu May 22 08:38:14 2008 +++ ext2fsd\src\Ext3Fsd\ext3\Sources Thu Jul 31 16:02:07 2008 @@ -12,7 +12,7 @@ TARGETTYPE=LIBRARY TARGETPATH=..\$(DDK_TARGET_OS)\$(DDKBUILDENV)\ # Creates a file used by Visual Studio to navigate the source code. -BROWSER_INFO=TRUE +#BROWSER_INFO=TRUE RCNOFONTMAP=TRUE C_DEFINES = $(C_DEFINES) /D__KERNEL__ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\fsctl.c ext2fsd\src\Ext3Fsd\fsctl.c --- ext2fsd.bak\src\Ext3Fsd\fsctl.c Sun Jul 26 14:28:14 2009 +++ ext2fsd\src\Ext3Fsd\fsctl.c Fri Jul 23 23:29:28 2010 @@ -27,6 +27,7 @@ extern PEXT2_GLOBAL Ext2Global; #pragma alloc_text(PAGE, Ext2QueryExtentMappings) #pragma alloc_text(PAGE, Ext2QueryRetrievalPointers) #pragma alloc_text(PAGE, Ext2GetRetrievalPointers) +#pragma alloc_text(PAGE, Ext2GetRetrievalPointerBase) #pragma alloc_text(PAGE, Ext2UserFsRequest) #pragma alloc_text(PAGE, Ext2IsMediaWriteProtected) #pragma alloc_text(PAGE, Ext2MountVolume) @@ -1008,8 +1009,10 @@ Ext2GetRetrievalPointers ( /* probe user buffer */ __try { - ProbeForRead (SVIB, InputSize, sizeof(UCHAR)); - ProbeForWrite(RPSB, OutputSize, sizeof(UCHAR)); + if (Irp->RequestorMode != KernelMode) { + ProbeForRead (SVIB, InputSize, sizeof(UCHAR)); + ProbeForWrite(RPSB, OutputSize, sizeof(UCHAR)); + } } __except(EXCEPTION_EXECUTE_HANDLER) { @@ -1149,6 +1152,140 @@ exit_to_get_rps: NTSTATUS +Ext2GetRetrievalPointerBase ( + IN PEXT2_IRP_CONTEXT IrpContext + ) +{ + PIRP Irp = NULL; + PIO_STACK_LOCATION IrpSp; + PEXTENDED_IO_STACK_LOCATION EIrpSp; + + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + + PEXT2_VCB Vcb = NULL; + PEXT2_FCB Fcb = NULL; + PEXT2_CCB Ccb = NULL; + + PLARGE_INTEGER FileAreaOffset; + + ULONG OutputSize; + + NTSTATUS Status = STATUS_SUCCESS; + + BOOLEAN FcbResourceAcquired = FALSE; + + __try { + + ASSERT(IrpContext); + Irp = IrpContext->Irp; + ASSERT(Irp); + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + EIrpSp = (PEXTENDED_IO_STACK_LOCATION)IrpSp; + ASSERT(IrpSp); + + OutputSize = EIrpSp->Parameters.FileSystemControl.OutputBufferLength; + + ASSERT((IrpContext->Identifier.Type == EXT2ICX) && + (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); + + DeviceObject = IrpContext->DeviceObject; + + /* This request is not allowed on the main device object */ + if (IsExt2FsDevice(DeviceObject)) { + Status = STATUS_INVALID_DEVICE_REQUEST; + __leave; + } + + Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension; + ASSERT(Vcb != NULL); + ASSERT((Vcb->Identifier.Type == EXT2VCB) && + (Vcb->Identifier.Size == sizeof(EXT2_VCB))); + ASSERT(IsMounted(Vcb)); + + FileObject = IrpContext->FileObject; + Fcb = (PEXT2_FCB) FileObject->FsContext; + + /* check Fcb is valid or not */ + if (Fcb == NULL || Fcb->Identifier.Type == EXT2VCB) { + Status = STATUS_INVALID_PARAMETER; + __leave; + } + + ASSERT((Fcb->Identifier.Type == EXT2FCB) && + (Fcb->Identifier.Size == sizeof(EXT2_FCB))); + + if (IsFlagOn(Fcb->Flags, FCB_FILE_DELETED)) { + Status = STATUS_FILE_DELETED; + __leave; + } + + Ccb = (PEXT2_CCB) FileObject->FsContext2; + if (Ccb == NULL) { + Status = STATUS_INVALID_PARAMETER; + __leave; + } + + ASSERT((Ccb->Identifier.Type == EXT2CCB) && + (Ccb->Identifier.Size == sizeof(EXT2_CCB))); + + if (OutputSize < sizeof(LARGE_INTEGER)) { + Status = STATUS_BUFFER_TOO_SMALL; + __leave; + } + + if (!ExAcquireResourceExclusiveLite ( + &Fcb->MainResource, Ext2CanIWait())) { + Status = STATUS_PENDING; + __leave; + } + FcbResourceAcquired = TRUE; + + FileAreaOffset = (PLARGE_INTEGER) Ext2GetUserBuffer(Irp); + + /* probe user buffer */ + + __try { + if (Irp->RequestorMode != KernelMode) { + ProbeForWrite(FileAreaOffset, OutputSize, sizeof(UCHAR)); + } + + } __except(EXCEPTION_EXECUTE_HANDLER) { + + Status = STATUS_INVALID_USER_BUFFER; + } + + if (!NT_SUCCESS(Status)) { + __leave; + } + + DEBUG(DL_DBG, ("Ext2GetRetrievalPointerBase: FileAreaOffset is 0.\n")); + + FileAreaOffset->QuadPart = 0; // sector offset to the first allocatable unit on the filesystem + + Irp->IoStatus.Information = sizeof(LARGE_INTEGER); + + } __finally { + + if (FcbResourceAcquired) { + ExReleaseResourceLite(&Fcb->MainResource); + } + + if (!AbnormalTermination()) { + if (Status == STATUS_PENDING || Status == STATUS_CANT_WAIT) { + Status = Ext2QueueRequest(IrpContext); + } else { + Ext2CompleteIrpContext(IrpContext, Status); + } + } + } + + return Status; +} + + +NTSTATUS Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext) { PIRP Irp; @@ -1222,6 +1359,10 @@ Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT case FSCTL_GET_RETRIEVAL_POINTERS: Status = Ext2GetRetrievalPointers(IrpContext); + break; + + case FSCTL_GET_RETRIEVAL_POINTER_BASE: + Status = Ext2GetRetrievalPointerBase(IrpContext); break; default: diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\include\ext2fs.h ext2fsd\src\Ext3Fsd\include\ext2fs.h --- ext2fsd.bak\src\Ext3Fsd\include\ext2fs.h Sun Jul 26 14:35:50 2009 +++ ext2fsd\src\Ext3Fsd\include\ext2fs.h Fri Jul 30 10:41:39 2010 @@ -24,9 +24,9 @@ #if EXT2_DEBUG #if _X86_ - #define DbgBreak() __asm int 3 + #define DbgBreak() //__asm int 3 #else - #define DbgBreak() KdBreakPoint() + #define DbgBreak() //KdBreakPoint() #endif #else #define DbgBreak() @@ -34,8 +34,12 @@ /* STRUCTS & CONSTS******************************************************/ -#define EXT2FSD_VERSION "0.48" +#define EXT2FSD_VERSION "0.48-bb7" +// Include this so we don't need the latest WDK to build the driver. +#ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE +#define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE +#endif // // Ext2Fsd build options @@ -1614,6 +1618,31 @@ Ext2BlockMap( OUT PULONG Number ); +NTSTATUS +Ext2ExtentMap( + IN PEXT2_IRP_CONTEXT IrpContext, + IN PEXT2_VCB Vcb, + IN PEXT2_MCB Mcb, + IN ULONG Index, + IN BOOLEAN Alloc, + OUT PULONG Block, + OUT PULONG Number + ); + +NTSTATUS +Ext2ExtentSearch( + IN PEXT2_IRP_CONTEXT IrpContext, + IN PEXT2_VCB Vcb, + IN PEXT2_MCB Mcb, + IN ULONG Index, + IN BOOLEAN Alloc, + IN PVOID ExtentHeader, + IN BOOLEAN UnpinBcb, + IN PBCB BcbToUnpin, + OUT PULONG Block, + OUT PULONG Number + ); + VOID Ext2UpdateVcbStat( IN PEXT2_IRP_CONTEXT IrpContext, @@ -2001,6 +2030,9 @@ Ext2QueryRetrievalPointers(IN PEXT2_IRP_ NTSTATUS Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext); + +NTSTATUS +Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext); NTSTATUS Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext); diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\include\linux\Ext2_fs.h ext2fsd\src\Ext3Fsd\include\linux\Ext2_fs.h --- ext2fsd.bak\src\Ext3Fsd\include\linux\Ext2_fs.h Wed May 21 11:40:00 2008 +++ ext2fsd\src\Ext3Fsd\include\linux\Ext2_fs.h Sun Jul 25 18:35:24 2010 @@ -198,6 +198,13 @@ struct ext2_group_desc #define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ /* End compression flags --- maybe not all used */ #define EXT2_BTREE_FL 0x00001000 /* btree format dir */ +#define EXT2_IMAGIC_FL 0x00002000 /* AFS directory */ +#define EXT2_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ +#define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */ +#define EXT2_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ +#define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ +#define EXT2_HUGE_FILE_FL 0x00040000 /* Set to each huge file */ +#define EXT2_EXTENTS_FL 0x00080000 /* Inode uses extents */ #define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ #define EXT2_FL_USER_VISIBLE 0x00001FFF /* User visible flags */ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\include\linux\ext4_ext.h ext2fsd\src\Ext3Fsd\include\linux\ext4_ext.h --- ext2fsd.bak\src\Ext3Fsd\include\linux\ext4_ext.h Thu Jan 01 01:00:00 1970 +++ ext2fsd\src\Ext3Fsd\include\linux\ext4_ext.h Mon Jul 26 19:54:23 2010 @@ -0,0 +1,76 @@ +#ifndef _LINUX_EXT4_EXT +#define _LINUX_EXT4_EXT + +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +/* + * This is the extent on-disk structure. + * It's used at the bottom of the tree. + */ +typedef struct ext4_extent { + uint32_t ee_block; /* first logical block extent covers */ + uint16_t ee_len; /* number of blocks covered by extent */ + uint16_t ee_start_hi; /* high 16 bits of physical block */ + uint32_t ee_start_lo; /* low 32 bits of physical block */ +} __attribute__ ((__packed__)) EXT4_EXTENT; + +/* + * This is index on-disk structure. + * It's used at all the levels except the bottom. + */ +typedef struct ext4_extent_idx { + uint32_t ei_block; /* index covers logical blocks from 'block' */ + uint32_t ei_leaf_lo; /* pointer to the physical block of the next * + * level. leaf or next index could be there */ + uint16_t ei_leaf_hi; /* high 16 bits of physical block */ + uint16_t ei_unused; +}__attribute__ ((__packed__)) EXT4_EXTENT_IDX; + +/* + * Each block (leaves and indexes), even inode-stored has header. + */ +typedef struct ext4_extent_header { + uint16_t eh_magic; /* probably will support different formats */ + uint16_t eh_entries; /* number of valid entries */ + uint16_t eh_max; /* capacity of store in entries */ + uint16_t eh_depth; /* has tree real underlying blocks? */ + uint32_t eh_generation; /* generation of the tree */ +}__attribute__ ((__packed__)) EXT4_EXTENT_HEADER; + + +#define EXT4_EXT_MAGIC 0xf30a +#define get_ext4_header(i) ((struct ext4_extent_header *) (i)->i_block) + +#define EXT_FIRST_EXTENT(__hdr__) \ +((struct ext4_extent *) (((char *) (__hdr__)) + \ + sizeof(struct ext4_extent_header))) + +#define EXT_FIRST_INDEX(__hdr__) \ + ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \ + sizeof(struct ext4_extent_header))) + +#define INODE_HAS_EXTENT(i) ((i)->i_flags & EXT2_EXTENTS_FL) + +static inline uint64_t ext_to_block(EXT4_EXTENT *extent) +{ + uint64_t block; + + block = (uint64_t)extent->ee_start_lo; + block |= ((uint64_t) extent->ee_start_hi << 31) << 1; + + return block; +} + +static inline uint64_t idx_to_block(EXT4_EXTENT_IDX *idx) +{ + uint64_t block; + + block = (uint64_t)idx->ei_leaf_lo; + block |= ((uint64_t) idx->ei_leaf_hi << 31) << 1; + + return block; +} + +#endif /* _LINUX_EXT4_EXT */ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\jbd\Sources ext2fsd\src\Ext3Fsd\jbd\Sources --- ext2fsd.bak\src\Ext3Fsd\jbd\Sources Tue Mar 04 16:29:16 2008 +++ ext2fsd\src\Ext3Fsd\jbd\Sources Thu Jul 31 16:02:12 2008 @@ -12,7 +12,7 @@ TARGETTYPE=LIBRARY TARGETPATH=..\$(DDK_TARGET_OS)\$(DDKBUILDENV)\ # Creates a file used by Visual Studio to navigate the source code. -BROWSER_INFO=TRUE +#BROWSER_INFO=TRUE RCNOFONTMAP=TRUE C_DEFINES = $(C_DEFINES) /D__KERNEL__ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\memory.c ext2fsd\src\Ext3Fsd\memory.c --- ext2fsd.bak\src\Ext3Fsd\memory.c Sun Jul 26 14:35:34 2009 +++ ext2fsd\src\Ext3Fsd\memory.c Wed Sep 22 23:45:07 2010 @@ -970,7 +970,8 @@ Ext2InitializeZone( Block = Mapped = 0; /* mapping file offset to ext2 block */ - Status = Ext2BlockMap( + if (Mcb->Inode->i_flags & EXT2_EXTENTS_FL) { + Status = Ext2ExtentMap( IrpContext, Vcb, Mcb, @@ -979,6 +980,17 @@ Ext2InitializeZone( &Block, &Mapped ); + } else { + Status = Ext2BlockMap( + IrpContext, + Vcb, + Mcb, + Start, + FALSE, + &Block, + &Mapped + ); + } if (!NT_SUCCESS(Status)) { goto errorout; @@ -1084,7 +1096,8 @@ Ext2BuildExtents( /* try to BlockMap in case failed to access Extents cache */ if (!IsZoneInited(Mcb) || (bAlloc && Block == 0)) { - Status = Ext2BlockMap( + if (Mcb->Inode->i_flags & EXT2_EXTENTS_FL) { + Status = Ext2ExtentMap( IrpContext, Vcb, Mcb, @@ -1093,6 +1106,17 @@ Ext2BuildExtents( &Block, &Mapped ); + } else { + Status = Ext2BlockMap( + IrpContext, + Vcb, + Mcb, + Start, + bAlloc, + &Block, + &Mapped + ); + } if (!NT_SUCCESS(Status)) { goto errorout; @@ -2343,6 +2367,11 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IsFlagOn(sb->s_feature_incompat, EXT3_FEATURE_INCOMPAT_META_BG)) { SetLongFlag(Vcb->Flags, VCB_READ_ONLY); } + } + + /* mount ext4 read-only to be safe */ + if (IsFlagOn(sb->s_feature_ro_compat, 0x0010)) { + SetLongFlag(Vcb->Flags, VCB_READ_ONLY); } /* Now allocating the mcb for root ... */ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\nls\Sources ext2fsd\src\Ext3Fsd\nls\Sources --- ext2fsd.bak\src\Ext3Fsd\nls\Sources Mon Mar 10 17:33:10 2008 +++ ext2fsd\src\Ext3Fsd\nls\Sources Thu Jul 31 16:02:18 2008 @@ -12,7 +12,7 @@ TARGETTYPE=LIBRARY TARGETPATH=..\$(DDK_TARGET_OS)\$(DDKBUILDENV)\ # Creates a file used by Visual Studio to navigate the source code. -BROWSER_INFO=TRUE +#BROWSER_INFO=TRUE RCNOFONTMAP=TRUE C_DEFINES = $(C_DEFINES) /D__KERNEL__ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\read.c ext2fsd\src\Ext3Fsd\read.c --- ext2fsd.bak\src\Ext3Fsd\read.c Tue May 26 14:04:20 2009 +++ ext2fsd\src\Ext3Fsd\read.c Fri Oct 30 15:10:21 2009 @@ -250,10 +250,6 @@ Ext2ReadVolume (IN PEXT2_IRP_CONTEXT Irp Length, FALSE ); - if (NT_SUCCESS(Status)) { - Irp->IoStatus.Information = Length; - } - Irp = IrpContext->Irp; if (!Irp) { __leave; diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\sys\Sources ext2fsd\src\Ext3Fsd\sys\Sources --- ext2fsd.bak\src\Ext3Fsd\sys\Sources Sat Aug 02 17:01:52 2008 +++ ext2fsd\src\Ext3Fsd\sys\Sources Fri Jul 23 10:51:34 2010 @@ -11,7 +11,7 @@ TARGETPATH=..\$(DDK_TARGET_OS)\$(DDKBUIL DRIVERTYPE=FS # Creates a file used by Visual Studio to navigate the source code. -BROWSER_INFO=TRUE +#BROWSER_INFO=TRUE RCNOFONTMAP=TRUE C_DEFINES = $(C_DEFINES) /D__KERNEL__ diff -uprN -X nodiff.txt ext2fsd.bak\src\Ext3Fsd\write.c ext2fsd\src\Ext3Fsd\write.c --- ext2fsd.bak\src\Ext3Fsd\write.c Tue May 26 14:04:42 2009 +++ ext2fsd\src\Ext3Fsd\write.c Fri Oct 30 15:11:21 2009 @@ -579,10 +579,6 @@ Ext2WriteVolume (IN PEXT2_IRP_CONTEXT Ir Length, FALSE ); - if (NT_SUCCESS(Status)) { - Irp->IoStatus.Information = Length; - } - Irp = IrpContext->Irp; if (!Irp) { __leave;