shell32: Avoid an unsafe iface to object cast in AddToEnumList().
This commit is contained in:
parent
bd407b700e
commit
28d8819b63
|
@ -286,7 +286,7 @@ static PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl)
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* ISF_ControlPanel_fnEnumObjects
|
* ISF_ControlPanel_fnEnumObjects
|
||||||
*/
|
*/
|
||||||
static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path)
|
static BOOL SHELL_RegisterCPanelApp(IEnumIDListImpl *list, LPCSTR path)
|
||||||
{
|
{
|
||||||
LPITEMIDLIST pidl;
|
LPITEMIDLIST pidl;
|
||||||
CPlApplet* applet;
|
CPlApplet* applet;
|
||||||
|
@ -329,7 +329,7 @@ static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath)
|
static int SHELL_RegisterRegistryCPanelApps(IEnumIDListImpl *list, HKEY hkey_root, LPCSTR szRepPath)
|
||||||
{
|
{
|
||||||
char name[MAX_PATH];
|
char name[MAX_PATH];
|
||||||
char value[MAX_PATH];
|
char value[MAX_PATH];
|
||||||
|
@ -358,7 +358,7 @@ static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, L
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath)
|
static int SHELL_RegisterCPanelFolders(IEnumIDListImpl *list, HKEY hkey_root, LPCSTR szRepPath)
|
||||||
{
|
{
|
||||||
char name[MAX_PATH];
|
char name[MAX_PATH];
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
|
@ -391,19 +391,18 @@ static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* CreateCPanelEnumList()
|
* CreateCPanelEnumList()
|
||||||
*/
|
*/
|
||||||
static BOOL CreateCPanelEnumList(
|
static BOOL CreateCPanelEnumList(IEnumIDListImpl *list, DWORD dwFlags)
|
||||||
IEnumIDList * iface,
|
|
||||||
DWORD dwFlags)
|
|
||||||
{
|
{
|
||||||
CHAR szPath[MAX_PATH];
|
CHAR szPath[MAX_PATH];
|
||||||
WIN32_FIND_DATAA wfd;
|
WIN32_FIND_DATAA wfd;
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
|
|
||||||
TRACE("(%p)->(flags=0x%08x)\n", iface, dwFlags);
|
TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags);
|
||||||
|
|
||||||
/* enumerate control panel folders */
|
/* enumerate control panel folders */
|
||||||
if (dwFlags & SHCONTF_FOLDERS)
|
if (dwFlags & SHCONTF_FOLDERS)
|
||||||
SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
|
SHELL_RegisterCPanelFolders(list, HKEY_LOCAL_MACHINE,
|
||||||
|
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
|
||||||
|
|
||||||
/* enumerate the control panel applets */
|
/* enumerate the control panel applets */
|
||||||
if (dwFlags & SHCONTF_NONFOLDERS)
|
if (dwFlags & SHCONTF_NONFOLDERS)
|
||||||
|
@ -414,7 +413,7 @@ static BOOL CreateCPanelEnumList(
|
||||||
p = PathAddBackslashA(szPath);
|
p = PathAddBackslashA(szPath);
|
||||||
strcpy(p, "*.cpl");
|
strcpy(p, "*.cpl");
|
||||||
|
|
||||||
TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",iface,debugstr_a(szPath));
|
TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n", list, debugstr_a(szPath));
|
||||||
hFile = FindFirstFileA(szPath, &wfd);
|
hFile = FindFirstFileA(szPath, &wfd);
|
||||||
|
|
||||||
if (hFile != INVALID_HANDLE_VALUE)
|
if (hFile != INVALID_HANDLE_VALUE)
|
||||||
|
@ -426,14 +425,16 @@ static BOOL CreateCPanelEnumList(
|
||||||
|
|
||||||
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||||
strcpy(p, wfd.cFileName);
|
strcpy(p, wfd.cFileName);
|
||||||
SHELL_RegisterCPanelApp(iface, szPath);
|
SHELL_RegisterCPanelApp(list, szPath);
|
||||||
}
|
}
|
||||||
} while(FindNextFileA(hFile, &wfd));
|
} while(FindNextFileA(hFile, &wfd));
|
||||||
FindClose(hFile);
|
FindClose(hFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
SHELL_RegisterRegistryCPanelApps(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
|
SHELL_RegisterRegistryCPanelApps(list, HKEY_LOCAL_MACHINE,
|
||||||
SHELL_RegisterRegistryCPanelApps(iface, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
|
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
|
||||||
|
SHELL_RegisterRegistryCPanelApps(list, HKEY_CURRENT_USER,
|
||||||
|
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls");
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -451,8 +452,8 @@ static HRESULT WINAPI ISF_ControlPanel_fnEnumObjects(IShellFolder2 *iface, HWND
|
||||||
|
|
||||||
if (!(list = IEnumIDList_Constructor()))
|
if (!(list = IEnumIDList_Constructor()))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
CreateCPanelEnumList(list, dwFlags);
|
||||||
*ppEnumIDList = &list->IEnumIDList_iface;
|
*ppEnumIDList = &list->IEnumIDList_iface;
|
||||||
CreateCPanelEnumList(*ppEnumIDList, dwFlags);
|
|
||||||
|
|
||||||
TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
||||||
|
|
||||||
|
|
|
@ -39,17 +39,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* AddToEnumList()
|
* AddToEnumList()
|
||||||
*/
|
*/
|
||||||
BOOL AddToEnumList(
|
BOOL AddToEnumList(IEnumIDListImpl *This, LPITEMIDLIST pidl)
|
||||||
IEnumIDList * iface,
|
|
||||||
LPITEMIDLIST pidl)
|
|
||||||
{
|
{
|
||||||
IEnumIDListImpl *This = (IEnumIDListImpl *)iface;
|
|
||||||
|
|
||||||
struct enumlist *pNew;
|
struct enumlist *pNew;
|
||||||
|
|
||||||
TRACE("(%p)->(pidl=%p)\n",This,pidl);
|
TRACE("(%p)->(pidl=%p)\n",This,pidl);
|
||||||
|
|
||||||
if (!iface || !pidl)
|
if (!This || !pidl)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
pNew = SHAlloc(sizeof(*pNew));
|
pNew = SHAlloc(sizeof(*pNew));
|
||||||
|
@ -83,10 +79,7 @@ BOOL AddToEnumList(
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* CreateFolderEnumList()
|
* CreateFolderEnumList()
|
||||||
*/
|
*/
|
||||||
BOOL CreateFolderEnumList(
|
BOOL CreateFolderEnumList(IEnumIDListImpl *list, LPCWSTR lpszPath, DWORD dwFlags)
|
||||||
IEnumIDList *list,
|
|
||||||
LPCWSTR lpszPath,
|
|
||||||
DWORD dwFlags)
|
|
||||||
{
|
{
|
||||||
LPITEMIDLIST pidl=NULL;
|
LPITEMIDLIST pidl=NULL;
|
||||||
WIN32_FIND_DATAW stffile;
|
WIN32_FIND_DATAW stffile;
|
||||||
|
|
|
@ -426,7 +426,7 @@ static HRESULT WINAPI RecycleBin_EnumObjects(IShellFolder2 *iface, HWND hwnd, SH
|
||||||
if (FAILED(ret = TRASH_EnumItems(&pidls, &pidls_count)))
|
if (FAILED(ret = TRASH_EnumItems(&pidls, &pidls_count)))
|
||||||
goto failed;
|
goto failed;
|
||||||
for (i=0; i<pidls_count; i++)
|
for (i=0; i<pidls_count; i++)
|
||||||
if (!AddToEnumList(&list->IEnumIDList_iface, pidls[i]))
|
if (!AddToEnumList(list, pidls[i]))
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,11 +223,11 @@ typedef struct
|
||||||
|
|
||||||
/* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */
|
/* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */
|
||||||
IEnumIDListImpl *IEnumIDList_Constructor(void) DECLSPEC_HIDDEN;
|
IEnumIDListImpl *IEnumIDList_Constructor(void) DECLSPEC_HIDDEN;
|
||||||
BOOL AddToEnumList(IEnumIDList *list, LPITEMIDLIST pidl) DECLSPEC_HIDDEN;
|
BOOL AddToEnumList(IEnumIDListImpl *list, LPITEMIDLIST pidl) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and
|
/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and
|
||||||
* adds them to the already-created list.
|
* adds them to the already-created list.
|
||||||
*/
|
*/
|
||||||
BOOL CreateFolderEnumList(IEnumIDList *list, LPCWSTR lpszPath, DWORD dwFlags) DECLSPEC_HIDDEN;
|
BOOL CreateFolderEnumList(IEnumIDListImpl *list, LPCWSTR lpszPath, DWORD dwFlags) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -286,7 +286,7 @@ static const WCHAR Desktop_NameSpaceW[] = { 'S','O','F','T','W','A','R','E',
|
||||||
'o','r','e','r','\\','D','e','s','k','t','o','p','\\','N','a','m','e','s','p',
|
'o','r','e','r','\\','D','e','s','k','t','o','p','\\','N','a','m','e','s','p',
|
||||||
'a','c','e','\0' };
|
'a','c','e','\0' };
|
||||||
|
|
||||||
static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags)
|
static BOOL CreateDesktopEnumList(IEnumIDListImpl *list, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
WCHAR szPath[MAX_PATH];
|
WCHAR szPath[MAX_PATH];
|
||||||
|
@ -352,8 +352,8 @@ static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface,
|
||||||
|
|
||||||
if (!(list = IEnumIDList_Constructor()))
|
if (!(list = IEnumIDList_Constructor()))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
CreateDesktopEnumList(list, dwFlags);
|
||||||
*ppEnumIDList = &list->IEnumIDList_iface;
|
*ppEnumIDList = &list->IEnumIDList_iface;
|
||||||
CreateDesktopEnumList(*ppEnumIDList, dwFlags);
|
|
||||||
|
|
||||||
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
||||||
|
|
||||||
|
|
|
@ -455,8 +455,8 @@ IShellFolder_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner,
|
||||||
|
|
||||||
if (!(list = IEnumIDList_Constructor()))
|
if (!(list = IEnumIDList_Constructor()))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
CreateFolderEnumList(list, This->sPathTarget, dwFlags);
|
||||||
*ppEnumIDList = &list->IEnumIDList_iface;
|
*ppEnumIDList = &list->IEnumIDList_iface;
|
||||||
CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags);
|
|
||||||
|
|
||||||
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
||||||
|
|
||||||
|
|
|
@ -292,7 +292,7 @@ static const WCHAR MyComputer_NameSpaceW[] = { 'S','O','F','T','W','A','R','E',
|
||||||
'o','r','e','r','\\','M','y','C','o','m','p','u','t','e','r','\\','N','a','m',
|
'o','r','e','r','\\','M','y','C','o','m','p','u','t','e','r','\\','N','a','m',
|
||||||
'e','s','p','a','c','e','\0' };
|
'e','s','p','a','c','e','\0' };
|
||||||
|
|
||||||
static BOOL CreateMyCompEnumList(IEnumIDList *list, DWORD dwFlags)
|
static BOOL CreateMyCompEnumList(IEnumIDListImpl *list, DWORD dwFlags)
|
||||||
{
|
{
|
||||||
BOOL ret = TRUE;
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
@ -362,8 +362,8 @@ static HRESULT WINAPI ISF_MyComputer_fnEnumObjects (IShellFolder2 *iface,
|
||||||
|
|
||||||
if (!(list = IEnumIDList_Constructor()))
|
if (!(list = IEnumIDList_Constructor()))
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
CreateMyCompEnumList(list, dwFlags);
|
||||||
*ppEnumIDList = &list->IEnumIDList_iface;
|
*ppEnumIDList = &list->IEnumIDList_iface;
|
||||||
CreateMyCompEnumList(*ppEnumIDList, dwFlags);
|
|
||||||
|
|
||||||
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue