From 202e5fd0146d255871fa11e24a08381c2498ad4a Mon Sep 17 00:00:00 2001 From: Bo Branten Date: Mon, 2 Sep 2024 21:59:46 +0200 Subject: [PATCH] time conversion functions to support year 2038 and nano second file times --- Ext4Fsd/include/ext2fs.h | 29 +++++++++++++++++++ Ext4Fsd/misc.c | 61 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/Ext4Fsd/include/ext2fs.h b/Ext4Fsd/include/ext2fs.h index da549e0..1474949 100644 --- a/Ext4Fsd/include/ext2fs.h +++ b/Ext4Fsd/include/ext2fs.h @@ -2882,6 +2882,35 @@ Ext2NtTime (IN ULONG i_time); ULONG Ext2LinuxTime (IN LARGE_INTEGER SysTime); +#define TICKSPERSEC 10000000 +#define SECSPERDAY 86400 +/* 1601 to 1970 is 369 years plus 89 leap days */ +#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY) +#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) + +VOID +Ext2TimeToSecondsSince1970( + IN PLARGE_INTEGER SysTime, + OUT PULONG SecondsSince1970LowPart, + OUT PULONG SecondsSince1970HighPart); + +VOID +Ext2SecondsSince1970ToTime( + IN ULONG SecondsSince1970LowPart, + IN ULONG SecondsSince1970HighPart, + OUT PLARGE_INTEGER SysTime); + +VOID +Ext2SetInodeTime( + IN PLARGE_INTEGER SysTime, + OUT PULONG i_time, + OUT PULONG i_time_extra); + +LARGE_INTEGER +Ext2GetInodeTime( + IN ULONG i_time, + IN ULONG i_time_extra); + ULONG Ext2OEMToUnicodeSize( IN PEXT2_VCB Vcb, diff --git a/Ext4Fsd/misc.c b/Ext4Fsd/misc.c index f5abdab..288dc50 100644 --- a/Ext4Fsd/misc.c +++ b/Ext4Fsd/misc.c @@ -61,6 +61,61 @@ Ext2LinuxTime (IN LARGE_INTEGER SysTime) return Ext2Time; } +VOID +Ext2TimeToSecondsSince1970( + IN PLARGE_INTEGER SysTime, + OUT PULONG SecondsSince1970LowPart, + OUT PULONG SecondsSince1970HighPart) +{ + LARGE_INTEGER LinuxTime; + + LinuxTime.QuadPart = SysTime->QuadPart / (ULONGLONG)TICKSPERSEC - SECS_1601_TO_1970; + + *SecondsSince1970LowPart = LinuxTime.LowPart; + *SecondsSince1970HighPart = LinuxTime.HighPart; +} + +VOID +Ext2SecondsSince1970ToTime( + IN ULONG SecondsSince1970LowPart, + IN ULONG SecondsSince1970HighPart, + OUT PLARGE_INTEGER SysTime) +{ + SysTime->QuadPart = (((LONGLONG)SecondsSince1970HighPart << 32) + SecondsSince1970LowPart) * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; +} + +VOID +Ext2SetInodeTime( + IN PLARGE_INTEGER SysTime, + OUT PULONG i_time, + OUT PULONG i_time_extra) +{ + LARGE_INTEGER LinuxTime; + ULONG epoc, nano_sec; + + Ext2TimeToSecondsSince1970(SysTime, &LinuxTime.LowPart, &LinuxTime.HighPart); + epoc = ((LinuxTime.QuadPart - (signed int)LinuxTime.QuadPart) >> 32) & EXT4_EPOCH_MASK; + nano_sec = (SysTime->QuadPart % (ULONGLONG)TICKSPERSEC) * 100; + *i_time = LinuxTime.LowPart; + *i_time_extra = (epoc | (nano_sec << EXT4_EPOCH_BITS)); +} + +LARGE_INTEGER +Ext2GetInodeTime( + IN ULONG i_time, + IN ULONG i_time_extra) +{ + LARGE_INTEGER LinuxTime, SysTime; + ULONG epoc, nano_sec; + + epoc = i_time_extra & EXT4_EPOCH_MASK; + nano_sec = (i_time_extra & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; + LinuxTime.QuadPart = (signed)i_time + ((ULONGLONG)epoc << 32); + Ext2SecondsSince1970ToTime(LinuxTime.LowPart, LinuxTime.HighPart, &SysTime); + SysTime.QuadPart += nano_sec / 100; + + return SysTime; +} ULONG Ext2MbsToUnicode( @@ -178,7 +233,6 @@ Ext2UnicodeToMbs ( return Length; } - ULONG Ext2OEMToUnicodeSize( IN PEXT2_VCB Vcb, @@ -201,7 +255,6 @@ errorout: return Length; } - NTSTATUS Ext2OEMToUnicode( IN PEXT2_VCB Vcb, @@ -211,7 +264,6 @@ Ext2OEMToUnicode( { NTSTATUS Status; - if (Vcb->Codepage.PageTable) { Status = Ext2MbsToUnicode(Vcb->Codepage.PageTable, Unicode, Oem); @@ -256,7 +308,6 @@ Ext2UnicodeToOEMSize( return RtlxUnicodeStringToOemSize(Unicode); } - NTSTATUS Ext2UnicodeToOEM ( IN PEXT2_VCB Vcb, @@ -530,4 +581,4 @@ BOOLEAN Ext2IsDotDot(PUNICODE_STRING name) { return (name->Length == 4 && name->Buffer[0] == L'.' && name->Buffer[1] == L'.'); -} \ No newline at end of file +}