1
0
mirror of https://github.com/bobranten/Ext4Fsd.git synced 2025-10-29 13:18:30 -05:00

implemented support for year 2038 and nano second file times

This commit is contained in:
Bo Branten
2024-09-02 22:52:19 +02:00
parent 01a708235c
commit ebb9a542f7
8 changed files with 45 additions and 58 deletions

View File

@@ -29,7 +29,6 @@ Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext)
PIRP Irp = NULL;
PEXT2_MCB Mcb = NULL;
BOOLEAN VcbResourceAcquired = FALSE;
BOOLEAN FcbResourceAcquired = FALSE;
BOOLEAN FcbPagingIoResourceAcquired = FALSE;
@@ -163,10 +162,9 @@ Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext)
LARGE_INTEGER SysTime;
KeQuerySystemTime(&SysTime);
Fcb->Inode->i_atime =
Fcb->Inode->i_mtime = Ext2LinuxTime(SysTime);
Fcb->Mcb->LastAccessTime =
Fcb->Mcb->LastWriteTime = Ext2NtTime(Fcb->Inode->i_atime);
Ext2SetInodeTime(&SysTime, &Fcb->Inode->i_mtime, &Fcb->Inode->i_mtime_extra);
Ext2SetInodeTime(&SysTime, &Fcb->Inode->i_atime, &Fcb->Inode->i_atime_extra);
Fcb->Mcb->LastAccessTime = Fcb->Mcb->LastWriteTime = Ext2GetInodeTime(Fcb->Inode->i_atime, Fcb->Inode->i_atime_extra);
Ext2SaveInode(IrpContext, Vcb, Fcb->Inode);

View File

@@ -31,7 +31,6 @@ extern PEXT2_GLOBAL Ext2Global;
#pragma alloc_text(PAGE, Ext2SupersedeOrOverWriteFile)
#endif
BOOLEAN
Ext2IsNameValid(PUNICODE_STRING FileName)
{
@@ -62,7 +61,6 @@ Ext2IsNameValid(PUNICODE_STRING FileName)
return TRUE;
}
NTSTATUS
Ext2FollowLink (
IN PEXT2_IRP_CONTEXT IrpContext,
@@ -486,10 +484,10 @@ Ext2LookupFile (
}
}
Mcb->CreationTime = Ext2NtTime(Mcb->Inode.i_ctime);
Mcb->LastAccessTime = Ext2NtTime(Mcb->Inode.i_atime);
Mcb->LastWriteTime = Ext2NtTime(Mcb->Inode.i_mtime);
Mcb->ChangeTime = Ext2NtTime(Mcb->Inode.i_mtime);
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);
/* process symlink */
if (S_ISLNK(Mcb->Inode.i_mode) && !bNotFollow) {
@@ -561,7 +559,6 @@ Ext2LookupFile (
return Status;
}
NTSTATUS
Ext2ScanDir (
IN PEXT2_IRP_CONTEXT IrpContext,
@@ -1949,7 +1946,6 @@ errorout:
return Status;
}
NTSTATUS
Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext)
{
@@ -2075,8 +2071,9 @@ Ext2CreateInode(
Ext2ClearInode(IrpContext, Vcb, iNo);
Inode.i_sb = &Vcb->sb;
Inode.i_ino = iNo;
Inode.i_ctime = Inode.i_mtime =
Inode.i_atime = Ext2LinuxTime(SysTime);
Ext2SetInodeTime(&SysTime, &Inode.i_ctime, &Inode.i_ctime_extra);
Ext2SetInodeTime(&SysTime, &Inode.i_mtime, &Inode.i_mtime_extra);
Ext2SetInodeTime(&SysTime, &Inode.i_atime, &Inode.i_atime_extra);
if (IsFlagOn(Vcb->Flags, VCB_USER_IDS)) {
Inode.i_uid = Vcb->uid;
Inode.i_gid = Vcb->gid;
@@ -2135,7 +2132,6 @@ errorout:
return Status;
}
NTSTATUS
Ext2SupersedeOrOverWriteFile(
IN PEXT2_IRP_CONTEXT IrpContext,
@@ -2186,10 +2182,10 @@ Ext2SupersedeOrOverWriteFile(
Fcb->Inode->i_size = 0;
if (Disposition == FILE_SUPERSEDE) {
Fcb->Inode->i_ctime = Ext2LinuxTime(CurrentTime);
Ext2SetInodeTime(&CurrentTime, &Fcb->Inode->i_ctime, &Fcb->Inode->i_ctime_extra);
}
Fcb->Inode->i_atime =
Fcb->Inode->i_mtime = Ext2LinuxTime(CurrentTime);
Ext2SetInodeTime(&CurrentTime, &Fcb->Inode->i_mtime, &Fcb->Inode->i_mtime_extra);
Ext2SetInodeTime(&CurrentTime, &Fcb->Inode->i_atime, &Fcb->Inode->i_atime_extra);
Ext2SaveInode(IrpContext, Vcb, Fcb->Inode);
// See if we need to overwrite EA of the file

View File

@@ -250,10 +250,10 @@ Ext2ProcessEntry(
} else {
FDI->CreationTime = Ext2NtTime(Inode.i_ctime);
FDI->LastAccessTime = Ext2NtTime(Inode.i_atime);
FDI->LastWriteTime = Ext2NtTime(Inode.i_mtime);
FDI->ChangeTime = Ext2NtTime(Inode.i_mtime);
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->FileAttributes = FileAttributes;
@@ -306,10 +306,10 @@ Ext2ProcessEntry(
} else {
FBI->CreationTime = Ext2NtTime(Inode.i_ctime);
FBI->LastAccessTime = Ext2NtTime(Inode.i_atime);
FBI->LastWriteTime = Ext2NtTime(Inode.i_mtime);
FBI->ChangeTime = Ext2NtTime(Inode.i_mtime);
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->FileAttributes = FileAttributes;

View File

@@ -113,10 +113,10 @@ Ext2RefreshSuper (
return FALSE;
/* initializeroot node */
Vcb->McbTree->CreationTime = Ext2NtTime(Vcb->McbTree->Inode.i_ctime);
Vcb->McbTree->LastAccessTime = Ext2NtTime(Vcb->McbTree->Inode.i_atime);
Vcb->McbTree->LastWriteTime = Ext2NtTime(Vcb->McbTree->Inode.i_mtime);
Vcb->McbTree->ChangeTime = Ext2NtTime(Vcb->McbTree->Inode.i_mtime);
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);
}
return TRUE;

View File

@@ -108,7 +108,6 @@ static void TEA_transform(__u32 buf[4], __u32 const in[])
buf[1] += b1;
}
/* The old legacy hash */
static __u32 dx_hack_hash_unsigned(const char *name, int len)
{
@@ -198,15 +197,18 @@ static void str2hashbuf_unsigned(const char *msg, int len, __u32 *buf, int num)
*buf++ = pad;
}
#endif /* EXT2_HTREE_INDEX */
__u32 ext3_current_time(struct inode *in)
{
LARGE_INTEGER SysTime;
KeQuerySystemTime(&SysTime);
LARGE_INTEGER SysTime;
ULONG hi, lo;
return Ext2LinuxTime(SysTime);
KeQuerySystemTime(&SysTime);
Ext2SetInodeTime(&SysTime, &lo, &hi);
in->i_ctime_extra = in->i_mtime_extra = hi;
in->i_ctime = in->i_mtime = lo;
return lo;
}
void ext3_warning (struct super_block * sb, const char * function,
@@ -224,7 +226,6 @@ void ext3_warning (struct super_block * sb, const char * function,
#endif
}
/* ext3_bread is safe for meta-data blocks. it's not safe to read file data,
since file data is managed by file cache, not volume cache */
struct buffer_head *ext3_bread(struct ext2_icb *icb, struct inode *inode,
@@ -303,7 +304,6 @@ struct buffer_head *ext3_append(struct ext2_icb *icb, struct inode *inode,
return ext3_bread(icb, inode, *block, err);
}
void ext3_inc_count(struct inode *inode)
{
inode->i_nlink++;
@@ -551,7 +551,6 @@ int ext3_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
}
EXPORT_SYMBOL(ext3_dirhash);
/*
* These functions convert from the major/minor hash to an f_pos
* value.
@@ -628,7 +627,6 @@ static void free_rb_tree_fname(struct rb_root *root)
root->rb_node = NULL;
}
static struct dir_private_info *create_dir_info(loff_t pos)
{
struct dir_private_info *p;
@@ -924,7 +922,6 @@ struct stats dx_show_entries(struct ext2_icb *icb, struct dx_hash_info *hinfo,
}
#endif /* DX_DEBUG */
int ext3_save_inode ( struct ext2_icb *icb, struct inode *in)
{
return Ext2SaveInode(icb, in->i_sb->s_priv, in);
@@ -1293,7 +1290,6 @@ errout:
return (err);
}
/*
* Directory block splitting, compacting
*/

View File

@@ -495,7 +495,6 @@ Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext)
return Status;
}
NTSTATUS
Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext)
{
@@ -658,20 +657,20 @@ Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext)
struct inode *Inode = &Mcb->Inode;
if (FBI->CreationTime.QuadPart != 0 && FBI->CreationTime.QuadPart != -1) {
Inode->i_ctime = Ext2LinuxTime(FBI->CreationTime);
Mcb->CreationTime = Ext2NtTime(Inode->i_ctime);
Ext2SetInodeTime(&FBI->CreationTime, &Inode->i_ctime, &Inode->i_ctime_extra);
Mcb->CreationTime = Ext2GetInodeTime(Inode->i_ctime, Inode->i_ctime_extra);
NotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
}
if (FBI->LastAccessTime.QuadPart != 0 && FBI->LastAccessTime.QuadPart != -1) {
Inode->i_atime = Ext2LinuxTime(FBI->LastAccessTime);
Mcb->LastAccessTime = Ext2NtTime(Inode->i_atime);
Ext2SetInodeTime(&FBI->LastAccessTime, &Inode->i_atime, &Inode->i_atime_extra);
Mcb->LastAccessTime = Ext2GetInodeTime(Inode->i_atime, Inode->i_atime_extra);
NotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
}
if (FBI->LastWriteTime.QuadPart != 0 && FBI->LastWriteTime.QuadPart != -1) {
Inode->i_mtime = Ext2LinuxTime(FBI->LastWriteTime);
Mcb->LastWriteTime = Ext2NtTime(Inode->i_mtime);
Ext2SetInodeTime(&FBI->LastWriteTime, &Inode->i_mtime, &Inode->i_mtime_extra);
Mcb->LastWriteTime = Ext2GetInodeTime(Inode->i_mtime, Inode->i_mtime_extra);
NotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
SetFlag(Ccb->Flags, CCB_LAST_WRITE_UPDATED);
}
@@ -1133,7 +1132,6 @@ Ext2BlockMap(
return status;
}
NTSTATUS
Ext2ExpandFile(
PEXT2_IRP_CONTEXT IrpContext,
@@ -1185,7 +1183,6 @@ errorout:
return status;
}
NTSTATUS
Ext2TruncateFile(
PEXT2_IRP_CONTEXT IrpContext,
@@ -2044,7 +2041,7 @@ Ext2DeleteFile(
/* set delete time and free the inode */
KeQuerySystemTime(&SysTime);
Mcb->Inode.i_nlink = 0;
Mcb->Inode.i_dtime = Ext2LinuxTime(SysTime);
{ ULONG dummy; Ext2TimeToSecondsSince1970(&SysTime, &Mcb->Inode.i_dtime, &dummy); }
Ext2SaveInode(IrpContext, Vcb, &Mcb->Inode);
Ext2FreeInode(IrpContext, Vcb, Mcb->Inode.i_ino, Ext2InodeType(Mcb));
}

View File

@@ -77,8 +77,8 @@ Ext2FlushFile (
LARGE_INTEGER SysTime;
KeQuerySystemTime(&SysTime);
Fcb->Inode->i_mtime = Ext2LinuxTime(SysTime);
Fcb->Mcb->LastWriteTime = Ext2NtTime(Fcb->Inode->i_mtime);
Ext2SetInodeTime(&SysTime, &Fcb->Inode->i_mtime, &Fcb->Inode->i_mtime_extra);
Fcb->Mcb->LastWriteTime = Ext2GetInodeTime(Fcb->Inode->i_mtime, Fcb->Inode->i_mtime_extra);
Ext2SaveInode(IrpContext, Fcb->Vcb, Fcb->Inode);
}
}

View File

@@ -2693,10 +2693,10 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext,
}
/* initializeroot node */
Vcb->McbTree->CreationTime = Ext2NtTime(Vcb->McbTree->Inode.i_ctime);
Vcb->McbTree->LastAccessTime = Ext2NtTime(Vcb->McbTree->Inode.i_atime);
Vcb->McbTree->LastWriteTime = Ext2NtTime(Vcb->McbTree->Inode.i_mtime);
Vcb->McbTree->ChangeTime = Ext2NtTime(Vcb->McbTree->Inode.i_mtime);
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);
/* check bitmap if user specifies it */
if (IsFlagOn(Ext2Global->Flags, EXT2_CHECKING_BITMAP)) {