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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user