2021-05-28 17:06:41 +02:00
|
|
|
#include "pch.h"
|
|
|
|
|
#include "TimeFunctions.h"
|
|
|
|
|
#pragma unmanaged
|
|
|
|
|
|
|
|
|
|
TimeFunctions::TimeFunctions()
|
|
|
|
|
{
|
2021-05-31 15:20:16 +02:00
|
|
|
|
2021-05-28 17:06:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UINT32 FileTime_to_POSIX(FILETIME ft)
|
|
|
|
|
{
|
|
|
|
|
// takes the last modified date
|
|
|
|
|
LARGE_INTEGER date, adjust;
|
|
|
|
|
date.HighPart = ft.dwHighDateTime;
|
|
|
|
|
date.LowPart = ft.dwLowDateTime;
|
|
|
|
|
// 100-nanoseconds = milliseconds * 10000
|
|
|
|
|
adjust.QuadPart = 11644473600000 * 10000;
|
|
|
|
|
// removes the diff between 1970 and 1601
|
|
|
|
|
date.QuadPart -= adjust.QuadPart;
|
|
|
|
|
// converts back from 100-nanoseconds to seconds
|
|
|
|
|
return (UINT32)(date.QuadPart / 10000000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UINT32 UnixTimeNow() {
|
|
|
|
|
FILETIME ft;
|
|
|
|
|
GetSystemTimeAsFileTime(&ft);
|
|
|
|
|
return FileTime_to_POSIX(ft);
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-13 10:17:18 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Filetime is 100nS since 1601 01 01 UTC Unix = seconds since 1970
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="t"></param>
|
|
|
|
|
/// <param name="pft"></param>
|
2021-05-28 17:06:41 +02:00
|
|
|
void TimeFunctions::UnixTimeToFileTime(time_t t, LPFILETIME pft)
|
|
|
|
|
{
|
2022-04-12 14:28:14 +02:00
|
|
|
ULONG64 ll = ((ULONG64)t * (ULONG64)10000000) + (ULONG64)116444736000000000;
|
2021-05-28 17:06:41 +02:00
|
|
|
pft->dwLowDateTime = (DWORD)ll;
|
|
|
|
|
pft->dwHighDateTime = ll >> 32;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TimeFunctions::UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst)
|
|
|
|
|
{
|
|
|
|
|
FILETIME ft;
|
|
|
|
|
UnixTimeToFileTime(t, &ft);
|
|
|
|
|
FileTimeToSystemTime(&ft, pst);
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-13 10:17:18 +02:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// converts MK2/MK3 time to FileTime
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="epdTime">UTC</param>
|
|
|
|
|
/// <param name="pft">UTC</param>
|
|
|
|
|
/// <param name="isMK2"></param>
|
|
|
|
|
void TimeFunctions::EpdTimeToFileTime(UINT32 epdTime, LPFILETIME epdFileTime, bool isMK2) //MK3
|
2021-05-28 17:06:41 +02:00
|
|
|
{
|
2022-04-13 10:17:18 +02:00
|
|
|
ULONG64 ll = (ULONG64)epdTime * (ULONG64)10000000;
|
2022-04-12 14:28:14 +02:00
|
|
|
if (isMK2) ll += (ULONG64) 116444736000000000; else ll += (ULONG64)125911584000000000; // 2000 base - 1601-1-1 (FT) Base
|
2022-04-13 10:17:18 +02:00
|
|
|
epdFileTime->dwLowDateTime = (DWORD)(ll & 0xffffffff);
|
|
|
|
|
epdFileTime->dwHighDateTime = ll >> 32;
|
2021-05-28 17:06:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TimeFunctions::FileTimeToEpdTime(FILETIME pft, INT32* t, bool isMK2)
|
|
|
|
|
{
|
2022-04-13 10:17:18 +02:00
|
|
|
ULONG64 offset;
|
|
|
|
|
if (isMK2) offset = (ULONG64)116444736000000000; else offset = (ULONG64)125911584000000000;
|
2021-05-28 17:06:41 +02:00
|
|
|
LONGLONG ll = ((((LONGLONG)pft.dwHighDateTime << 32) + pft.dwLowDateTime) - offset) / 10000000;
|
|
|
|
|
*t = (DWORD)ll;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UINT32 TimeFunctions::NowToEpdTime(bool isMK2)
|
|
|
|
|
{
|
2022-04-13 10:17:18 +02:00
|
|
|
ULONG64 offset;
|
|
|
|
|
if (isMK2) offset = (ULONG64)116444736000000000; else offset = (ULONG64)125911584000000000;
|
2021-05-28 17:06:41 +02:00
|
|
|
SYSTEMTIME t;
|
2022-04-13 10:17:18 +02:00
|
|
|
GetSystemTime(&t); // is UTC !!
|
2021-05-28 17:06:41 +02:00
|
|
|
FILETIME ft;
|
|
|
|
|
SystemTimeToFileTime((const SYSTEMTIME*)&t, &ft);
|
|
|
|
|
LONGLONG ll = ((((LONGLONG)ft.dwHighDateTime << 32U) + ft.dwLowDateTime) - offset) / 10000000;
|
|
|
|
|
return (DWORD)ll;
|
2021-05-31 15:20:16 +02:00
|
|
|
}
|
|
|
|
|
|
2022-04-13 10:17:18 +02:00
|
|
|
|
|
|
|
|
|
2021-05-31 15:20:16 +02:00
|
|
|
void TimeFunctions::EPD2PeakTimeToFiletime(DWORD EpdClock, DWORD EpdPeakTime, FILETIME* PeakFileTime) {
|
|
|
|
|
if (EpdPeakTime != 0xCDCDCDCD) {
|
|
|
|
|
UINT32 tm = EpdClock - EpdPeakTime;
|
|
|
|
|
GetSystemTimeAsFileTime(&lu.FT);
|
|
|
|
|
lu.LL -= UInt32x32To64(tm, 10000000);
|
|
|
|
|
*PeakFileTime = lu.FT;
|
2021-06-01 16:35:24 +02:00
|
|
|
} else
|
|
|
|
|
{
|
|
|
|
|
(*PeakFileTime).dwLowDateTime = (*PeakFileTime).dwHighDateTime = 0;
|
2021-05-31 15:20:16 +02:00
|
|
|
}
|
2021-05-28 17:06:41 +02:00
|
|
|
}
|