#include "pch.h" #include "TimeFunctions.h" #pragma unmanaged TimeFunctions::TimeFunctions() { } 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); } /// /// Filetime is 100nS since 1601 01 01 UTC Unix = seconds since 1970 /// /// /// void TimeFunctions::UnixTimeToFileTime(time_t t, LPFILETIME pft) { ULONG64 ll = ((ULONG64)t * (ULONG64)10000000) + (ULONG64)116444736000000000; pft->dwLowDateTime = (DWORD)ll; pft->dwHighDateTime = ll >> 32; } void TimeFunctions::UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst) { FILETIME ft; UnixTimeToFileTime(t, &ft); FileTimeToSystemTime(&ft, pst); } /// /// converts MK2/MK3 time to FileTime /// /// UTC /// UTC /// //void TimeFunctions::EpdTimeToFileTime(UINT32 epdTime, LPFILETIME epdFileTime, bool isMK2) //MK3 //{ // ULONG64 ll = (ULONG64)epdTime * (ULONG64)10000000; // if (isMK2) ll += (ULONG64) 116444736000000000; else ll += (ULONG64)125911584000000000; // 2000 base - 1601-1-1 (FT) Base // epdFileTime->dwLowDateTime = (DWORD)(ll & 0xffffffff); // epdFileTime->dwHighDateTime = ll >> 32; //} void TimeFunctions::Epd3TimeToFileTime(UINT32 epdTime, LPFILETIME epdFileTime) //MK3 { ULONG64 ll = (ULONG64)epdTime * (ULONG64)10000000; ll += (ULONG64)125911584000000000; // 2000 base - 1601-1-1 (FT) Base epdFileTime->dwLowDateTime = (DWORD)(ll & 0xffffffff); epdFileTime->dwHighDateTime = ll >> 32; } void TimeFunctions::FileTimeToEpdTime(FILETIME pft, INT32* t, bool isMK2) { ULONG64 offset; if (isMK2) offset = (ULONG64)116444736000000000; else offset = (ULONG64)125911584000000000; LONGLONG ll = ((((LONGLONG)pft.dwHighDateTime << 32) + pft.dwLowDateTime) - offset) / 10000000; *t = (DWORD)ll; } UINT32 TimeFunctions::NowToEpd3Time() { ULONG64 offset; offset = (ULONG64)125911584000000000; SYSTEMTIME t; GetSystemTime(&t); // is UTC !! FILETIME ft; SystemTimeToFileTime((const SYSTEMTIME*)&t, &ft); LONGLONG ll = ((((LONGLONG)ft.dwHighDateTime << 32U) + ft.dwLowDateTime) - offset) / 10000000; return (DWORD)ll; } //UINT32 TimeFunctions::NowToEpdTime(bool isMK2) //{ // ULONG64 offset; // if (isMK2) offset = (ULONG64)116444736000000000; else offset = (ULONG64)125911584000000000; // SYSTEMTIME t; // GetSystemTime(&t); // is UTC !! // FILETIME ft; // SystemTimeToFileTime((const SYSTEMTIME*)&t, &ft); // LONGLONG ll = ((((LONGLONG)ft.dwHighDateTime << 32U) + ft.dwLowDateTime) - offset) / 10000000; // return (DWORD)ll; //} 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; } else { (*PeakFileTime).dwLowDateTime = (*PeakFileTime).dwHighDateTime = 0; } }