diff --git a/WFPCore/Enumerators.h b/WFPCore/Enumerators.h index 6ae59cb..f5d49f8 100644 --- a/WFPCore/Enumerators.h +++ b/WFPCore/Enumerators.h @@ -76,3 +76,14 @@ struct WFPSubLayerEnumerator : WFPEnumerator< WFPEnumerator(hEngine, ::FwpmSubLayerCreateEnumHandle, ::FwpmSubLayerDestroyEnumHandle, ::FwpmSubLayerEnum) { } }; + +struct WFPProviderContextEnumerator : WFPEnumerator< + decltype(&::FwpmProviderContextCreateEnumHandle), + decltype(&::FwpmProviderContextDestroyEnumHandle), + decltype(&::FwpmProviderContextEnum), + FWPM_PROVIDER_CONTEXT> { + + explicit WFPProviderContextEnumerator(HANDLE hEngine) : + WFPEnumerator(hEngine, ::FwpmProviderContextCreateEnumHandle, ::FwpmProviderContextDestroyEnumHandle, ::FwpmProviderContextEnum) { + } +}; diff --git a/WFPCore/WFPCore.vcxproj b/WFPCore/WFPCore.vcxproj index 94ad467..8670bbd 100644 --- a/WFPCore/WFPCore.vcxproj +++ b/WFPCore/WFPCore.vcxproj @@ -161,7 +161,6 @@ - diff --git a/WFPCore/WFPCore.vcxproj.filters b/WFPCore/WFPCore.vcxproj.filters index 8b2902a..97be353 100644 --- a/WFPCore/WFPCore.vcxproj.filters +++ b/WFPCore/WFPCore.vcxproj.filters @@ -38,8 +38,5 @@ Source Files - - Source Files - \ No newline at end of file diff --git a/WFPCore/WFPEnumerator.cpp b/WFPCore/WFPEnumerator.cpp deleted file mode 100644 index acab39d..0000000 --- a/WFPCore/WFPEnumerator.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "pch.h" -#include "WFPEnumerator.h" - diff --git a/WFPExplorer/ProviderContextView.cpp b/WFPExplorer/ProviderContextView.cpp index 0e14149..64c5a21 100644 --- a/WFPExplorer/ProviderContextView.cpp +++ b/WFPExplorer/ProviderContextView.cpp @@ -3,10 +3,23 @@ #include "StringHelper.h" #include #include "resource.h" +#include CProviderContextView::CProviderContextView(IMainFrame* frame, WFPEngine& engine) : CFrameView(frame), m_Engine(engine) { } +CString CProviderContextView::GetProviderName(GUID const* key) const { + CString name; + if (key) { + auto provider = m_Engine.GetProviderByKey(*key); + if (provider) + name = StringHelper::ParseMUIString(provider->displayData.name); + if(name.IsEmpty() || name[0] == L'@') + name =StringHelper::GuidToString(*key); + } + return name; +} + LRESULT CProviderContextView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { m_hWndClient = m_List.Create(m_hWnd, rcDefault, nullptr, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | LVS_OWNERDATA | LVS_REPORT | LVS_SHOWSELALWAYS); @@ -39,31 +52,24 @@ LRESULT CProviderContextView::OnRefresh(WORD, WORD, HWND, BOOL&) { } void CProviderContextView::Refresh() { - m_Contexts = m_Engine.EnumProviderContexts(); + m_Contexts = WFPProviderContextEnumerator(m_Engine.Handle()).Next(256); m_List.SetItemCountEx((int)m_Contexts.size(), LVSICF_NOSCROLL); } CString CProviderContextView::GetColumnText(HWND, int row, int col) { - auto& info = m_Contexts[row]; + auto info = m_Contexts[row]; switch (GetColumnManager(m_List)->GetColumnTag(col)) { - case ColumnType::Key: return StringHelper::GuidToString(info.ProviderKey); - case ColumnType::Name: return info.Name.c_str(); - case ColumnType::Type: return std::format(L"{} ({})", StringHelper::WFPProviderContextTypeToString(info.Type), (int)info.Type).c_str(); - case ColumnType::Provider: - if (info.ProviderKey != GUID_NULL) { - auto provider = m_Engine.GetProviderByKey(info.ProviderKey); - if (provider && provider->displayData.name && provider->displayData.name[0] != L'@') - return provider->displayData.name; - return StringHelper::GuidToString(info.ProviderKey); - } - break; - case ColumnType::Desc: return info.Desc.c_str(); - case ColumnType::Id: return std::format(L"0x{:X}", info.ProviderContextId).c_str(); - case ColumnType::DataSize: return std::format(L"{}", info.ProviderDataSize).c_str(); + case ColumnType::Key: return StringHelper::GuidToString(info->providerContextKey); + case ColumnType::Name: return StringHelper::ParseMUIString(info->displayData.name); + case ColumnType::Type: return std::format(L"{} ({})", StringHelper::WFPProviderContextTypeToString(info->type), (UINT32)info->type).c_str(); + case ColumnType::Provider: return GetProviderName(info->providerKey); + case ColumnType::Desc: return StringHelper::ParseMUIString(info->displayData.description); + case ColumnType::Id: return std::format(L"0x{:X}", info->providerContextId).c_str(); + case ColumnType::DataSize: return std::format(L"{}", info->providerData.size).c_str(); case ColumnType::Flags: - if (info.Flags == WFPProviderContextFlags::None) + if (info->flags == 0) return L"0"; - return std::format(L"0x{:X} ({})", (UINT32)info.Flags, StringHelper::WFPProviderContextFlagsToString(info.Flags)).c_str(); + return std::format(L"0x{:X} ({})", info->flags, StringHelper::WFPProviderContextFlagsToString(info->flags)).c_str(); } return CString(); } @@ -72,16 +78,16 @@ void CProviderContextView::DoSort(SortInfo const* si) { auto col = GetColumnManager(m_List)->GetColumnTag(si->SortColumn); auto asc = si->SortAscending; - auto compare = [&](auto& p1, auto& p2) { + auto compare = [&](auto p1, auto p2) { switch (col) { - case ColumnType::Key: return SortHelper::Sort(StringHelper::GuidToString(p1.ProviderKey), StringHelper::GuidToString(p2.ProviderKey), asc); - case ColumnType::Name: return SortHelper::Sort(p1.Name, p2.Name, asc); - case ColumnType::Desc: return SortHelper::Sort(p1.Desc, p2.Desc, asc); - case ColumnType::Flags: return SortHelper::Sort(p1.Flags, p2.Flags, asc); - case ColumnType::Type: return SortHelper::Sort(p1.Type, p2.Type, asc); - case ColumnType::Id: return SortHelper::Sort(p1.ProviderContextId, p2.ProviderContextId, asc); - case ColumnType::DataSize: return SortHelper::Sort(p1.ProviderDataSize, p2.ProviderDataSize, asc); - case ColumnType::Provider: return SortHelper::Sort(StringHelper::GuidToString(p1.ProviderKey), StringHelper::GuidToString(p2.ProviderKey), asc); + case ColumnType::Key: return SortHelper::Sort(StringHelper::GuidToString(p1->providerContextKey), StringHelper::GuidToString(p2->providerContextKey), asc); + case ColumnType::Name: return SortHelper::Sort(StringHelper::ParseMUIString(p1->displayData.name), StringHelper::ParseMUIString(p2->displayData.name), asc); + case ColumnType::Desc: return SortHelper::Sort(StringHelper::ParseMUIString(p1->displayData.description), StringHelper::ParseMUIString(p2->displayData.description), asc); + case ColumnType::Flags: return SortHelper::Sort(p1->flags, p2->flags, asc); + case ColumnType::Type: return SortHelper::Sort(p1->type, p2->type, asc); + case ColumnType::Id: return SortHelper::Sort(p1->providerContextId, p2->providerContextId, asc); + case ColumnType::DataSize: return SortHelper::Sort(p1->providerData.size, p2->providerData.size, asc); + case ColumnType::Provider: return SortHelper::Sort(GetProviderName(p1->providerKey), GetProviderName(p2->providerKey), asc); } return false; }; diff --git a/WFPExplorer/ProviderContextView.h b/WFPExplorer/ProviderContextView.h index ac0f1c5..ea2d6ea 100644 --- a/WFPExplorer/ProviderContextView.h +++ b/WFPExplorer/ProviderContextView.h @@ -4,6 +4,7 @@ #include #include "Interfaces.h" #include +#include class WFPEngine; @@ -34,6 +35,8 @@ public: // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) private: + CString GetProviderName(GUID const* key) const; + enum class ColumnType { Key, Name, Desc, Flags, Provider, DataSize, Id, Type, }; @@ -44,5 +47,5 @@ private: WFPEngine& m_Engine; CListViewCtrl m_List; - std::vector m_Contexts; + WFPObjectVector m_Contexts; }; diff --git a/WFPExplorer/StringHelper.cpp b/WFPExplorer/StringHelper.cpp index 0a6168b..aa0faa8 100644 --- a/WFPExplorer/StringHelper.cpp +++ b/WFPExplorer/StringHelper.cpp @@ -170,19 +170,19 @@ CString StringHelper::WFPCalloutFlagsToString(DWORD flags) { return FlagsToString(flags, data); } -CString StringHelper::WFPProviderContextFlagsToString(WFPProviderContextFlags flags) { +CString StringHelper::WFPProviderContextFlagsToString(UINT32 flags) { static const struct { - WFPProviderContextFlags flag; + UINT32 flag; PCWSTR text; } data[] = { - { WFPProviderContextFlags::Persistent, L"Persistent" }, - { WFPProviderContextFlags::DownLevel, L"Downlevel" }, + { FWPM_PROVIDER_CONTEXT_FLAG_PERSISTENT, L"Persistent" }, + { FWPM_PROVIDER_CONTEXT_FLAG_DOWNLEVEL, L"Downlevel" }, }; return FlagsToString(flags, data); } -PCWSTR StringHelper::WFPProviderContextTypeToString(WFPProviderContextType type) { +PCWSTR StringHelper::WFPProviderContextTypeToString(FWPM_PROVIDER_CONTEXT_TYPE type) { static PCWSTR types[] = { L"IPSec Keying", L"IPSec Ike Quick Mode Transport", diff --git a/WFPExplorer/StringHelper.h b/WFPExplorer/StringHelper.h index a95e81c..939cb44 100644 --- a/WFPExplorer/StringHelper.h +++ b/WFPExplorer/StringHelper.h @@ -1,8 +1,5 @@ #pragma once -enum class WFPProviderContextFlags; -enum class WFPProviderContextType; - struct StringHelper abstract final { static CString GuidToString(GUID const& guid); static CString ParseMUIString(PCWSTR input); @@ -14,8 +11,8 @@ struct StringHelper abstract final { static CString WFPProviderFlagsToString(DWORD flags); static CString WFPSubLayerFlagsToString(UINT32 flags); static CString WFPCalloutFlagsToString(DWORD flags); - static CString WFPProviderContextFlagsToString(WFPProviderContextFlags flags); - static PCWSTR WFPProviderContextTypeToString(WFPProviderContextType type); + static CString WFPProviderContextFlagsToString(UINT32 flags); + static PCWSTR WFPProviderContextTypeToString(FWPM_PROVIDER_CONTEXT_TYPE type); static PCWSTR WFPFilterActionTypeToString(FWP_ACTION_TYPE type); static PCWSTR WFPConditionMatchToString(FWP_MATCH_TYPE type); static PCWSTR WFPDataTypeToString(FWP_DATA_TYPE type);