diff --git a/Ext4Fsd/create.c b/Ext4Fsd/create.c index 02a2718..902bdc6 100644 --- a/Ext4Fsd/create.c +++ b/Ext4Fsd/create.c @@ -484,10 +484,13 @@ Ext2LookupFile ( } } - Mcb->CreationTime = Ext2GetInodeTime(Mcb->Inode.i_ctime, Mcb->Inode.i_ctime_extra); Mcb->LastAccessTime = Ext2GetInodeTime(Mcb->Inode.i_atime, Mcb->Inode.i_atime_extra); Mcb->LastWriteTime = Ext2GetInodeTime(Mcb->Inode.i_mtime, Mcb->Inode.i_mtime_extra); - Mcb->ChangeTime = Ext2GetInodeTime(Mcb->Inode.i_mtime, Mcb->Inode.i_mtime_extra); + Mcb->ChangeTime = Ext2GetInodeTime(Mcb->Inode.i_ctime, Mcb->Inode.i_ctime_extra); + if (Mcb->Inode.i_crtime) + Mcb->CreationTime = Ext2GetInodeTime(Mcb->Inode.i_crtime, Mcb->Inode.i_crtime_extra); + else + Mcb->CreationTime = Ext2GetInodeTime(Mcb->Inode.i_ctime, Mcb->Inode.i_ctime_extra); /* process symlink */ if (S_ISLNK(Mcb->Inode.i_mode) && !bNotFollow) { diff --git a/Ext4Fsd/dirctl.c b/Ext4Fsd/dirctl.c index 9523fba..0150e57 100644 --- a/Ext4Fsd/dirctl.c +++ b/Ext4Fsd/dirctl.c @@ -250,10 +250,13 @@ Ext2ProcessEntry( } else { - FDI->CreationTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); FDI->LastAccessTime = Ext2GetInodeTime(Inode.i_atime, Inode.i_atime_extra); FDI->LastWriteTime = Ext2GetInodeTime(Inode.i_mtime, Inode.i_mtime_extra); - FDI->ChangeTime = Ext2GetInodeTime(Inode.i_mtime, Inode.i_mtime_extra); + FDI->ChangeTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); + if (Inode.i_crtime) + FDI->CreationTime = Ext2GetInodeTime(Inode.i_crtime, Inode.i_crtime_extra); + else + FDI->CreationTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); } FDI->FileAttributes = FileAttributes; @@ -306,10 +309,13 @@ Ext2ProcessEntry( } else { - FBI->CreationTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); FBI->LastAccessTime = Ext2GetInodeTime(Inode.i_atime, Inode.i_atime_extra); FBI->LastWriteTime = Ext2GetInodeTime(Inode.i_mtime, Inode.i_mtime_extra); - FBI->ChangeTime = Ext2GetInodeTime(Inode.i_mtime, Inode.i_mtime_extra); + FBI->ChangeTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); + if (Inode.i_crtime) + FBI->CreationTime = Ext2GetInodeTime(Inode.i_crtime, Inode.i_crtime_extra); + else + FBI->CreationTime = Ext2GetInodeTime(Inode.i_ctime, Inode.i_ctime_extra); } FBI->FileAttributes = FileAttributes; diff --git a/Ext4Fsd/ext3/generic.c b/Ext4Fsd/ext3/generic.c index ddb8a35..5056c6d 100644 --- a/Ext4Fsd/ext3/generic.c +++ b/Ext4Fsd/ext3/generic.c @@ -113,10 +113,13 @@ Ext2RefreshSuper ( return FALSE; /* initializeroot node */ - Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); Vcb->McbTree->LastAccessTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_atime, Vcb->McbTree->Inode.i_atime_extra); Vcb->McbTree->LastWriteTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_mtime, Vcb->McbTree->Inode.i_mtime_extra); - Vcb->McbTree->ChangeTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_mtime, Vcb->McbTree->Inode.i_mtime_extra); + Vcb->McbTree->ChangeTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); + if (Vcb->McbTree->Inode.i_crtime) + Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_crtime, Vcb->McbTree->Inode.i_crtime_extra); + else + Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); } return TRUE; diff --git a/Ext4Fsd/fileinfo.c b/Ext4Fsd/fileinfo.c index 68f8f92..16502d7 100644 --- a/Ext4Fsd/fileinfo.c +++ b/Ext4Fsd/fileinfo.c @@ -657,8 +657,8 @@ Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext) struct inode *Inode = &Mcb->Inode; if (FBI->CreationTime.QuadPart != 0 && FBI->CreationTime.QuadPart != -1) { - Ext2SetInodeTime(&FBI->CreationTime, &Inode->i_ctime, &Inode->i_ctime_extra); - Mcb->CreationTime = Ext2GetInodeTime(Inode->i_ctime, Inode->i_ctime_extra); + Ext2SetInodeTime(&FBI->CreationTime, &Inode->i_crtime, &Inode->i_crtime_extra); + Mcb->CreationTime = Ext2GetInodeTime(Inode->i_crtime, Inode->i_crtime_extra); NotifyFilter |= FILE_NOTIFY_CHANGE_CREATION; } @@ -676,7 +676,9 @@ Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext) } if (FBI->ChangeTime.QuadPart !=0 && FBI->ChangeTime.QuadPart != -1) { - Mcb->ChangeTime = FBI->ChangeTime; + Ext2SetInodeTime(&FBI->ChangeTime, &Inode->i_ctime, &Inode->i_ctime_extra); + Mcb->ChangeTime = Ext2GetInodeTime(Inode->i_ctime, Inode->i_ctime_extra); + NotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES; } if (FBI->FileAttributes != 0) { @@ -2041,6 +2043,7 @@ Ext2DeleteFile( /* set delete time and free the inode */ KeQuerySystemTime(&SysTime); Mcb->Inode.i_nlink = 0; + /* i_dtime is only the lower 32-bits because it is used as a relative time */ { ULONG dummy; Ext2TimeToSecondsSince1970(&SysTime, &Mcb->Inode.i_dtime, &dummy); } Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode); Ext2FreeInode(IrpContext, Vcb, Mcb->Inode.i_ino, Ext2InodeType(Mcb)); diff --git a/Ext4Fsd/memory.c b/Ext4Fsd/memory.c index e7aee41..3252642 100644 --- a/Ext4Fsd/memory.c +++ b/Ext4Fsd/memory.c @@ -2694,10 +2694,13 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext, } /* initializeroot node */ - Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); Vcb->McbTree->LastAccessTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_atime, Vcb->McbTree->Inode.i_atime_extra); Vcb->McbTree->LastWriteTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_mtime, Vcb->McbTree->Inode.i_mtime_extra); - Vcb->McbTree->ChangeTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_mtime, Vcb->McbTree->Inode.i_mtime_extra); + Vcb->McbTree->ChangeTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); + if (Vcb->McbTree->Inode.i_crtime) + Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_crtime, Vcb->McbTree->Inode.i_crtime_extra); + else + Vcb->McbTree->CreationTime = Ext2GetInodeTime(Vcb->McbTree->Inode.i_ctime, Vcb->McbTree->Inode.i_ctime_extra); /* check bitmap if user specifies it */ if (IsFlagOn(Ext2Global->Flags, EXT2_CHECKING_BITMAP)) {