]> wimlib.net Git - wimlib/blobdiff - src/win32_replacements.c
integrity.c: correctly validate minimum integrity table size
[wimlib] / src / win32_replacements.c
index 89289b0e056ab708a3696bee00094073c69876db..05b07db98892e58376d75e6412253728471245f4 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2013 Eric Biggers
+ * Copyright (C) 2013-2016 Eric Biggers
  *
  * This file is free software; you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free
@@ -339,7 +339,7 @@ err:
 
 /* Use the Win32 API to get the number of processors.  */
 unsigned
-win32_get_number_of_processors(void)
+get_available_cpus(void)
 {
        SYSTEM_INFO sysinfo;
        GetSystemInfo(&sysinfo);
@@ -348,7 +348,7 @@ win32_get_number_of_processors(void)
 
 /* Use the Win32 API to get the amount of available memory.  */
 u64
-win32_get_avail_memory(void)
+get_available_memory(void)
 {
        MEMORYSTATUSEX status = {
                .dwLength = sizeof(status),
@@ -493,20 +493,24 @@ do_pread_or_pwrite(int fd, void *buf, size_t count, off_t offset,
        LARGE_INTEGER relative_offset;
        OVERLAPPED overlapped;
        BOOL bret;
+       DWORD err = 0;
 
        h = (HANDLE)_get_osfhandle(fd);
        if (h == INVALID_HANDLE_VALUE)
-               goto err;
+               goto error;
 
        if (GetFileType(h) == FILE_TYPE_PIPE) {
                errno = ESPIPE;
-               goto err;
+               goto error;
        }
 
        /* Get original position */
        relative_offset.QuadPart = 0;
-       if (!SetFilePointerEx(h, relative_offset, &orig_offset, FILE_CURRENT))
-               goto err_set_errno;
+       if (!SetFilePointerEx(h, relative_offset, &orig_offset, FILE_CURRENT)) {
+               err = GetLastError();
+               win32_error(err, L"Failed to get original file position");
+               goto error;
+       }
 
        memset(&overlapped, 0, sizeof(overlapped));
        overlapped.Offset = offset;
@@ -517,17 +521,26 @@ do_pread_or_pwrite(int fd, void *buf, size_t count, off_t offset,
                bret = WriteFile(h, buf, count, &bytes_read_or_written, &overlapped);
        else
                bret = ReadFile(h, buf, count, &bytes_read_or_written, &overlapped);
-       if (!bret)
-               goto err_set_errno;
+       if (!bret) {
+               err = GetLastError();
+               win32_error(err, L"Failed to %s %zu bytes at offset %"PRIu64,
+                           (is_pwrite ? "write" : "read"), count, offset);
+               goto error;
+       }
 
        /* Restore the original position */
-       if (!SetFilePointerEx(h, orig_offset, NULL, FILE_BEGIN))
-               goto err_set_errno;
+       if (!SetFilePointerEx(h, orig_offset, NULL, FILE_BEGIN)) {
+               err = GetLastError();
+               win32_error(err, L"Failed to restore file position to %"PRIu64,
+                           offset);
+               goto error;
+       }
 
        return bytes_read_or_written;
-err_set_errno:
-       set_errno_from_GetLastError();
-err:
+
+error:
+       if (err)
+               set_errno_from_win32_error(err);
        return -1;
 }