LPSTR pstr;
LPSTR end = pszPath + uOutSize;
- if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
+ /* If the item ID list begins at "My Computer", we can use
+ an optimized loop to retrieve file system paths. */
+ if (_ILIsMyComputer(pidl)) {
LPCITEMIDLIST p = ILGetNext(pidl);
LPSTR txt;
pstr = pszPath;
- end = pszPath + MAX_PATH;
while(p && p->mkid.cb && pstr<end) {
if (_ILIsSpecialFolder(p))
- break;
+ return E_INVALIDARG;
txt = _ILGetTextPointer(p);
if (!txt)
pstr = pszPath;
- hr = SHGetDesktopFolder(&desktop);
+ /* The only other valid case is a simple PIDL rooted at desktop level */
+ if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
+ hr = SHGetDesktopFolder(&desktop);
- if (SUCCEEDED(hr)) {
- if (_ILIsValue(pidl)) {
+ if (SUCCEEDED(hr)) {
hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
if (SUCCEEDED(hr)) {
pstr = PathAddBackslashA(pszPath);
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
}
- }
- else
- hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
- IShellFolder_Release(desktop);
- }
+ IShellFolder_Release(desktop);
+ }
+ } else
+ return E_INVALIDARG;
- if (SUCCEEDED(hr)) {
+ if (SUCCEEDED(hr))
hr = StrRetToStrNA(pstr, end-pstr, &str, pidl);
- /* don't allow to return displaynames of the form "::{guid}" */
- if (pstr[0]==':' && pstr[1]==':') {
- *pszPath = '\0';
- hr = E_FAIL;
- }
- }
-
TRACE_(shell)("-- %s, 0x%08lx\n",pszPath, hr);
return hr;
}
LPWSTR pstr;
LPWSTR end = pszPath + uOutSize;
- if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
+ /* If the item ID list begins at "My Computer", we can use
+ an optimized loop to retrieve file system paths. */
+ if (_ILIsMyComputer(pidl)) {
LPCITEMIDLIST p = ILGetNext(pidl);
LPSTR txt;
while(p && p->mkid.cb && pstr<end) {
if (_ILIsSpecialFolder(p))
- break;
+ return E_INVALIDARG;
txt = _ILGetTextPointer(p);
if (!txt)
pstr = pszPath;
- hr = SHGetDesktopFolder(&desktop);
+ /* The only other valid case is a simple PIDL rooted at desktop level */
+ if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
+ hr = SHGetDesktopFolder(&desktop);
- if (SUCCEEDED(hr)) {
- if (_ILIsValue(pidl)) {
+ if (SUCCEEDED(hr)) {
hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
if (SUCCEEDED(hr)) {
pstr = PathAddBackslashW(pszPath);
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
}
- }
- else
- hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
- IShellFolder_Release(desktop);
- }
+ IShellFolder_Release(desktop);
+ }
+ } else
+ return E_INVALIDARG;
- if (SUCCEEDED(hr)) {
+ if (SUCCEEDED(hr))
hr = StrRetToStrNW(pstr, end-pstr, &str, pidl);
- /* don't allow to return displaynames of the form "::{guid}" */
- if (pstr[0]==':' && pstr[1]==':') {
- *pszPath = '\0';
- hr = E_FAIL;
- }
- }
-
TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
return hr;
}
static ICOM_VTABLE(IShellExecuteHookA) vt_ShellExecuteHookA;
#define _IPersistFolder2_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblPersistFolder2)))
-#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This =(class*)(((char*)name)-_IPersistFolder2_Offset);
+#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset);
#define IShellExecuteHookW_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookW)))
-#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookW_Offset);
+#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookW_Offset);
#define IShellExecuteHookA_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookA)))
-#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This =(class*)(((char*)name)-IShellExecuteHookA_Offset);
+#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookA_Offset);
/*
*ppvOut = NULL;
if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) {
- pObj =(LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
+ pObj = (LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) {
- pObj =(LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
+ pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IExtractIconA) &&(cidl == 1)) {
pidl = ILCombine(This->pidlRoot, apidl[0]);
- pObj =(LPUNKNOWN) IExtractIconA_Constructor(pidl);
+ pObj = (LPUNKNOWN) IExtractIconA_Constructor(pidl);
SHFree(pidl);
hr = S_OK;
} else if (IsEqualIID(riid, &IID_IExtractIconW) &&(cidl == 1)) {
pidl = ILCombine(This->pidlRoot, apidl[0]);
- pObj =(LPUNKNOWN) IExtractIconW_Constructor(pidl);
+ pObj = (LPUNKNOWN) IExtractIconW_Constructor(pidl);
SHFree(pidl);
hr = S_OK;
} else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA))