mirror of
https://github.com/bobranten/Ext4Fsd.git
synced 2025-10-30 05:18:31 -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
|
ULONG
|
||||||
Ext2LinuxTime (IN LARGE_INTEGER SysTime);
|
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
|
ULONG
|
||||||
Ext2OEMToUnicodeSize(
|
Ext2OEMToUnicodeSize(
|
||||||
IN PEXT2_VCB Vcb,
|
IN PEXT2_VCB Vcb,
|
||||||
|
|||||||
@@ -61,6 +61,61 @@ Ext2LinuxTime (IN LARGE_INTEGER SysTime)
|
|||||||
return Ext2Time;
|
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
|
ULONG
|
||||||
Ext2MbsToUnicode(
|
Ext2MbsToUnicode(
|
||||||
@@ -178,7 +233,6 @@ Ext2UnicodeToMbs (
|
|||||||
return Length;
|
return Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
Ext2OEMToUnicodeSize(
|
Ext2OEMToUnicodeSize(
|
||||||
IN PEXT2_VCB Vcb,
|
IN PEXT2_VCB Vcb,
|
||||||
@@ -201,7 +255,6 @@ errorout:
|
|||||||
return Length;
|
return Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
Ext2OEMToUnicode(
|
Ext2OEMToUnicode(
|
||||||
IN PEXT2_VCB Vcb,
|
IN PEXT2_VCB Vcb,
|
||||||
@@ -211,7 +264,6 @@ Ext2OEMToUnicode(
|
|||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
|
||||||
if (Vcb->Codepage.PageTable) {
|
if (Vcb->Codepage.PageTable) {
|
||||||
Status = Ext2MbsToUnicode(Vcb->Codepage.PageTable,
|
Status = Ext2MbsToUnicode(Vcb->Codepage.PageTable,
|
||||||
Unicode, Oem);
|
Unicode, Oem);
|
||||||
@@ -256,7 +308,6 @@ Ext2UnicodeToOEMSize(
|
|||||||
return RtlxUnicodeStringToOemSize(Unicode);
|
return RtlxUnicodeStringToOemSize(Unicode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
Ext2UnicodeToOEM (
|
Ext2UnicodeToOEM (
|
||||||
IN PEXT2_VCB Vcb,
|
IN PEXT2_VCB Vcb,
|
||||||
@@ -530,4 +581,4 @@ BOOLEAN Ext2IsDotDot(PUNICODE_STRING name)
|
|||||||
{
|
{
|
||||||
return (name->Length == 4 && name->Buffer[0] == L'.' &&
|
return (name->Length == 4 && name->Buffer[0] == L'.' &&
|
||||||
name->Buffer[1] == L'.');
|
name->Buffer[1] == L'.');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user