diff --git a/src/common/utils/time.cpp b/src/common/utils/time.cpp index b3634a8b..e439378f 100644 --- a/src/common/utils/time.cpp +++ b/src/common/utils/time.cpp @@ -3,8 +3,14 @@ namespace utils { - std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(clock& c, const LARGE_INTEGER delay_interval) + std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(clock& c, const LARGE_INTEGER delay_interval, + const LARGE_INTEGER infinite_value) { + if (delay_interval.QuadPart == infinite_value.QuadPart) + { + return std::chrono::steady_clock::time_point::min(); + } + if (delay_interval.QuadPart <= 0) { const auto relative_time = -delay_interval.QuadPart; diff --git a/src/common/utils/time.hpp b/src/common/utils/time.hpp index a097335b..c9e8f3c8 100644 --- a/src/common/utils/time.hpp +++ b/src/common/utils/time.hpp @@ -102,7 +102,9 @@ namespace utils } }; - std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(clock& c, LARGE_INTEGER delay_interval); + std::chrono::steady_clock::time_point convert_delay_interval_to_time_point(clock& c, LARGE_INTEGER delay_interval, + LARGE_INTEGER infinite_value = {.LowPart = 0, + .HighPart = -2147483648}); 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); diff --git a/src/windows-emulator/devices/afd_endpoint.cpp b/src/windows-emulator/devices/afd_endpoint.cpp index fd374981..caf70ced 100644 --- a/src/windows-emulator/devices/afd_endpoint.cpp +++ b/src/windows-emulator/devices/afd_endpoint.cpp @@ -1006,7 +1006,8 @@ namespace std::optional timeout{}; if (info.Timeout.QuadPart != std::numeric_limits::max()) { - timeout = utils::convert_delay_interval_to_time_point(win_emu.clock(), info.Timeout); + timeout = utils::convert_delay_interval_to_time_point(win_emu.clock(), info.Timeout, + {.QuadPart = std::numeric_limits::max()}); } this->delay_ioctrl(c, {}, timeout, timeout_callback); diff --git a/src/windows-emulator/emulator_thread.hpp b/src/windows-emulator/emulator_thread.hpp index 3ce60a9d..b5107049 100644 --- a/src/windows-emulator/emulator_thread.hpp +++ b/src/windows-emulator/emulator_thread.hpp @@ -109,7 +109,8 @@ class emulator_thread : public ref_counted_object bool is_await_time_over(utils::clock& clock) const { - return this->await_time.has_value() && this->await_time.value() < clock.steady_now(); + constexpr auto infinite = std::chrono::steady_clock::time_point::min(); + return this->await_time.has_value() && this->await_time.value() != infinite && this->await_time.value() < clock.steady_now(); } bool is_terminated() const;