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:
@@ -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,
|
||||
|
||||
@@ -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'.');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user