From 9276b3f1bf1e34606eaa968efea705d6fc7fa452 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sun, 5 Sep 2021 21:07:30 +0200 Subject: [PATCH] [SHELL32] CFSFolder: Add fallback for failing shell extension CORE-17673 --- dll/win32/shell32/folders/CFSFolder.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp index efdd2386d4b..f44a71f6b33 100644 --- a/dll/win32/shell32/folders/CFSFolder.cpp +++ b/dll/win32/shell32/folders/CFSFolder.cpp @@ -883,10 +883,26 @@ HRESULT WINAPI CFSFolder::BindToObject( CLSID clsidFolder; if (_ILIsFolder(pidl)) { - clsidFolder = CLSID_ShellFSFolder; - if ((pData->uFileAttribs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0) - SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder); + { + hr = SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder); + + if (SUCCEEDED(hr)) + { + /* We got a GUID from a desktop.ini, let's try it */ + hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut); + if (SUCCEEDED(hr)) + { + TRACE("-- returning (%p) %08x, (%s)\n", *ppvOut, hr, wine_dbgstr_guid(&clsidFolder)); + return hr; + } + + /* Something went wrong, re-try it with a normal ShellFSFolder */ + ERR("CFSFolder::BindToObject: %s failed to bind, using fallback (0x%08x)\n", wine_dbgstr_guid(&clsidFolder), hr); + } + } + /* No system folder or the custom class failed */ + clsidFolder = CLSID_ShellFSFolder; } else {