Kaynağa Gözat

AK: Add Error::from_windows_error(void)

Also slightly improve Error::from_windows_error(int)
stasoid 8 ay önce
ebeveyn
işleme
5db1a40158

+ 29 - 20
AK/Error.cpp

@@ -10,6 +10,7 @@
 #ifdef AK_OS_WINDOWS
 #    include <AK/ByteString.h>
 #    include <AK/HashMap.h>
+#    include <stdio.h>
 #    include <windows.h>
 #endif
 
@@ -21,31 +22,39 @@ Error Error::from_string_view_or_print_error_and_return_errno(StringView string_
 }
 
 #ifdef AK_OS_WINDOWS
-Error Error::from_windows_error(DWORD code)
+Error Error::from_windows_error(int code)
 {
-    static HashMap<DWORD, ByteString> windows_errors;
+    static HashMap<int, ByteString> windows_errors;
 
     auto string = windows_errors.get(code);
-    if (string.has_value()) {
+    if (string.has_value())
         return Error::from_string_view(string->view());
-    } else {
-        char* message = nullptr;
-        auto size = FormatMessageA(
-            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-            nullptr,
-            code,
-            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-            (LPSTR)&message,
-            0,
-            nullptr);
-
-        if (size == 0)
-            return Error::from_string_view_or_print_error_and_return_errno("Unknown error"sv, code);
-
-        windows_errors.set(code, { message, size });
-        LocalFree(message);
-        return from_windows_error(code);
+
+    char* message = 0;
+    auto size = FormatMessage(
+        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+        NULL,
+        code,
+        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+        (LPSTR)&message,
+        0,
+        NULL);
+
+    if (size == 0) {
+        static char buffer[128];
+        snprintf(buffer, _countof(buffer), "Error 0x%08lX while getting text of error 0x%08X", GetLastError(), code);
+        return Error::from_string_view({ buffer, _countof(buffer) });
     }
+
+    windows_errors.set(code, { message, size });
+    LocalFree(message);
+    return from_windows_error(code);
+}
+
+// This can be used both for generic Windows errors and for winsock errors because WSAGetLastError is forwarded to GetLastError.
+Error Error::from_windows_error()
+{
+    return from_windows_error(GetLastError());
 }
 #endif
 

+ 2 - 6
AK/Error.h

@@ -7,13 +7,8 @@
 #pragma once
 
 #include <AK/StringView.h>
-#include <AK/Try.h>
 #include <AK/Variant.h>
 #include <errno.h>
-#include <string.h>
-#ifdef AK_OS_WINDOWS
-typedef unsigned long DWORD;
-#endif
 
 namespace AK {
 
@@ -29,7 +24,8 @@ public:
     }
 
 #ifdef AK_OS_WINDOWS
-    static Error from_windows_error(DWORD code);
+    static Error from_windows_error(int code);
+    static Error from_windows_error();
 #endif
 
     // NOTE: For calling this method from within kernel code, we will simply print

+ 2 - 2
Libraries/LibCore/AnonymousBufferWindows.cpp

@@ -30,7 +30,7 @@ ErrorOr<NonnullRefPtr<AnonymousBufferImpl>> AnonymousBufferImpl::create(size_t s
 {
     HANDLE map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, size >> 31 >> 1, size & 0xFFFFFFFF, NULL);
     if (!map_handle)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     return create((int)(intptr_t)map_handle, size);
 }
@@ -39,7 +39,7 @@ ErrorOr<NonnullRefPtr<AnonymousBufferImpl>> AnonymousBufferImpl::create(int fd,
 {
     void* ptr = MapViewOfFile((HANDLE)(intptr_t)fd, FILE_MAP_ALL_ACCESS, 0, 0, size);
     if (!ptr)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousBufferImpl(fd, size, ptr));
 }

+ 4 - 4
Libraries/LibCore/ProcessWindows.cpp

@@ -71,7 +71,7 @@ ErrorOr<Process> Process::spawn(ProcessSpawnOptions const& options)
         &process_info);
 
     if (!result)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     CloseHandle(process_info.hThread);
 
@@ -108,7 +108,7 @@ ErrorOr<String> Process::get_name()
 
     DWORD length = GetModuleFileNameW(NULL, path, MAX_PATH);
     if (!length)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     return String::from_utf16(Utf16View { { (u16*)path, length } });
 }
@@ -150,11 +150,11 @@ ErrorOr<int> Process::wait_for_termination()
 {
     auto result = WaitForSingleObject(m_handle, INFINITE);
     if (result == WAIT_FAILED)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     DWORD exit_code = 0;
     if (!GetExitCodeProcess(m_handle, &exit_code))
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
 
     return exit_code;
 }

+ 2 - 2
Libraries/LibCore/SystemWindows.cpp

@@ -30,7 +30,7 @@ ErrorOr<int> open(StringView path, int options, mode_t mode)
         if (::stat(sz_path, &st) == 0 && (st.st_mode & S_IFDIR)) {
             HANDLE dir_handle = CreateFile(sz_path, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
             if (dir_handle == INVALID_HANDLE_VALUE)
-                return Error::from_windows_error(GetLastError());
+                return Error::from_windows_error();
             int dir_fd = _open_osfhandle((intptr_t)dir_handle, 0);
             if (dir_fd != -1)
                 return dir_fd;
@@ -84,7 +84,7 @@ ErrorOr<void> ftruncate(int fd, off_t length)
         return result.release_error();
 
     if (SetEndOfFile((HANDLE)_get_osfhandle(fd)) == 0)
-        return Error::from_windows_error(GetLastError());
+        return Error::from_windows_error();
     return {};
 }