[SHELL32] Misc fixes for CFSFolder

- GetCLSIDForFileType: Check if the shell extension is blocked by the Blocked key like wine does.
- CFSFolder::BindToObject: Remove a redundant check as _ILGetFileStructW already does the same check.
- CFSFolder::GetUIObjectOf: Do not try to load an IconHandler or an arbitrary extension for directories.
- CFSFolder::SetNameOf: Simplify and make secure by using great helpers like wcscmp and PathCombineW

svn path=/trunk/; revision=75634
This commit is contained in:
Giannis Adamopoulos 2017-08-21 12:18:46 +00:00
parent af33a37eb4
commit 6bb9ea74e5

View file

@ -110,6 +110,18 @@ HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID* pcl
} }
#endif #endif
if (RegGetValueW(HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Blocked",
wszCLSIDValue,
RRF_RT_REG_SZ,
NULL,
NULL,
NULL) == ERROR_SUCCESS)
{
ERR("Extension %S not approved\n", wszCLSIDValue);
return E_ACCESSDENIED;
}
HRESULT hres = CLSIDFromString (wszCLSIDValue, pclsid); HRESULT hres = CLSIDFromString (wszCLSIDValue, pclsid);
if (FAILED_UNEXPECTEDLY(hres)) if (FAILED_UNEXPECTEDLY(hres))
return hres; return hres;
@ -683,12 +695,6 @@ HRESULT WINAPI CFSFolder::BindToObject(
return E_INVALIDARG; return E_INVALIDARG;
} }
if (!_ILIsFolder(pidl) && !_ILIsValue(pidl))
{
ERR("CFSFolder::BindToObject: Invalid pidl!\n");
return E_INVALIDARG;
}
/* Get the pidl data */ /* Get the pidl data */
FileStruct* pData = &_ILGetDataPointer(pidl)->u.file; FileStruct* pData = &_ILGetDataPointer(pidl)->u.file;
FileStructW* pDataW = _ILGetFileStructW(pidl); FileStructW* pDataW = _ILGetFileStructW(pidl);
@ -963,7 +969,7 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner,
{ {
*ppvOut = NULL; *ppvOut = NULL;
if (cidl == 1) if (cidl == 1 && _ILIsValue(apidl[0]))
{ {
hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut); hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut);
if(hr != S_FALSE) if(hr != S_FALSE)
@ -1001,7 +1007,8 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner,
} }
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1)) else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
{ {
hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj); if (_ILIsValue(apidl[0]))
hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj);
if (hr != S_OK) if (hr != S_OK)
hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj); hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
} }
@ -1162,25 +1169,25 @@ HRESULT WINAPI CFSFolder::SetNameOf(
PITEMID_CHILD *pPidlOut) PITEMID_CHILD *pPidlOut)
{ {
WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1]; WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
LPWSTR ptr;
BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl)); BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl));
TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
debugstr_w (lpName), dwFlags, pPidlOut); debugstr_w (lpName), dwFlags, pPidlOut);
FileStructW* pDataW = _ILGetFileStructW(pidl);
if (!pDataW)
{
ERR("Got garbage pidl\n");
return E_INVALIDARG;
}
/* build source path */ /* build source path */
lstrcpynW(szSrc, sPathTarget, MAX_PATH); PathCombineW(szSrc, sPathTarget, pDataW->wszName);
ptr = PathAddBackslashW (szSrc);
if (ptr)
_ILSimpleGetTextW (pidl, ptr, MAX_PATH + 1 - (ptr - szSrc));
/* build destination path */ /* build destination path */
if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER) { if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER)
lstrcpynW(szDest, sPathTarget, MAX_PATH); PathCombineW(szDest, sPathTarget, lpName);
ptr = PathAddBackslashW (szDest); else
if (ptr)
lstrcpynW(ptr, lpName, MAX_PATH + 1 - (ptr - szDest));
} else
lstrcpynW(szDest, lpName, MAX_PATH); lstrcpynW(szDest, lpName, MAX_PATH);
if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) { if(!(dwFlags & SHGDN_FORPARSING) && SHELL_FS_HideExtension(szSrc)) {
@ -1192,7 +1199,7 @@ HRESULT WINAPI CFSFolder::SetNameOf(
} }
TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest)); TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
if (!memcmp(szSrc, szDest, (wcslen(szDest) + 1) * sizeof(WCHAR))) if (!wcscmp(szSrc, szDest))
{ {
/* src and destination is the same */ /* src and destination is the same */
HRESULT hr = S_OK; HRESULT hr = S_OK;
@ -1202,7 +1209,6 @@ HRESULT WINAPI CFSFolder::SetNameOf(
return hr; return hr;
} }
if (MoveFileW (szSrc, szDest)) if (MoveFileW (szSrc, szDest))
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;