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

time conversion functions to support year 2038 and nano second file times

This commit is contained in:
Bo Branten
2024-09-02 21:59:46 +02:00
parent 75883784b4
commit 202e5fd014
2 changed files with 85 additions and 5 deletions

View File

@@ -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,

View File

@@ -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'.');
}
}