diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index d3d466a40a..64703e4dcb 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -143,12 +143,14 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) OSVERSIONINFOEX vi = {0}; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - server = vi.wProductType != VER_NT_WORKSTATION; - - serverR2 = GetSystemMetrics(SM_SERVERR2); - GetSystemInfo(&si); + /* Available from NT 3.5 and Win95 */ + GetVersionEx((OSVERSIONINFO*)&vi); + + server = vi.wProductType != VER_NT_WORKSTATION; + serverR2 = GetSystemMetrics(SM_SERVERR2); + switch (si.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64: @@ -166,10 +168,11 @@ static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor) #else OSVERSIONINFO vi = {0}; vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); -#endif /* Available from NT 3.5 and Win95 */ - GetVersionEx((OSVERSIONINFO*)&vi); + GetVersionEx(&vi); +#endif + if (major) *major = vi.dwMajorVersion; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index a7da756206..8a60cf2735 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -681,7 +681,7 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) strlcpy(cpu_arch_str, "x86", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_X86_64: - strlcpy(cpu_arch_str, "x86-64", sizeof(cpu_arch_str)); + strlcpy(cpu_arch_str, "x64", sizeof(cpu_arch_str)); break; case FRONTEND_ARCH_PPC: strlcpy(cpu_arch_str, "PPC", sizeof(cpu_arch_str)); diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index be8e9ee4ed..f29dd82e7f 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -60,6 +60,7 @@ const GUID GUID_NULL = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; #include "../file_path_special.h" #include "../list_special.h" #include "../verbosity.h" +#include "../retroarch.h" #include "tasks_internal.h" @@ -591,8 +592,27 @@ found: if (hDeviceHandle == INVALID_HANDLE_VALUE) { - RARCH_ERR("[Autoconf]: Can't open device: %d.", GetLastError()); - goto done; + /* Windows sometimes erroneously fails to open with a sharing violation: + * https://github.com/signal11/hidapi/issues/231 + * If this happens, trying again with read + write usually works for some reason. + */ + + /* Open the device */ + hDeviceHandle = CreateFileA( + devicePath, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + 0, /*FILE_FLAG_OVERLAPPED,*/ + NULL); + + if (hDeviceHandle == INVALID_HANDLE_VALUE) + { + RARCH_ERR("[Autoconf]: Can't open device for reading and writing: %d.", GetLastError()); + runloop_msg_queue_push("Bliss-Box already in use. Please make sure other programs are not using it.", 2, 300, false); + goto done; + } } done: