From 24647eeffca8a2baecb290eb9d9eddea37bc14c6 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 18 Oct 2022 14:52:17 +0200 Subject: [PATCH] screen_win: refactor + free loaded library in case of error + report also different errors than E_ACCESSDENIED (and print that the error was access denied if so) --- src/video_capture/screen_win.c | 37 ++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/video_capture/screen_win.c b/src/video_capture/screen_win.c index 706539676..af120cbf3 100644 --- a/src/video_capture/screen_win.c +++ b/src/video_capture/screen_win.c @@ -211,22 +211,33 @@ static bool is_library_registered() { return ret; } -static bool register_screen_cap_rec_library(struct vidcap_screen_win_state *s) { +static HMODULE register_screen_cap_rec_library() { + HMODULE screen_cap_lib = NULL; + CHECK_NOT_NULL(screen_cap_lib = LoadLibraryA("screen-capture-recorder-x64.dll"), return NULL); + func register_filter; + CHECK_NOT_NULL(register_filter = (func)(void *) GetProcAddress(screen_cap_lib, "DllRegisterServer"), FreeLibrary(screen_cap_lib); return false); + HRESULT res = register_filter(); + if (SUCCEEDED(res)) { + return screen_cap_lib; + } + FreeLibrary(screen_cap_lib); + log_msg(LOG_LEVEL_ERROR, MOD_NAME "Register failed: %s\n", hresult_to_str(res)); + if (res == E_ACCESSDENIED) { + log_msg(LOG_LEVEL_NOTICE, "Cannot register DLL (access denied), please install the filter from:\n\n" + " https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases\n"); + } else { + log_msg(LOG_LEVEL_ERROR, MOD_NAME "Register failed: %s\n", hresult_to_str(res)); + } + return NULL; +} + +static bool load_screen_cap_rec_library(struct vidcap_screen_win_state *s) { if (is_library_registered()) { log_msg(LOG_LEVEL_VERBOSE, "Using already system-registered screen-capture-recorder library.\n"); return true; } - CHECK_NOT_NULL(s->screen_cap_lib = LoadLibraryA("screen-capture-recorder-x64.dll"), return false); - func register_filter; - CHECK_NOT_NULL(register_filter = (func)(void *) GetProcAddress(s->screen_cap_lib, "DllRegisterServer"), return false); - HRESULT res = register_filter(); - if (FAILED(res)) { - log_msg(LOG_LEVEL_ERROR, MOD_NAME "Register failed: %s\n", hresult_to_str(res)); - if (res == E_ACCESSDENIED) { - log_msg(LOG_LEVEL_NOTICE, "Cannot register DLL, please install the filter from:\n\n" - " https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases\n"); - } + if ((s->screen_cap_lib = register_screen_cap_rec_library()) == NULL) { return false; } s->filter_registered = true; @@ -236,7 +247,7 @@ static bool register_screen_cap_rec_library(struct vidcap_screen_win_state *s) { static int vidcap_screen_win_init(struct vidcap_params *params, void **state) { const char *cfg = vidcap_params_get_fmt(params); - if (cfg && strcmp(cfg, "help") == 0) { + if (strcmp(cfg, "help") == 0) { show_help(); return VIDCAP_INIT_NOERR; } @@ -247,7 +258,7 @@ static int vidcap_screen_win_init(struct vidcap_params *params, void **state) } struct vidcap_screen_win_state *s = calloc(1, sizeof *s); - if (!register_screen_cap_rec_library(s)) { + if (!load_screen_cap_rec_library(s)) { cleanup(s); return VIDCAP_INIT_FAIL; }