-#ifdef ENABLE_ERROR_MESSAGES
-static void win32_error(DWORD err_code)
-{
- char *buffer;
- DWORD nchars;
- nchars = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- NULL, err_code, 0,
- (char*)&buffer, 0, NULL);
- if (nchars == 0) {
- ERROR("Error printing error message! "
- "Computer will self-destruct in 3 seconds.");
- } else {
- ERROR("Win32 error: %s", buffer);
- LocalFree(buffer);
- }
-}
-#else
-#define win32_error(err_code)
-#endif
-
-static HANDLE win32_open_file(const wchar_t *path)
-{
- return CreateFileW(path,
- GENERIC_READ | READ_CONTROL,
- FILE_SHARE_READ,
- NULL, /* lpSecurityAttributes */
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS |
- FILE_FLAG_OPEN_REPARSE_POINT,
- NULL /* hTemplateFile */);
-}
-
-int win32_read_file(const char *filename,
- void *handle, u64 offset, size_t size, u8 *buf)
-{
- HANDLE h = handle;
- DWORD err;
- DWORD bytesRead;
- LARGE_INTEGER liOffset = {.QuadPart = offset};
-
- wimlib_assert(size <= 0xffffffff);
-
- if (SetFilePointerEx(h, liOffset, NULL, FILE_BEGIN))
- if (ReadFile(h, buf, size, &bytesRead, NULL) && bytesRead == size)
- return 0;
- err = GetLastError();
- ERROR("Error reading \"%s\"", filename);
- win32_error(err);
- return WIMLIB_ERR_READ;
-}
-
-void win32_close_handle(void *handle)
-{
- CloseHandle((HANDLE)handle);
-}
-
-void *win32_open_handle(const char *path_utf16)
-{
- return (void*)win32_open_file((const wchar_t*)path_utf16);
-}