diff --git a/src/common/utils/time.cpp b/src/common/utils/time.cpp new file mode 100644 index 00000000..e4f342f6 --- /dev/null +++ b/src/common/utils/time.cpp @@ -0,0 +1,80 @@ +#include "time.hpp" + +namespace utils +{ + std::chrono::steady_clock::time_point convert_delay_interval_to_time_point( + const LARGE_INTEGER delay_interval) + { + if (delay_interval.QuadPart <= 0) + { + const auto relative_time = -delay_interval.QuadPart; + const auto relative_ticks_in_ms = relative_time / 10; + const auto relative_fraction_ns = (relative_time % 10) * 100; + const auto relative_duration = + std::chrono::microseconds(relative_ticks_in_ms) + std::chrono::nanoseconds(relative_fraction_ns); + + return std::chrono::steady_clock::now() + relative_duration; + } + + const auto delay_seconds_since_1601 = delay_interval.QuadPart / HUNDRED_NANOSECONDS_IN_ONE_SECOND; + const auto delay_fraction_ns = (delay_interval.QuadPart % HUNDRED_NANOSECONDS_IN_ONE_SECOND) * 100; + + const auto delay_seconds_since_1970 = delay_seconds_since_1601 - EPOCH_DIFFERENCE_1601_TO_1970_SECONDS; + + const auto target_time = std::chrono::system_clock::from_time_t(delay_seconds_since_1970) + + std::chrono::nanoseconds(delay_fraction_ns); + + const auto now_system = std::chrono::system_clock::now(); + + const auto duration_until_target = + std::chrono::duration_cast(target_time - now_system); + + return std::chrono::steady_clock::now() + duration_until_target; + } + + KSYSTEM_TIME convert_to_ksystem_time(const std::chrono::system_clock::time_point& tp) + { + const auto duration = tp.time_since_epoch(); + const auto ns_duration = std::chrono::duration_cast(duration); + + const auto total_ticks = ns_duration.count() / 100 + WINDOWS_EPOCH_DIFFERENCE; + + KSYSTEM_TIME time{}; + time.LowPart = static_cast(total_ticks); + time.High1Time = static_cast(total_ticks >> 32); + time.High2Time = time.High1Time; + + return time; + } + + void convert_to_ksystem_time(volatile KSYSTEM_TIME* dest, const std::chrono::system_clock::time_point& tp) + { + const auto time = convert_to_ksystem_time(tp); + memcpy(const_cast(dest), &time, sizeof(*dest)); + } + + std::chrono::system_clock::time_point convert_from_ksystem_time(const KSYSTEM_TIME& time) + { + auto totalTicks = (static_cast(time.High1Time) << 32) | time.LowPart; + totalTicks -= WINDOWS_EPOCH_DIFFERENCE; + + const auto duration = std::chrono::system_clock::duration(totalTicks * 100); + return std::chrono::system_clock::time_point(duration); + } + + std::chrono::system_clock::time_point convert_from_ksystem_time(const volatile KSYSTEM_TIME& time) + { + return convert_from_ksystem_time(*const_cast(&time)); + } + +#ifndef OS_WINDOWS + using __time64_t = int64_t; +#endif + + LARGE_INTEGER convert_unix_to_windows_time(const __time64_t unix_time) + { + LARGE_INTEGER windows_time{}; + windows_time.QuadPart = (unix_time + EPOCH_DIFFERENCE_1601_TO_1970_SECONDS) * HUNDRED_NANOSECONDS_IN_ONE_SECOND; + return windows_time; + } +} diff --git a/src/common/utils/time.hpp b/src/common/utils/time.hpp new file mode 100644 index 00000000..bf592f18 --- /dev/null +++ b/src/common/utils/time.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "../platform/platform.hpp" + +constexpr auto HUNDRED_NANOSECONDS_IN_ONE_SECOND = 10000000LL; +constexpr auto EPOCH_DIFFERENCE_1601_TO_1970_SECONDS = 11644473600LL; +constexpr auto WINDOWS_EPOCH_DIFFERENCE = EPOCH_DIFFERENCE_1601_TO_1970_SECONDS * HUNDRED_NANOSECONDS_IN_ONE_SECOND; + +namespace utils +{ + std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(const LARGE_INTEGER delay_interval); + KSYSTEM_TIME convert_to_ksystem_time(const std::chrono::system_clock::time_point& tp); + void convert_to_ksystem_time(volatile KSYSTEM_TIME* dest, const std::chrono::system_clock::time_point& tp); + std::chrono::system_clock::time_point convert_from_ksystem_time(const KSYSTEM_TIME& time); + std::chrono::system_clock::time_point convert_from_ksystem_time(const volatile KSYSTEM_TIME& time); +#ifndef OS_WINDOWS + using __time64_t = int64_t; +#endif + LARGE_INTEGER convert_unix_to_windows_time(const __time64_t unix_time); +} diff --git a/src/common/utils/timer.hpp b/src/common/utils/timer.hpp index b256ef6e..22120bce 100644 --- a/src/common/utils/timer.hpp +++ b/src/common/utils/timer.hpp @@ -2,10 +2,6 @@ #include -constexpr auto HUNDRED_NANOSECONDS_IN_ONE_SECOND = 10000000LL; -constexpr auto EPOCH_DIFFERENCE_1601_TO_1970_SECONDS = 11644473600LL; -constexpr auto WINDOWS_EPOCH_DIFFERENCE = EPOCH_DIFFERENCE_1601_TO_1970_SECONDS * HUNDRED_NANOSECONDS_IN_ONE_SECOND; - namespace utils { template @@ -27,80 +23,4 @@ namespace utils private: typename Clock::time_point point_{Clock::now()}; }; - - inline std::chrono::steady_clock::time_point convert_delay_interval_to_time_point( - const LARGE_INTEGER delay_interval) - { - if (delay_interval.QuadPart <= 0) - { - const auto relative_time = -delay_interval.QuadPart; - const auto relative_ticks_in_ms = relative_time / 10; - const auto relative_fraction_ns = (relative_time % 10) * 100; - const auto relative_duration = - std::chrono::microseconds(relative_ticks_in_ms) + std::chrono::nanoseconds(relative_fraction_ns); - - return std::chrono::steady_clock::now() + relative_duration; - } - - const auto delay_seconds_since_1601 = delay_interval.QuadPart / HUNDRED_NANOSECONDS_IN_ONE_SECOND; - const auto delay_fraction_ns = (delay_interval.QuadPart % HUNDRED_NANOSECONDS_IN_ONE_SECOND) * 100; - - const auto delay_seconds_since_1970 = delay_seconds_since_1601 - EPOCH_DIFFERENCE_1601_TO_1970_SECONDS; - - const auto target_time = std::chrono::system_clock::from_time_t(delay_seconds_since_1970) + - std::chrono::nanoseconds(delay_fraction_ns); - - const auto now_system = std::chrono::system_clock::now(); - - const auto duration_until_target = - std::chrono::duration_cast(target_time - now_system); - - return std::chrono::steady_clock::now() + duration_until_target; - } - - inline KSYSTEM_TIME convert_to_ksystem_time(const std::chrono::system_clock::time_point& tp) - { - const auto duration = tp.time_since_epoch(); - const auto ns_duration = std::chrono::duration_cast(duration); - - const auto total_ticks = ns_duration.count() / 100 + WINDOWS_EPOCH_DIFFERENCE; - - KSYSTEM_TIME time{}; - time.LowPart = static_cast(total_ticks); - time.High1Time = static_cast(total_ticks >> 32); - time.High2Time = time.High1Time; - - return time; - } - - inline void convert_to_ksystem_time(volatile KSYSTEM_TIME* dest, const std::chrono::system_clock::time_point& tp) - { - const auto time = convert_to_ksystem_time(tp); - memcpy(const_cast(dest), &time, sizeof(*dest)); - } - - inline std::chrono::system_clock::time_point convert_from_ksystem_time(const KSYSTEM_TIME& time) - { - auto totalTicks = (static_cast(time.High1Time) << 32) | time.LowPart; - totalTicks -= WINDOWS_EPOCH_DIFFERENCE; - - const auto duration = std::chrono::system_clock::duration(totalTicks * 100); - return std::chrono::system_clock::time_point(duration); - } - - inline std::chrono::system_clock::time_point convert_from_ksystem_time(const volatile KSYSTEM_TIME& time) - { - return convert_from_ksystem_time(*const_cast(&time)); - } - -#ifndef OS_WINDOWS - using __time64_t = int64_t; -#endif - - inline LARGE_INTEGER convert_unix_to_windows_time(const __time64_t unix_time) - { - LARGE_INTEGER windows_time{}; - windows_time.QuadPart = (unix_time + EPOCH_DIFFERENCE_1601_TO_1970_SECONDS) * HUNDRED_NANOSECONDS_IN_ONE_SECOND; - return windows_time; - } } diff --git a/src/windows-emulator/devices/afd_endpoint.cpp b/src/windows-emulator/devices/afd_endpoint.cpp index 6d2661bb..f0ab1cb0 100644 --- a/src/windows-emulator/devices/afd_endpoint.cpp +++ b/src/windows-emulator/devices/afd_endpoint.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include namespace { diff --git a/src/windows-emulator/kusd_mmio.cpp b/src/windows-emulator/kusd_mmio.cpp index a2ad2c2a..b6575ed6 100644 --- a/src/windows-emulator/kusd_mmio.cpp +++ b/src/windows-emulator/kusd_mmio.cpp @@ -1,5 +1,5 @@ #include "kusd_mmio.hpp" -#include +#include #include "windows_emulator.hpp" #include diff --git a/src/windows-emulator/syscall_utils.hpp b/src/windows-emulator/syscall_utils.hpp index 32118839..613a09a0 100644 --- a/src/windows-emulator/syscall_utils.hpp +++ b/src/windows-emulator/syscall_utils.hpp @@ -193,3 +193,4 @@ void write_attribute(emulator& emu, const PS_ATTRIBUTE& attribute, const emulator_object{emu, attribute.Value}.write(value); } } + diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index 48055649..ab2d8bf8 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include