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);