[NTOBJSHEX]

* Make the info struct pointers const, to ensure we are not modifying the contents from the const idlists.
* Disable checking that the provided PIDL is part of the folder. Fixes enumeration in ros, but feels a lot like hiding a bug.
CORE-9432 #resolve

svn path=/trunk/; revision=67166
This commit is contained in:
David Quintana
2015-04-12 01:34:53 +00:00
parent 36d7fc27d1
commit 0e0c90edbb
3 changed files with 78 additions and 31 deletions
+38 -17
View File
@@ -199,7 +199,7 @@ public:
return S_OK;
}
HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, NtPidlEntry ** pinfo)
HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, const NtPidlEntry ** pinfo)
{
HRESULT hr;
@@ -326,7 +326,7 @@ public:
return S_OK;
}
static LPITEMIDLIST CreatePidlFromItem(NtPidlEntry * entry)
static LPITEMIDLIST CreatePidlFromItem(const NtPidlEntry * entry)
{
LPITEMIDLIST idl = (LPITEMIDLIST) CoTaskMemAlloc(entry->cb + 2);
if (!idl)
@@ -336,7 +336,7 @@ public:
return idl;
}
static HRESULT CompareIDs(LPARAM lParam, NtPidlEntry * first, NtPidlEntry * second)
static HRESULT CompareIDs(LPARAM lParam, const NtPidlEntry * first, const NtPidlEntry * second)
{
if ((lParam & 0xFFFF0000) == SHCIDS_ALLFIELDS)
{
@@ -431,7 +431,7 @@ public:
return E_INVALIDARG;
}
static HRESULT CompareIDs(LPARAM lParam, NtPidlEntry * first, LPCITEMIDLIST pcidl)
static HRESULT CompareIDs(LPARAM lParam, const NtPidlEntry * first, LPCITEMIDLIST pcidl)
{
LPCITEMIDLIST p = pcidl;
NtPidlEntry * second = (NtPidlEntry*) &(p->mkid);
@@ -451,7 +451,7 @@ public:
return CompareIDs(lParam, first, pcidl2);
}
static ULONG ConvertAttributes(NtPidlEntry * entry, PULONG inMask)
static ULONG ConvertAttributes(const NtPidlEntry * entry, PULONG inMask)
{
ULONG mask = inMask ? *inMask : 0xFFFFFFFF;
ULONG flags = SFGAO_HASPROPSHEET | SFGAO_CANLINK;
@@ -470,7 +470,7 @@ public:
BOOL IsFolder(LPCITEMIDLIST pcidl)
{
NtPidlEntry * entry;
const NtPidlEntry * entry;
HRESULT hr = FindPidlInList(pcidl, &entry);
if (FAILED_UNEXPECTEDLY(hr))
return FALSE;
@@ -668,7 +668,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::BindToObject(
REFIID riid,
void **ppvOut)
{
NtPidlEntry * info;
const NtPidlEntry * info;
HRESULT hr;
if (IsEqualIID(riid, IID_IShellFolder))
@@ -816,8 +816,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetAttributesOf(
PCUITEMID_CHILD_ARRAY apidl,
SFGAOF *rgfInOut)
{
NtPidlEntry * info;
HRESULT hr;
const NtPidlEntry * info;
TRACE("GetAttributesOf\n");
@@ -831,9 +830,15 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetAttributesOf(
{
PCUITEMID_CHILD pidl = apidl[i];
hr = m_PidlManager->FindPidlInList(pidl, &info);
#ifndef DISABLE_STRICT_PIDL_CHECK
HRESULT hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const NtPidlEntry *) pidl;
if (info->magic != NT_OBJECT_PIDL_MAGIC)
return E_INVALIDARG;
#endif
// Update attributes.
*rgfInOut = m_PidlManager->ConvertAttributes(info, rgfInOut);
@@ -912,14 +917,20 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDisplayNameOf(
SHGDNF uFlags,
STRRET *lpName)
{
NtPidlEntry * info;
const NtPidlEntry * info;
HRESULT hr;
TRACE("GetDisplayNameOf %p\n", pidl);
#ifndef DISABLE_STRICT_PIDL_CHECK
hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const NtPidlEntry *) pidl;
if (info->magic != NT_OBJECT_PIDL_MAGIC)
return E_INVALIDARG;
#endif
if ((GET_SHGDN_RELATION(uFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR(uFlags) & SHGDN_FORPARSING))
@@ -1085,16 +1096,21 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDetailsEx(
const SHCOLUMNID *pscid,
VARIANT *pv)
{
NtPidlEntry * info;
HRESULT hr;
const NtPidlEntry * info;
TRACE("GetDetailsEx\n");
if (pidl)
{
hr = m_PidlManager->FindPidlInList(pidl, &info);
#ifndef DISABLE_STRICT_PIDL_CHECK
HRESULT hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const NtPidlEntry *) pidl;
if (info->magic != NT_OBJECT_PIDL_MAGIC)
return E_INVALIDARG;
#endif
static const GUID storage = PSGUID_STORAGE;
if (IsEqualGUID(pscid->fmtid, storage))
@@ -1163,16 +1179,21 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDetailsOf(
UINT iColumn,
SHELLDETAILS *psd)
{
NtPidlEntry * info;
HRESULT hr;
const NtPidlEntry * info;
TRACE("GetDetailsOf\n");
if (pidl)
{
hr = m_PidlManager->FindPidlInList(pidl, &info);
#ifndef DISABLE_STRICT_PIDL_CHECK
HRESULT hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const NtPidlEntry *) pidl;
if (info->magic != NT_OBJECT_PIDL_MAGIC)
return E_INVALIDARG;
#endif
switch (iColumn)
{
+3
View File
@@ -48,3 +48,6 @@ DEFINE_GUID(CLSID_NtObjectFolder,
#include "ntobjns.h"
#include "regfolder.h"
// Workaround for missing entries
#define DISABLE_STRICT_PIDL_CHECKS
+37 -14
View File
@@ -194,7 +194,7 @@ public:
return S_OK;
}
HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, RegPidlEntry ** pinfo)
HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, const RegPidlEntry ** pinfo)
{
HRESULT hr;
@@ -323,7 +323,7 @@ public:
}
static LPITEMIDLIST CreatePidlFromItem(RegPidlEntry * entry)
static LPITEMIDLIST CreatePidlFromItem(const RegPidlEntry * entry)
{
LPITEMIDLIST idl = (LPITEMIDLIST) CoTaskMemAlloc(entry->cb + 2);
if (!idl)
@@ -333,7 +333,7 @@ public:
return idl;
}
static HRESULT CompareIDs(LPARAM lParam, RegPidlEntry * first, RegPidlEntry * second)
static HRESULT CompareIDs(LPARAM lParam, const RegPidlEntry * first, const RegPidlEntry * second)
{
if ((lParam & 0xFFFF0000) == SHCIDS_ALLFIELDS)
{
@@ -418,7 +418,7 @@ public:
return E_INVALIDARG;
}
static HRESULT CompareIDs(LPARAM lParam, RegPidlEntry * first, LPCITEMIDLIST pcidl)
static HRESULT CompareIDs(LPARAM lParam, const RegPidlEntry * first, LPCITEMIDLIST pcidl)
{
LPCITEMIDLIST p = pcidl;
RegPidlEntry * second = (RegPidlEntry*) &(p->mkid);
@@ -438,7 +438,7 @@ public:
return CompareIDs(lParam, first, pcidl2);
}
static ULONG ConvertAttributes(RegPidlEntry * entry, PULONG inMask)
static ULONG ConvertAttributes(const RegPidlEntry * entry, PULONG inMask)
{
ULONG mask = inMask ? *inMask : 0xFFFFFFFF;
ULONG flags = 0;
@@ -452,7 +452,7 @@ public:
BOOL IsFolder(LPCITEMIDLIST pcidl)
{
RegPidlEntry * entry;
const RegPidlEntry * entry;
HRESULT hr = FindPidlInList(pcidl, &entry);
if (FAILED_UNEXPECTEDLY(hr))
return FALSE;
@@ -512,7 +512,7 @@ public:
}
}
HRESULT FormatContentsForDisplay(RegPidlEntry * info, PCWSTR * strContents)
HRESULT FormatContentsForDisplay(const RegPidlEntry * info, PCWSTR * strContents)
{
PVOID td = (((PBYTE) info) + FIELD_OFFSET(RegPidlEntry, entryName) + info->entryNameLength + sizeof(WCHAR));
@@ -752,7 +752,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::BindToObject(
REFIID riid,
void **ppvOut)
{
RegPidlEntry * info;
const RegPidlEntry * info;
HRESULT hr;
if (IsEqualIID(riid, IID_IShellFolder))
@@ -866,8 +866,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetAttributesOf(
PCUITEMID_CHILD_ARRAY apidl,
SFGAOF *rgfInOut)
{
RegPidlEntry * info;
HRESULT hr;
const RegPidlEntry * info;
TRACE("GetAttributesOf\n");
@@ -881,9 +880,15 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetAttributesOf(
{
PCUITEMID_CHILD pidl = apidl[i];
hr = m_PidlManager->FindPidlInList(pidl, &info);
#ifndef DISABLE_STRICT_PIDL_CHECK
HRESULT hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const RegPidlEntry *) pidl;
if (info->magic != REGISTRY_PIDL_MAGIC)
return E_INVALIDARG;
#endif
// Update attributes.
*rgfInOut = m_PidlManager->ConvertAttributes(info, rgfInOut);
@@ -962,14 +967,20 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDisplayNameOf(
SHGDNF uFlags,
STRRET *lpName)
{
RegPidlEntry * info;
const RegPidlEntry * info;
HRESULT hr;
TRACE("GetDisplayNameOf %p\n", pidl);
#ifndef DISABLE_STRICT_PIDL_CHECK
hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const RegPidlEntry *) pidl;
if (info->magic != REGISTRY_PIDL_MAGIC)
return E_INVALIDARG;
#endif
if ((GET_SHGDN_RELATION(uFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR(uFlags) & SHGDN_FORPARSING))
@@ -1134,16 +1145,22 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsEx(
const SHCOLUMNID *pscid,
VARIANT *pv)
{
RegPidlEntry * info;
const RegPidlEntry * info;
HRESULT hr;
TRACE("GetDetailsEx\n");
if (pidl)
{
#ifndef DISABLE_STRICT_PIDL_CHECK
hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const RegPidlEntry *) pidl;
if (info->magic != REGISTRY_PIDL_MAGIC)
return E_INVALIDARG;
#endif
static const GUID storage = PSGUID_STORAGE;
if (IsEqualGUID(pscid->fmtid, storage))
@@ -1208,16 +1225,22 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsOf(
UINT iColumn,
SHELLDETAILS *psd)
{
RegPidlEntry * info;
const RegPidlEntry * info;
HRESULT hr;
TRACE("GetDetailsOf\n");
if (pidl)
{
#ifndef DISABLE_STRICT_PIDL_CHECK
hr = m_PidlManager->FindPidlInList(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
#else
info = (const RegPidlEntry *) pidl;
if (info->magic != REGISTRY_PIDL_MAGIC)
return E_INVALIDARG;
#endif
switch (iColumn)
{