/*
- * PROJECT: ReactOS shell extensions
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: dll/shellext/ntobjshex/ntobjfolder.cpp
- * PURPOSE: NT Object Namespace shell extension
- * PROGRAMMERS: David Quintana <gigaherz@gmail.com>
+ * PROJECT: NT Object Namespace shell extension
+ * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE: NT Object Namespace folder class implementation
+ * COPYRIGHT: Copyright 2015-2017 David Quintana <gigaherz@gmail.com>
*/
#include "precomp.h"
switch (entry->objectType)
{
- case DIRECTORY_OBJECT:
- case SYMBOLICLINK_OBJECT:
- GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
- *piIndex = -((uFlags & GIL_OPENICON) ? IDI_NTOBJECTDIROPEN : IDI_NTOBJECTDIR);
- *pwFlags = flags;
- return S_OK;
- case DEVICE_OBJECT:
- GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
- *piIndex = -IDI_NTOBJECTDEVICE;
- *pwFlags = flags;
- return S_OK;
- case PORT_OBJECT:
- GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
- *piIndex = -IDI_NTOBJECTPORT;
- *pwFlags = flags;
- return S_OK;
- case KEY_OBJECT:
- GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
- *piIndex = -IDI_REGISTRYKEY;
- *pwFlags = flags;
- return S_OK;
- default:
- GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
- *piIndex = -IDI_NTOBJECTITEM;
- *pwFlags = flags;
- return S_OK;
+ case DIRECTORY_OBJECT:
+ case SYMBOLICLINK_OBJECT:
+ GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
+ *piIndex = -((uFlags & GIL_OPENICON) ? IDI_NTOBJECTDIROPEN : IDI_NTOBJECTDIR);
+ *pwFlags = flags;
+ return S_OK;
+
+ case DEVICE_OBJECT:
+ GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
+ *piIndex = -IDI_NTOBJECTDEVICE;
+ *pwFlags = flags;
+ return S_OK;
+
+ case PORT_OBJECT:
+ GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
+ *piIndex = -IDI_NTOBJECTPORT;
+ *pwFlags = flags;
+ return S_OK;
+
+ case KEY_OBJECT:
+ GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
+ *piIndex = -IDI_REGISTRYKEY;
+ *pwFlags = flags;
+ return S_OK;
+
+ default:
+ GetModuleFileNameW(g_hInstance, szIconFile, cchMax);
+ *piIndex = -IDI_NTOBJECTITEM;
+ *pwFlags = flags;
+ return S_OK;
}
}
if (link.Buffer[1] == L':' && isalphaW(link.Buffer[0]))
{
- StringCbCopyNW(path, _countof(path), link.Buffer, link.Length);
+ StringCbCopyNW(path, sizeof(path), link.Buffer, link.Length);
CComPtr<IShellFolder> psfDesktop;
hr = SHGetDesktopFolder(&psfDesktop);
return psfDesktop->ParseDisplayName(NULL, NULL, path, NULL, fullPidl, NULL);
}
- StringCbCopyW(path, _countof(path), L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{845B0FB2-66E0-416B-8F91-314E23F7C12D}");
+ StringCbCopyW(path, sizeof(path), L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{845B0FB2-66E0-416B-8F91-314E23F7C12D}");
PathAppend(path, link.Buffer);
CComPtr<IShellFolder> psfDesktop;
hr = psfDesktop->ParseDisplayName(NULL, NULL, path, NULL, &pidl, NULL);
if (FAILED(hr))
return hr;
-
+
*fullPidl = pidl;
DumpIdList(pidl);
{
return ShellObjectCreatorInit<CRegistryFolder>(fullPidl, path, (HKEY) NULL, IID_PPV_ARG(IShellFolder, ppsfChild));
}
-
+
return ShellObjectCreatorInit<CNtObjectFolder>(fullPidl, path, IID_PPV_ARG(IShellFolder, ppsfChild));
}
{
m_shellPidl = ILClone(pidl);
- StringCbCopy(m_NtPath, _countof(m_NtPath), L"\\");
+ StringCbCopyW(m_NtPath, sizeof(m_NtPath), L"\\");
return S_OK;
}
{
m_shellPidl = ILClone(pidl);
- StringCbCopy(m_NtPath, _countof(m_NtPath), ntPath);
+ StringCbCopyW(m_NtPath, sizeof(m_NtPath), ntPath);
return S_OK;
}
{
switch (iColumn)
{
- case NTOBJECT_COLUMN_NAME:
- *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
- return S_OK;
- case NTOBJECT_COLUMN_TYPE:
- *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
- return S_OK;
- case NTOBJECT_COLUMN_LINKTARGET:
- *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT | SHCOLSTATE_SLOW;
- return S_OK;
+ case NTOBJECT_COLUMN_NAME:
+ *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
+ return S_OK;
+
+ case NTOBJECT_COLUMN_TYPE:
+ *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT;
+ return S_OK;
+
+ case NTOBJECT_COLUMN_LINKTARGET:
+ *pcsFlags = SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT | SHCOLSTATE_SLOW;
+ return S_OK;
}
return E_INVALIDARG;
switch (iColumn)
{
- case NTOBJECT_COLUMN_NAME:
- psd->fmt = LVCFMT_LEFT;
+ case NTOBJECT_COLUMN_NAME:
+ {
+ psd->fmt = LVCFMT_LEFT;
- MakeStrRetFromString(info->entryName, info->entryNameLength, &(psd->str));
- return S_OK;
- case NTOBJECT_COLUMN_TYPE:
- psd->fmt = LVCFMT_LEFT;
+ MakeStrRetFromString(info->entryName, info->entryNameLength, &(psd->str));
+ return S_OK;
+ }
- if (info->objectType < 0)
+ case NTOBJECT_COLUMN_TYPE:
{
- NtPidlTypeData * td = (NtPidlTypeData*) (((PBYTE) info) + FIELD_OFFSET(NtPidlEntry, entryName) + info->entryNameLength + sizeof(WCHAR));
+ psd->fmt = LVCFMT_LEFT;
+
+ if (info->objectType < 0)
+ {
+ NtPidlTypeData * td = (NtPidlTypeData*) (((PBYTE) info) + FIELD_OFFSET(NtPidlEntry, entryName) + info->entryNameLength + sizeof(WCHAR));
- if (td->typeNameLength > 0)
- MakeStrRetFromString(td->typeName, td->typeNameLength, &(psd->str));
+ if (td->typeNameLength > 0)
+ MakeStrRetFromString(td->typeName, td->typeNameLength, &(psd->str));
+ else
+ MakeStrRetFromString(L"Unknown", &(psd->str));
+ }
else
- MakeStrRetFromString(L"Unknown", &(psd->str));
+ MakeStrRetFromString(ObjectTypeNames[info->objectType], &(psd->str));
+ return S_OK;
}
- else
- MakeStrRetFromString(ObjectTypeNames[info->objectType], &(psd->str));
- return S_OK;
- case NTOBJECT_COLUMN_LINKTARGET:
- {
- psd->fmt = LVCFMT_LEFT;
- if (info->objectType == SYMBOLICLINK_OBJECT)
+ case NTOBJECT_COLUMN_LINKTARGET:
{
- WCHAR wbLink[MAX_PATH] = { 0 };
- UNICODE_STRING link;
- RtlInitEmptyUnicodeString(&link, wbLink, sizeof(wbLink));
-
- HRESULT hr = GetNTObjectSymbolicLinkTarget(m_NtPath, info->entryName, &link);
+ psd->fmt = LVCFMT_LEFT;
- if (!FAILED_UNEXPECTEDLY(hr) && link.Length > 0)
+ if (info->objectType == SYMBOLICLINK_OBJECT)
{
- MakeStrRetFromString(link.Buffer, link.Length, &(psd->str));
- return S_OK;
+ WCHAR wbLink[MAX_PATH] = { 0 };
+ UNICODE_STRING link;
+ RtlInitEmptyUnicodeString(&link, wbLink, sizeof(wbLink));
+
+ HRESULT hr = GetNTObjectSymbolicLinkTarget(m_NtPath, info->entryName, &link);
+
+ if (!FAILED_UNEXPECTEDLY(hr) && link.Length > 0)
+ {
+ MakeStrRetFromString(link.Buffer, link.Length, &(psd->str));
+ return S_OK;
+ }
}
- }
- MakeStrRetFromString(L"", &(psd->str));
- return S_OK;
- }
+ MakeStrRetFromString(L"", &(psd->str));
+ return S_OK;
+ }
}
}
else
{
switch (iColumn)
{
- case NTOBJECT_COLUMN_NAME:
- psd->fmt = LVCFMT_LEFT;
- psd->cxChar = 30;
+ case NTOBJECT_COLUMN_NAME:
+ psd->fmt = LVCFMT_LEFT;
+ psd->cxChar = 30;
- // TODO: Make localizable
- MakeStrRetFromString(L"Object Name", &(psd->str));
- return S_OK;
- case NTOBJECT_COLUMN_TYPE:
- psd->fmt = LVCFMT_LEFT;
- psd->cxChar = 20;
+ // TODO: Make localizable
+ MakeStrRetFromString(L"Object Name", &(psd->str));
+ return S_OK;
- // TODO: Make localizable
- MakeStrRetFromString(L"Object Type", &(psd->str));
- return S_OK;
- case NTOBJECT_COLUMN_LINKTARGET:
- psd->fmt = LVCFMT_LEFT;
- psd->cxChar = 30;
+ case NTOBJECT_COLUMN_TYPE:
+ psd->fmt = LVCFMT_LEFT;
+ psd->cxChar = 20;
- // TODO: Make localizable
- MakeStrRetFromString(L"Symlink Target", &(psd->str));
- return S_OK;
+ // TODO: Make localizable
+ MakeStrRetFromString(L"Object Type", &(psd->str));
+ return S_OK;
+
+ case NTOBJECT_COLUMN_LINKTARGET:
+ psd->fmt = LVCFMT_LEFT;
+ psd->cxChar = 30;
+
+ // TODO: Make localizable
+ MakeStrRetFromString(L"Symlink Target", &(psd->str));
+ return S_OK;
}
}
static const GUID storage = PSGUID_STORAGE;
switch (iColumn)
{
- case NTOBJECT_COLUMN_NAME:
- pscid->fmtid = storage;
- pscid->pid = PID_STG_NAME;
- return S_OK;
- case NTOBJECT_COLUMN_TYPE:
- pscid->fmtid = storage;
- pscid->pid = PID_STG_STORAGETYPE;
- return S_OK;
- case NTOBJECT_COLUMN_LINKTARGET:
- pscid->fmtid = GUID_NtObjectColumns;
- pscid->pid = NTOBJECT_COLUMN_LINKTARGET;
- return S_OK;
+ case NTOBJECT_COLUMN_NAME:
+ pscid->fmtid = storage;
+ pscid->pid = PID_STG_NAME;
+ return S_OK;
+
+ case NTOBJECT_COLUMN_TYPE:
+ pscid->fmtid = storage;
+ pscid->pid = PID_STG_STORAGETYPE;
+ return S_OK;
+
+ case NTOBJECT_COLUMN_LINKTARGET:
+ pscid->fmtid = GUID_NtObjectColumns;
+ pscid->pid = NTOBJECT_COLUMN_LINKTARGET;
+ return S_OK;
}
return E_INVALIDARG;
}
switch (column)
{
- case NTOBJECT_COLUMN_NAME:
- return CompareName(lParam, first, second);
+ case NTOBJECT_COLUMN_NAME:
+ return CompareName(lParam, first, second);
- case NTOBJECT_COLUMN_TYPE:
- return MAKE_COMPARE_HRESULT(second->objectType - first->objectType);
+ case NTOBJECT_COLUMN_TYPE:
+ return MAKE_COMPARE_HRESULT(second->objectType - first->objectType);
- case NTOBJECT_COLUMN_LINKTARGET:
- // Can't sort by link target yet
- return E_INVALIDARG;
+ case NTOBJECT_COLUMN_LINKTARGET:
+ {
+ if (first->objectType != SYMBOLICLINK_OBJECT && second->objectType != SYMBOLICLINK_OBJECT)
+ return CompareName(lParam, first, second);
+
+ if (first->objectType != SYMBOLICLINK_OBJECT || second->objectType != SYMBOLICLINK_OBJECT)
+ return first->objectType != SYMBOLICLINK_OBJECT ? S_GREATERTHAN : S_LESSTHAN;
+
+ WCHAR wbLink1[MAX_PATH] = { 0 }, wbLink2[MAX_PATH] = { 0 };
+ UNICODE_STRING firstLink, secondLink;
+ RtlInitEmptyUnicodeString(&firstLink, wbLink1, sizeof(wbLink1));
+
+ if (FAILED_UNEXPECTEDLY(GetNTObjectSymbolicLinkTarget(m_NtPath, first->entryName, &firstLink)))
+ return E_INVALIDARG;
+
+ RtlInitEmptyUnicodeString(&secondLink, wbLink2, sizeof(wbLink2));
+
+ if (FAILED_UNEXPECTEDLY(GetNTObjectSymbolicLinkTarget(m_NtPath, second->entryName, &secondLink)))
+ return E_INVALIDARG;
+
+ return MAKE_COMPARE_HRESULT(RtlCompareUnicodeString(&firstLink, &secondLink, TRUE));
+ }
}
DbgPrint("Unsupported sorting mode.\n");
HRESULT CNtObjectFolder::GetInfoFromPidl(LPCITEMIDLIST pcidl, const NtPidlEntry ** pentry)
{
- NtPidlEntry * entry = (NtPidlEntry*) &(pcidl->mkid);
+ if (!pcidl)
+ {
+ DbgPrint("PCIDL is NULL\n");
+ return E_INVALIDARG;
+ }
+ NtPidlEntry * entry = (NtPidlEntry*) &(pcidl->mkid);
if (entry->cb < sizeof(NtPidlEntry))
{
DbgPrint("PCIDL too small %l (required %l)\n", entry->cb, sizeof(NtPidlEntry));
*pentry = entry;
return S_OK;
-}
\ No newline at end of file
+}