mirror of
https://github.com/reactos/reactos.git
synced 2024-07-01 02:10:07 +00:00
[NTOBJSHEX] Fix sorting elements by different columns (#4947)
- Add ability to sort NT objects by symlinks - Add ability to sort registry entries by type/value CORE-18761 CORE-18762
This commit is contained in:
parent
d1718366de
commit
e0248f4f51
|
@ -463,8 +463,27 @@ HRESULT CNtObjectFolder::CompareIDs(LPARAM lParam, const NtPidlEntry * first, co
|
||||||
return MAKE_COMPARE_HRESULT(second->objectType - first->objectType);
|
return MAKE_COMPARE_HRESULT(second->objectType - first->objectType);
|
||||||
|
|
||||||
case NTOBJECT_COLUMN_LINKTARGET:
|
case NTOBJECT_COLUMN_LINKTARGET:
|
||||||
// Can't sort by link target yet
|
{
|
||||||
return E_INVALIDARG;
|
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");
|
DbgPrint("Unsupported sorting mode.\n");
|
||||||
|
|
|
@ -409,11 +409,40 @@ HRESULT CRegistryFolder::CompareIDs(LPARAM lParam, const RegPidlEntry * first, c
|
||||||
return CompareName(lParam, first, second);
|
return CompareName(lParam, first, second);
|
||||||
|
|
||||||
case REGISTRY_COLUMN_TYPE:
|
case REGISTRY_COLUMN_TYPE:
|
||||||
return MAKE_COMPARE_HRESULT(second->contentType - first->contentType);
|
{
|
||||||
|
if (first->entryType != second->entryType)
|
||||||
|
return MAKE_COMPARE_HRESULT(second->entryType - first->entryType);
|
||||||
|
|
||||||
|
if (first->entryType == REG_ENTRY_KEY)
|
||||||
|
{
|
||||||
|
if (first->contentsLength == 0 || second->contentsLength == 0)
|
||||||
|
return (first->contentsLength == 0) ? S_GREATERTHAN : S_LESSTHAN;
|
||||||
|
|
||||||
|
PWSTR firstKey = (PWSTR)(((PBYTE)first) + FIELD_OFFSET(RegPidlEntry, entryName) + first->entryNameLength + sizeof(WCHAR));
|
||||||
|
PWSTR secondKey = (PWSTR)(((PBYTE)second) + FIELD_OFFSET(RegPidlEntry, entryName) + second->entryNameLength + sizeof(WCHAR));
|
||||||
|
return MAKE_COMPARE_HRESULT(lstrcmpW(firstKey, secondKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
return CompareName(lParam, first, second);
|
||||||
|
}
|
||||||
|
|
||||||
case REGISTRY_COLUMN_VALUE:
|
case REGISTRY_COLUMN_VALUE:
|
||||||
// Can't sort by link target yet
|
{
|
||||||
return E_INVALIDARG;
|
PCWSTR firstContent, secondContent;
|
||||||
|
|
||||||
|
if (FAILED_UNEXPECTEDLY(FormatContentsForDisplay(first, m_hRoot, m_NtPath, &firstContent)))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
if (FAILED_UNEXPECTEDLY(FormatContentsForDisplay(second, m_hRoot, m_NtPath, &secondContent)))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
hr = MAKE_COMPARE_HRESULT(lstrcmpW(firstContent, secondContent));
|
||||||
|
|
||||||
|
CoTaskMemFree((LPVOID)firstContent);
|
||||||
|
CoTaskMemFree((LPVOID)secondContent);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DbgPrint("Unsupported sorting mode.\n");
|
DbgPrint("Unsupported sorting mode.\n");
|
||||||
|
|
Loading…
Reference in a new issue