+/* Replacement for read() which doesn't hide the Win32 error code */
+ssize_t
+win32_read(int fd, void *buf, size_t count)
+{
+ HANDLE h = (HANDLE)_get_osfhandle(fd);
+ DWORD result = 0xFFFFFFFF;
+
+ if (h == INVALID_HANDLE_VALUE)
+ return -1;
+
+ count = min(count, MAX_IO_AMOUNT);
+ SetLastError(0);
+ if (!ReadFile(h, buf, count, &result, NULL)) {
+ DWORD err = GetLastError();
+ win32_error(err,
+ L"Error reading %zu bytes from fd %d", count, fd);
+ set_errno_from_win32_error(err);
+ return -1;
+ }
+
+ wimlib_assert(result <= count);
+ return result;
+}
+
+/* Replacement for write() which doesn't hide the Win32 error code */
+ssize_t
+win32_write(int fd, const void *buf, size_t count)
+{
+ HANDLE h = (HANDLE)_get_osfhandle(fd);
+ DWORD result = 0xFFFFFFFF;
+
+ if (h == INVALID_HANDLE_VALUE)
+ return -1;
+
+ count = min(count, MAX_IO_AMOUNT);
+ SetLastError(0);
+ if (!WriteFile(h, buf, count, &result, NULL)) {
+ DWORD err = GetLastError();
+ win32_error(err,
+ L"Error writing %zu bytes to fd %d", count, fd);
+ set_errno_from_win32_error(err);
+ return -1;
+ }
+
+ wimlib_assert(result <= count);
+ return result;
+}
+