https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f335322ace05590c3edc7…
commit f335322ace05590c3edc74de58f90ee070307c5a
Author: Whindmar Saksit <whindsaks(a)proton.me>
AuthorDate: Fri Jan 31 21:15:13 2025 +0100
Commit: GitHub <noreply(a)github.com>
CommitDate: Fri Jan 31 21:15:13 2025 +0100
[SHELL32] SEE_MASK_IDLIST should not assume the PIDL is always a FS path (#7693)
CORE-16898 CORE-14177
---
dll/win32/shell32/shlexec.cpp | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/dll/win32/shell32/shlexec.cpp b/dll/win32/shell32/shlexec.cpp
index 371f6ad44eb..9e3af71a27f 100644
--- a/dll/win32/shell32/shlexec.cpp
+++ b/dll/win32/shell32/shlexec.cpp
@@ -2076,10 +2076,10 @@ static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei,
SHELL_ExecuteW32 execfunc)
if (sei_tmp.fMask & SEE_MASK_IDLIST &&
(sei_tmp.fMask & SEE_MASK_INVOKEIDLIST) != SEE_MASK_INVOKEIDLIST)
{
- CComPtr<IShellExecuteHookW> pSEH;
-
- HRESULT hr = SHBindToParent((LPCITEMIDLIST)sei_tmp.lpIDList,
IID_PPV_ARG(IShellExecuteHookW, &pSEH), NULL);
+ LPCITEMIDLIST pidl = (LPCITEMIDLIST)sei_tmp.lpIDList;
+ CComPtr<IShellExecuteHookW> pSEH;
+ HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellExecuteHookW, &pSEH),
NULL);
if (SUCCEEDED(hr))
{
hr = pSEH->Execute(&sei_tmp);
@@ -2087,7 +2087,14 @@ static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32
execfunc)
return TRUE;
}
- SHGetPathFromIDListW((LPCITEMIDLIST)sei_tmp.lpIDList, wszApplicationName);
+ hr = SHGetNameAndFlagsW(pidl, SHGDN_FORPARSING, wszApplicationName,
dwApplicationNameLen, NULL);
+ if (FAILED(hr))
+ {
+ if (dwApplicationNameLen)
+ *wszApplicationName = UNICODE_NULL;
+ if (!_ILIsDesktop(pidl))
+ TRACE("Unable to get PIDL parsing path\n");
+ }
appKnownSingular = TRUE;
TRACE("-- idlist=%p (%s)\n", sei_tmp.lpIDList,
debugstr_w(wszApplicationName));
}