mirror of
https://github.com/zodiacon/WFPExplorer
synced 2026-06-08 18:39:31 +00:00
provider context refactored
This commit is contained in:
@@ -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) {
|
||||
}
|
||||
};
|
||||
|
||||
@@ -161,7 +161,6 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="WFPCore.cpp" />
|
||||
<ClCompile Include="WFPEngine.cpp" />
|
||||
<ClCompile Include="WFPEnumerator.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -38,8 +38,5 @@
|
||||
<ClCompile Include="WFPEngine.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WFPEnumerator.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,3 +0,0 @@
|
||||
#include "pch.h"
|
||||
#include "WFPEnumerator.h"
|
||||
|
||||
@@ -3,10 +3,23 @@
|
||||
#include "StringHelper.h"
|
||||
#include <SortHelper.h>
|
||||
#include "resource.h"
|
||||
#include <Enumerators.h>
|
||||
|
||||
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<ColumnType>(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<ColumnType>(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;
|
||||
};
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <VirtualListView.h>
|
||||
#include "Interfaces.h"
|
||||
#include <WFPEngine.h>
|
||||
#include <WFPEnumerator.h>
|
||||
|
||||
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<WFPProviderContextInfo> m_Contexts;
|
||||
WFPObjectVector<FWPM_PROVIDER_CONTEXT> m_Contexts;
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user