From 66368debf82152ce5f12e61480e9f702c331e4e1 Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 15 Jul 2021 20:39:50 +0300 Subject: [PATCH] Win32 FS: Implement support for large reads/writes --- Utilities/File.cpp | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/Utilities/File.cpp b/Utilities/File.cpp index 9eea88c43e..5dd2357f57 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -1154,24 +1154,50 @@ fs::file::file(const std::string& path, bs_t mode) u64 read(void* buffer, u64 count) override { - // TODO (call ReadFile multiple times if count is too big) - const int size = narrow(count); + u64 nread_sum = 0; - DWORD nread; - ensure(ReadFile(m_handle, buffer, size, &nread, nullptr)); // "file::read" + for (char* data = static_cast(buffer); count;) + { + const DWORD size = static_cast(std::min(count, DWORD{umax} & -4096)); - return nread; + DWORD nread = 0; + ensure(ReadFile(m_handle, data, size, &nread, nullptr)); // "file::read" + nread_sum += nread; + + if (nread < size) + { + break; + } + + count -= size; + data += size; + } + + return nread_sum; } u64 write(const void* buffer, u64 count) override { - // TODO (call WriteFile multiple times if count is too big) - const int size = narrow(count); + u64 nwritten_sum = 0; - DWORD nwritten; - ensure(WriteFile(m_handle, buffer, size, &nwritten, nullptr)); // "file::write" + for (const char* data = static_cast(buffer); count;) + { + const DWORD size = static_cast(std::min(count, DWORD{umax} & -4096)); - return nwritten; + DWORD nwritten = 0; + ensure(WriteFile(m_handle, data, size, &nwritten, nullptr)); // "file::write" + nwritten_sum += nwritten; + + if (nwritten < size) + { + break; + } + + count -= size; + data += size; + } + + return nwritten_sum; } u64 seek(s64 offset, seek_mode whence) override