From d2bbd7a531567fe9c41a56e5ab3b6255e771a5aa Mon Sep 17 00:00:00 2001 From: nanahi <130121847+na-na-hi@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:50:39 -0500 Subject: [PATCH] win32: implement shell link target resolving Adds a function to resolve the target of a shell link (Windows shortcut) for use by other parts of mpv. --- osdep/windows_utils.c | 22 ++++++++++++++++++++++ osdep/windows_utils.h | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/osdep/windows_utils.c b/osdep/windows_utils.c index 8cedf939e2..91eef62cb8 100644 --- a/osdep/windows_utils.c +++ b/osdep/windows_utils.c @@ -24,9 +24,12 @@ #include #include #include +#include +#include #include "common/common.h" #include "windows_utils.h" +#include "mpv_talloc.h" char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid) { @@ -227,3 +230,22 @@ error: *server = *client = INVALID_HANDLE_VALUE; return false; } + +wchar_t *mp_w32_get_shell_link_target(wchar_t *path) +{ + IShellLink *psl = NULL; + IPersistFile *ppf = NULL; + wchar_t *buf = talloc_array(NULL, wchar_t, MAX_PATH + 1); + + if (FAILED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void**)&psl)) || + FAILED(IShellLinkW_QueryInterface(psl, &IID_IPersistFile, (void**)&ppf)) || + FAILED(IPersistFile_Load(ppf, path, STGM_READ)) || + FAILED(IShellLinkW_GetPath(psl, buf, MAX_PATH, NULL, 0))) + { + TA_FREEP(&buf); + } + + SAFE_RELEASE(psl); + SAFE_RELEASE(ppf); + return buf; +} diff --git a/osdep/windows_utils.h b/osdep/windows_utils.h index a8a5e947b8..c3fc72aefe 100644 --- a/osdep/windows_utils.h +++ b/osdep/windows_utils.h @@ -46,4 +46,8 @@ struct w32_create_anon_pipe_opts { bool mp_w32_create_anon_pipe(HANDLE *server, HANDLE *client, struct w32_create_anon_pipe_opts *opts); +// Returns the target of the shell link in talloc memory if the path is a +// resolvable shell link, otherwise returns NULL. +wchar_t *mp_w32_get_shell_link_target(wchar_t *path); + #endif