Author: dquintana
Date: Sun Apr 12 01:34:53 2015
New Revision: 67166
URL: 
http://svn.reactos.org/svn/reactos?rev=67166&view=rev
Log:
[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
Modified:
    trunk/reactos/dll/shellext/ntobjshex/ntobjns.cpp
    trunk/reactos/dll/shellext/ntobjshex/precomp.h
    trunk/reactos/dll/shellext/ntobjshex/regfolder.cpp
Modified: trunk/reactos/dll/shellext/ntobjshex/ntobjns.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/ntobjshex/nto…
==============================================================================
--- trunk/reactos/dll/shellext/ntobjshex/ntobjns.cpp    [iso-8859-1] (original)
+++ trunk/reactos/dll/shellext/ntobjshex/ntobjns.cpp    [iso-8859-1] Sun Apr 12 01:34:53
2015
@@ -199,7 +199,7 @@
         return S_OK;
     }
-    HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, NtPidlEntry ** pinfo)
+    HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, const NtPidlEntry ** pinfo)
     {
         HRESULT hr;
@@ -326,7 +326,7 @@
         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 @@
         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 @@
         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 @@
         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 @@
     BOOL IsFolder(LPCITEMIDLIST pcidl)
     {
-        NtPidlEntry * entry;
+        const NtPidlEntry * entry;
         HRESULT hr = FindPidlInList(pcidl, &entry);
         if (FAILED_UNEXPECTEDLY(hr))
             return FALSE;
@@ -668,7 +668,7 @@
     REFIID riid,
     void **ppvOut)
 {
-    NtPidlEntry * info;
+    const NtPidlEntry * info;
     HRESULT hr;
     if (IsEqualIID(riid, IID_IShellFolder))
@@ -816,8 +816,7 @@
     PCUITEMID_CHILD_ARRAY apidl,
     SFGAOF *rgfInOut)
 {
-    NtPidlEntry * info;
-    HRESULT hr;
+    const NtPidlEntry * info;
     TRACE("GetAttributesOf\n");
@@ -831,9 +830,15 @@
     {
         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 @@
     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 @@
     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 @@
     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)
         {
Modified: trunk/reactos/dll/shellext/ntobjshex/precomp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/ntobjshex/pre…
==============================================================================
--- trunk/reactos/dll/shellext/ntobjshex/precomp.h      [iso-8859-1] (original)
+++ trunk/reactos/dll/shellext/ntobjshex/precomp.h      [iso-8859-1] Sun Apr 12 01:34:53
2015
@@ -48,3 +48,6 @@
 #include "ntobjns.h"
 #include "regfolder.h"
+
+// Workaround for missing entries
+#define DISABLE_STRICT_PIDL_CHECKS
Modified: trunk/reactos/dll/shellext/ntobjshex/regfolder.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/ntobjshex/reg…
==============================================================================
--- trunk/reactos/dll/shellext/ntobjshex/regfolder.cpp  [iso-8859-1] (original)
+++ trunk/reactos/dll/shellext/ntobjshex/regfolder.cpp  [iso-8859-1] Sun Apr 12 01:34:53
2015
@@ -194,7 +194,7 @@
         return S_OK;
     }
-    HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, RegPidlEntry ** pinfo)
+    HRESULT FindPidlInList(PCUITEMID_CHILD pcidl, const RegPidlEntry ** pinfo)
     {
         HRESULT hr;
@@ -323,7 +323,7 @@
     }
-    static LPITEMIDLIST CreatePidlFromItem(RegPidlEntry * entry)
+    static LPITEMIDLIST CreatePidlFromItem(const RegPidlEntry * entry)
     {
         LPITEMIDLIST idl = (LPITEMIDLIST) CoTaskMemAlloc(entry->cb + 2);
         if (!idl)
@@ -333,7 +333,7 @@
         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 @@
         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 @@
         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 @@
     BOOL IsFolder(LPCITEMIDLIST pcidl)
     {
-        RegPidlEntry * entry;
+        const RegPidlEntry * entry;
         HRESULT hr = FindPidlInList(pcidl, &entry);
         if (FAILED_UNEXPECTEDLY(hr))
             return FALSE;
@@ -512,7 +512,7 @@
         }
     }
-    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 @@
     REFIID riid,
     void **ppvOut)
 {
-    RegPidlEntry * info;
+    const RegPidlEntry * info;
     HRESULT hr;
     if (IsEqualIID(riid, IID_IShellFolder))
@@ -866,8 +866,7 @@
     PCUITEMID_CHILD_ARRAY apidl,
     SFGAOF *rgfInOut)
 {
-    RegPidlEntry * info;
-    HRESULT hr;
+    const RegPidlEntry * info;
     TRACE("GetAttributesOf\n");
@@ -881,9 +880,15 @@
     {
         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 @@
     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 @@
     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 @@
     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)
         {