From 21d70fa2074e913b44a1e9969ed94203c616f4ae Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sun, 15 Jan 2017 09:12:39 -0800 Subject: [PATCH] win-capture: Don't use FindWindow for game capture keepalive Using and creating a window can use issues in game capture if multiple game captures are active, so revert back to using a mutex, and just ignore the keepalive check failure if injected inside a UWP program (only check to see if GetLastError reports that it's not found -- if it returns access denied or any other error, assume it's in a UWP program, and ignore the keepalive check). --- plugins/win-capture/game-capture.c | 82 ++----------------- .../win-capture/graphics-hook/graphics-hook.h | 8 +- 2 files changed, 15 insertions(+), 75 deletions(-) diff --git a/plugins/win-capture/game-capture.c b/plugins/win-capture/game-capture.c index 224959a2a..d2269ebd8 100644 --- a/plugins/win-capture/game-capture.c +++ b/plugins/win-capture/game-capture.c @@ -136,8 +136,7 @@ struct game_capture { ipc_pipe_server_t pipe; gs_texture_t *texture; struct hook_info *global_hook_info; - HANDLE keepalive_thread; - DWORD keepalive_thread_id; + HANDLE keepalive_mutex; HANDLE hook_init; HANDLE hook_restart; HANDLE hook_stop; @@ -281,12 +280,6 @@ static void stop_capture(struct game_capture *gc) gc->data = NULL; } - if (gc->keepalive_thread) { - PostThreadMessage(gc->keepalive_thread_id, WM_QUIT, 0, 0); - WaitForSingleObject(gc->keepalive_thread, 300); - close_handle(&gc->keepalive_thread); - } - if (gc->app_sid) { LocalFree(gc->app_sid); gc->app_sid = NULL; @@ -298,6 +291,7 @@ static void stop_capture(struct game_capture *gc) close_handle(&gc->hook_exit); close_handle(&gc->hook_init); close_handle(&gc->hook_data_map); + close_handle(&gc->keepalive_mutex); close_handle(&gc->global_hook_info_map); close_handle(&gc->target_process); close_handle(&gc->texture_mutexes[0]); @@ -641,78 +635,18 @@ static inline bool open_target_process(struct game_capture *gc) return true; } -struct keepalive_data { - struct game_capture *gc; - HANDLE initialized; -}; - -#define DEF_FLAGS (WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS) - -static DWORD WINAPI keepalive_window_thread(struct keepalive_data *data) -{ - HANDLE initialized = data->initialized; - struct game_capture *gc = data->gc; - wchar_t new_name[64]; - WNDCLASSW wc; - HWND window; - MSG msg; - - _snwprintf(new_name, sizeof(new_name), L"%s%lu", - WINDOW_HOOK_KEEPALIVE, gc->process_id); - - memset(&wc, 0, sizeof(wc)); - wc.style = CS_OWNDC; - wc.hInstance = GetModuleHandleW(NULL); - wc.lpfnWndProc = (WNDPROC)DefWindowProc; - wc.lpszClassName = new_name; - - if (!RegisterClass(&wc)) { - warn("Failed to create keepalive window class: %lu", - GetLastError()); - return 0; - } - - window = CreateWindowExW(0, new_name, NULL, DEF_FLAGS, 0, 0, 1, 1, - NULL, NULL, wc.hInstance, NULL); - if (!window) { - warn("Failed to create keepalive window: %lu", - GetLastError()); - return 0; - } - - SetEvent(initialized); - - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - DestroyWindow(window); - UnregisterClassW(new_name, wc.hInstance); - - return 0; -} - static inline bool init_keepalive(struct game_capture *gc) { - struct keepalive_data data; - HANDLE initialized = CreateEvent(NULL, false, false, NULL); + wchar_t new_name[64]; + _snwprintf(new_name, 64, L"%s%lu", WINDOW_HOOK_KEEPALIVE, + gc->process_id); - data.gc = gc; - data.initialized = initialized; - - gc->keepalive_thread = CreateThread(NULL, 0, - (LPTHREAD_START_ROUTINE)keepalive_window_thread, - &data, 0, &gc->keepalive_thread_id); - if (!gc->keepalive_thread) { - warn("Failed to create keepalive window thread: %lu", - GetLastError()); + gc->keepalive_mutex = CreateMutexW(NULL, false, new_name); + if (!gc->keepalive_mutex) { + warn("Failed to create keepalive mutex: %lu", GetLastError()); return false; } - WaitForSingleObject(initialized, INFINITE); - CloseHandle(initialized); - return true; } diff --git a/plugins/win-capture/graphics-hook/graphics-hook.h b/plugins/win-capture/graphics-hook/graphics-hook.h index 8baa76249..e83b39239 100644 --- a/plugins/win-capture/graphics-hook/graphics-hook.h +++ b/plugins/win-capture/graphics-hook/graphics-hook.h @@ -143,7 +143,13 @@ static inline HMODULE load_system_library(const char *name) static inline bool capture_alive(void) { - return !!FindWindowW(keepalive_name, NULL); + HANDLE handle = OpenMutexW(SYNCHRONIZE, false, keepalive_name); + CloseHandle(handle); + + if (handle) + return true; + + return GetLastError() != ERROR_FILE_NOT_FOUND; } static inline bool capture_active(void)