[NTOBJSHEX]

* Now that we use lazy enumeration instead of keeping a full list of all items, I was able to simplify a few things.

svn path=/trunk/; revision=68832
This commit is contained in:
David Quintana 2015-08-26 23:30:47 +00:00
parent 18183f23d3
commit 73a55f80e1
4 changed files with 39 additions and 131 deletions

View file

@ -131,28 +131,9 @@ public:
};
class CNtObjectPidlManager
class CNtObjectPidlHelper
{
private:
PWSTR m_ntPath;
public:
CNtObjectPidlManager() :
m_ntPath(NULL)
{
}
~CNtObjectPidlManager()
{
}
HRESULT Initialize(PWSTR ntPath)
{
m_ntPath = ntPath;
return S_OK;
}
static HRESULT CompareIDs(LPARAM lParam, const NtPidlEntry * first, const NtPidlEntry * second)
{
if ((lParam & 0xFFFF0000) == SHCIDS_ALLFIELDS)
@ -285,7 +266,7 @@ public:
return flags & mask;
}
BOOL IsFolder(LPCITEMIDLIST pcidl)
static BOOL IsFolder(LPCITEMIDLIST pcidl)
{
NtPidlEntry * entry = (NtPidlEntry*) &(pcidl->mkid);
if ((entry->cb < sizeof(NtPidlEntry)) || (entry->magic != NT_OBJECT_PIDL_MAGIC))
@ -296,7 +277,7 @@ public:
(entry->objectType == KEY_OBJECT);
}
HRESULT GetInfoFromPidl(LPCITEMIDLIST pcidl, const NtPidlEntry ** pentry)
static HRESULT GetInfoFromPidl(LPCITEMIDLIST pcidl, const NtPidlEntry ** pentry)
{
NtPidlEntry * entry = (NtPidlEntry*) &(pcidl->mkid);
@ -321,7 +302,6 @@ public:
// CNtObjectFolder
CNtObjectFolder::CNtObjectFolder() :
m_PidlManager(NULL),
m_shellPidl(NULL)
{
}
@ -330,8 +310,6 @@ CNtObjectFolder::~CNtObjectFolder()
{
if (m_shellPidl)
ILFree(m_shellPidl);
if (m_PidlManager)
delete m_PidlManager;
}
// IShellFolder
@ -370,7 +348,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::ParseDisplayName(
if (hr != S_OK)
break;
hr = m_PidlManager->GetInfoFromPidl(*ppidl, &info);
hr = CNtObjectPidlHelper::GetInfoFromPidl(*ppidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -389,7 +367,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::ParseDisplayName(
*pchEaten = wcslen(info->entryName);
if (pdwAttributes)
*pdwAttributes = m_PidlManager->ConvertAttributes(info, pdwAttributes);
*pdwAttributes = CNtObjectPidlHelper::ConvertAttributes(info, pdwAttributes);
}
return S_OK;
@ -413,7 +391,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::BindToObject(
if (IsEqualIID(riid, IID_IShellFolder))
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CNtObjectPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -514,7 +492,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::CompareIDs(
{
TRACE("CompareIDs\n");
HRESULT hr = m_PidlManager->CompareIDs(lParam, pidl1, pidl2);
HRESULT hr = CNtObjectPidlHelper::CompareIDs(lParam, pidl1, pidl2);
if (hr != S_OK)
return hr;
@ -581,12 +559,12 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetAttributesOf(
{
PCUITEMID_CHILD pidl = apidl[i];
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CNtObjectPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
// Update attributes.
*rgfInOut = m_PidlManager->ConvertAttributes(info, rgfInOut);
*rgfInOut = CNtObjectPidlHelper::ConvertAttributes(info, rgfInOut);
}
return S_OK;
@ -612,7 +590,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetUIObjectOf(
HKEY keys[1];
int nkeys = _countof(keys);
if (cidl == 1 && m_PidlManager->IsFolder(apidl[0]))
if (cidl == 1 && CNtObjectPidlHelper::IsFolder(apidl[0]))
{
res = RegOpenKey(HKEY_CLASSES_ROOT, L"Folder", keys + 0);
if (!NT_SUCCESS(res))
@ -642,7 +620,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetUIObjectOf(
if (IsEqualIID(riid, IID_IQueryAssociations))
{
if (cidl == 1 && m_PidlManager->IsFolder(apidl[0]))
if (cidl == 1 && CNtObjectPidlHelper::IsFolder(apidl[0]))
{
CComPtr<IQueryAssociations> pqa;
HRESULT hr = AssocCreate(CLSID_QueryAssociations, IID_PPV_ARG(IQueryAssociations, &pqa));
@ -669,7 +647,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDisplayNameOf(
TRACE("GetDisplayNameOf %p\n", pidl);
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CNtObjectPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -748,16 +726,9 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::Initialize(LPCITEMIDLIST pidl)
{
m_shellPidl = ILClone(pidl);
PCWSTR ntPath = L"\\";
StringCbCopy(m_NtPath, _countof(m_NtPath), L"\\");
if (!m_PidlManager)
{
m_PidlManager = new CNtObjectPidlManager();
StringCbCopy(m_NtPath, _countof(m_NtPath), ntPath);
}
return m_PidlManager->Initialize(m_NtPath);
return S_OK;
}
// Internal
@ -765,11 +736,9 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::Initialize(LPCITEMIDLIST pidl, PCWSTR
{
m_shellPidl = ILClone(pidl);
if (!m_PidlManager)
m_PidlManager = new CNtObjectPidlManager();
StringCbCopy(m_NtPath, _countof(m_NtPath), ntPath);
return m_PidlManager->Initialize(m_NtPath);
return S_OK;
}
// IPersistFolder2
@ -840,7 +809,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDetailsEx(
if (pidl)
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CNtObjectPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -907,7 +876,7 @@ HRESULT STDMETHODCALLTYPE CNtObjectFolder::GetDetailsOf(
if (pidl)
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CNtObjectPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;

View file

@ -9,8 +9,6 @@
extern const GUID CLSID_NtObjectFolder;
class CNtObjectPidlManager;
class CNtObjectFolder :
public CComCoClass<CNtObjectFolder, &CLSID_NtObjectFolder>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@ -18,8 +16,6 @@ class CNtObjectFolder :
public IPersistFolder2,
public IShellFolderViewCB
{
CNtObjectPidlManager * m_PidlManager;
WCHAR m_NtPath[MAX_PATH];
LPITEMIDLIST m_shellPidl;
@ -29,8 +25,6 @@ public:
CNtObjectFolder();
virtual ~CNtObjectFolder();
CNtObjectPidlManager& GetManager() { return *m_PidlManager; }
// IShellFolder
virtual HRESULT STDMETHODCALLTYPE ParseDisplayName(
HWND hwndOwner,

View file

@ -125,44 +125,9 @@ public:
};
class CRegistryPidlManager
class CRegistryPidlHelper
{
private:
PWSTR m_ntPath;
HKEY m_hRoot;
int DpaDeleteCallback(RegPidlEntry * info)
{
CoTaskMemFree(info);
return 0;
}
static int CALLBACK s_DpaDeleteCallback(void *pItem, void *pData)
{
CRegistryPidlManager * mf = (CRegistryPidlManager*) pData;
RegPidlEntry * item = (RegPidlEntry*) pItem;
return mf->DpaDeleteCallback(item);
}
public:
CRegistryPidlManager() :
m_ntPath(NULL),
m_hRoot(NULL)
{
}
~CRegistryPidlManager()
{
}
HRESULT Initialize(PWSTR ntPath, HKEY hRoot)
{
m_ntPath = ntPath;
m_hRoot = hRoot;
return S_OK;
}
static HRESULT CompareIDs(LPARAM lParam, const RegPidlEntry * first, const RegPidlEntry * second)
{
if ((lParam & 0xFFFF0000) == SHCIDS_ALLFIELDS)
@ -290,7 +255,7 @@ public:
return flags & mask;
}
BOOL IsFolder(LPCITEMIDLIST pcidl)
static BOOL IsFolder(LPCITEMIDLIST pcidl)
{
RegPidlEntry * entry = (RegPidlEntry*) &(pcidl->mkid);
if ((entry->cb < sizeof(RegPidlEntry)) || (entry->magic != REGISTRY_PIDL_MAGIC))
@ -300,7 +265,7 @@ public:
(entry->entryType == REG_ENTRY_ROOT);
}
HRESULT GetInfoFromPidl(LPCITEMIDLIST pcidl, const RegPidlEntry ** pentry)
static HRESULT GetInfoFromPidl(LPCITEMIDLIST pcidl, const RegPidlEntry ** pentry)
{
RegPidlEntry * entry = (RegPidlEntry*) &(pcidl->mkid);
@ -371,7 +336,7 @@ public:
}
}
HRESULT FormatContentsForDisplay(const RegPidlEntry * info, PCWSTR * strContents)
static HRESULT FormatContentsForDisplay(const RegPidlEntry * info, LPCWSTR ntPath, PCWSTR * strContents)
{
PVOID td = (((PBYTE) info) + FIELD_OFFSET(RegPidlEntry, entryName) + info->entryNameLength + sizeof(WCHAR));
@ -386,7 +351,7 @@ public:
{
PVOID valueData;
DWORD valueLength;
HRESULT hr = ReadRegistryValue(NULL, m_ntPath, info->entryName, &valueData, &valueLength);
HRESULT hr = ReadRegistryValue(NULL, ntPath, info->entryName, &valueData, &valueLength);
if (FAILED_UNEXPECTEDLY(hr))
{
PCWSTR strEmpty = L"(Error reading value)";
@ -429,7 +394,6 @@ public:
// CRegistryFolder
CRegistryFolder::CRegistryFolder() :
m_PidlManager(NULL),
m_shellPidl(NULL)
{
}
@ -438,8 +402,6 @@ CRegistryFolder::~CRegistryFolder()
{
if (m_shellPidl)
ILFree(m_shellPidl);
if (m_PidlManager)
delete m_PidlManager;
}
// IShellFolder
@ -480,7 +442,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::ParseDisplayName(
if (hr != S_OK)
break;
hr = m_PidlManager->GetInfoFromPidl(*ppidl, &info);
hr = CRegistryPidlHelper::GetInfoFromPidl(*ppidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -499,7 +461,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::ParseDisplayName(
*pchEaten = wcslen(info->entryName);
if (pdwAttributes)
*pdwAttributes = m_PidlManager->ConvertAttributes(info, pdwAttributes);
*pdwAttributes = CRegistryPidlHelper::ConvertAttributes(info, pdwAttributes);
}
return S_OK;
@ -530,7 +492,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::BindToObject(
if (IsEqualIID(riid, IID_IShellFolder))
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CRegistryPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -586,7 +548,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::CompareIDs(
{
TRACE("CompareIDs\n");
HRESULT hr = m_PidlManager->CompareIDs(lParam, pidl1, pidl2);
HRESULT hr = CRegistryPidlHelper::CompareIDs(lParam, pidl1, pidl2);
if (hr != S_OK)
return hr;
@ -653,12 +615,12 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetAttributesOf(
{
PCUITEMID_CHILD pidl = apidl[i];
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CRegistryPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
// Update attributes.
*rgfInOut = m_PidlManager->ConvertAttributes(info, rgfInOut);
*rgfInOut = CRegistryPidlHelper::ConvertAttributes(info, rgfInOut);
}
return S_OK;
@ -684,7 +646,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetUIObjectOf(
HKEY keys[1];
int nkeys = _countof(keys);
if (cidl == 1 && m_PidlManager->IsFolder(apidl[0]))
if (cidl == 1 && CRegistryPidlHelper::IsFolder(apidl[0]))
{
res = RegOpenKey(HKEY_CLASSES_ROOT, L"Folder", keys + 0);
if (!NT_SUCCESS(res))
@ -714,7 +676,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetUIObjectOf(
if (IsEqualIID(riid, IID_IQueryAssociations))
{
if (cidl == 1 && m_PidlManager->IsFolder(apidl[0]))
if (cidl == 1 && CRegistryPidlHelper::IsFolder(apidl[0]))
{
CComPtr<IQueryAssociations> pqa;
HRESULT hr = AssocCreate(CLSID_QueryAssociations, IID_PPV_ARG(IQueryAssociations, &pqa));
@ -741,7 +703,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDisplayNameOf(
TRACE("GetDisplayNameOf %p\n", pidl);
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CRegistryPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -821,16 +783,8 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::Initialize(LPCITEMIDLIST pidl)
m_shellPidl = ILClone(pidl);
m_hRoot = NULL;
PCWSTR ntPath = L"";
if (!m_PidlManager)
{
m_PidlManager = new CRegistryPidlManager();
StringCbCopy(m_NtPath, _countof(m_NtPath), ntPath);
}
return m_PidlManager->Initialize(m_NtPath, m_hRoot);
StringCbCopy(m_NtPath, _countof(m_NtPath), L"");
return S_OK;
}
// Internal
@ -839,11 +793,8 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::Initialize(LPCITEMIDLIST pidl, PCWSTR
m_shellPidl = ILClone(pidl);
m_hRoot = hRoot;
if (!m_PidlManager)
m_PidlManager = new CRegistryPidlManager();
StringCbCopy(m_NtPath, _countof(m_NtPath), ntPath);
return m_PidlManager->Initialize(m_NtPath, m_hRoot);
return S_OK;
}
// IPersistFolder2
@ -914,7 +865,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsEx(
if (pidl)
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CRegistryPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -953,7 +904,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsEx(
{
PCWSTR strValueContents;
hr = m_PidlManager->FormatContentsForDisplay(info, &strValueContents);
hr = CRegistryPidlHelper::FormatContentsForDisplay(info, m_NtPath, &strValueContents);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -987,7 +938,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsOf(
if (pidl)
{
HRESULT hr = m_PidlManager->GetInfoFromPidl(pidl, &info);
HRESULT hr = CRegistryPidlHelper::GetInfoFromPidl(pidl, &info);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
@ -1029,7 +980,7 @@ HRESULT STDMETHODCALLTYPE CRegistryFolder::GetDetailsOf(
PCWSTR strValueContents;
hr = m_PidlManager->FormatContentsForDisplay(info, &strValueContents);
hr = CRegistryPidlHelper::FormatContentsForDisplay(info, m_NtPath, &strValueContents);
if (FAILED_UNEXPECTEDLY(hr))
return hr;

View file

@ -10,8 +10,6 @@
extern const GUID CLSID_RegistryFolder;
class CRegistryPidlManager;
class CRegistryFolder :
public CComCoClass<CRegistryFolder, &CLSID_RegistryFolder>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@ -19,8 +17,6 @@ class CRegistryFolder :
public IPersistFolder2,
public IShellFolderViewCB
{
CRegistryPidlManager * m_PidlManager;
HKEY m_hRoot;
WCHAR m_NtPath[MAX_PATH];
@ -31,8 +27,6 @@ public:
CRegistryFolder();
virtual ~CRegistryFolder();
CRegistryPidlManager& GetManager() { return *m_PidlManager; }
// IShellFolder
virtual HRESULT STDMETHODCALLTYPE ParseDisplayName(
HWND hwndOwner,