[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:
Egor Ananyin 2022-12-20 23:58:30 +03:00 committed by GitHub
parent d1718366de
commit e0248f4f51
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 5 deletions

View file

@ -463,8 +463,27 @@ HRESULT CNtObjectFolder::CompareIDs(LPARAM lParam, const NtPidlEntry * first, co
return MAKE_COMPARE_HRESULT(second->objectType - first->objectType);
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");

View file

@ -409,11 +409,40 @@ HRESULT CRegistryFolder::CompareIDs(LPARAM lParam, const RegPidlEntry * first, c
return CompareName(lParam, first, second);
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:
// 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");