mirror of
https://github.com/zodiacon/WFPExplorer
synced 2026-06-08 18:39:31 +00:00
143 lines
5.1 KiB
C++
143 lines
5.1 KiB
C++
#include "pch.h"
|
|
#include "WFPHelper.h"
|
|
#include <WFPEngine.h>
|
|
#include <SortHelper.h>
|
|
#include "StringHelper.h"
|
|
#include "LayerGeneralPage.h"
|
|
#include "LayerFieldsPage.h"
|
|
#include "FilterGeneralPage.h"
|
|
#include "FilterConditionsPage.h"
|
|
#include "LayersView.h"
|
|
#include "ProviderDlg.h"
|
|
#include "CalloutDlg.h"
|
|
#include "SubLayerDlg.h"
|
|
#include "WFPEnumerators.h"
|
|
#include "FiltersListPage.h"
|
|
|
|
CString WFPHelper::GetProviderName(WFPEngine const& engine, GUID const& key) {
|
|
auto provider = engine.GetProviderByKey(key);
|
|
if (auto name = StringHelper::ParseMUIString(provider->displayData.name); !name.IsEmpty())
|
|
return name;
|
|
return StringHelper::GuidToString(key);
|
|
}
|
|
|
|
CString WFPHelper::GetFilterName(WFPEngine const& engine, GUID const& key) {
|
|
if (auto filter = engine.GetFilterByKey(key); filter)
|
|
return StringHelper::ParseMUIString(filter->displayData.name);
|
|
return StringHelper::GuidToString(key);
|
|
}
|
|
|
|
CString WFPHelper::GetLayerName(WFPEngine const& engine, GUID const& key) {
|
|
if (key != GUID_NULL) {
|
|
auto layer = engine.GetLayerByKey(key);
|
|
if (layer && layer->displayData.name && layer->displayData.name[0] != L'@')
|
|
return layer->displayData.name;
|
|
return StringHelper::GuidToString(key);
|
|
}
|
|
return L"";
|
|
}
|
|
|
|
CString WFPHelper::GetCalloutName(WFPEngine const& engine, GUID const& key) {
|
|
auto callout = engine.GetCalloutByKey(key);
|
|
if (auto name = StringHelper::ParseMUIString(callout->displayData.name); !name.IsEmpty())
|
|
return name;
|
|
return StringHelper::GuidToString(key);
|
|
}
|
|
|
|
CString WFPHelper::GetSublayerName(WFPEngine const& engine, GUID const& key) {
|
|
if (key != GUID_NULL) {
|
|
auto layer = engine.GetSublayerByKey(key);
|
|
if (layer)
|
|
return StringHelper::ParseMUIString(layer->displayData.name);
|
|
return StringHelper::GuidToString(key);
|
|
}
|
|
return L"";
|
|
}
|
|
|
|
int WFPHelper::ShowLayerProperties(WFPEngine& engine, FWPM_LAYER* layer) {
|
|
auto name = L"Layer Properties (" + GetLayerName(engine, layer->layerKey) + L")";
|
|
CPropertySheet sheet((PCWSTR)name);
|
|
sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_USEICONID | PSH_NOCONTEXTHELP;
|
|
sheet.m_psh.pszIcon = MAKEINTRESOURCE(IDI_LAYERS);
|
|
CLayerGeneralPage general(engine, layer);
|
|
general.m_psp.dwFlags |= PSP_USEHICON;
|
|
general.m_psp.hIcon = AtlLoadIconImage(IDI_CUBE, LR_LOADTRANSPARENT | LR_CREATEDIBSECTION, 16, 16);
|
|
sheet.AddPage(general);
|
|
|
|
CLayerFieldsPage fields(engine, layer);
|
|
if (layer->numFields > 0) {
|
|
fields.m_psp.dwFlags |= PSP_USEICONID;
|
|
fields.m_psp.pszIcon = MAKEINTRESOURCE(IDI_FIELD);
|
|
sheet.AddPage(fields);
|
|
}
|
|
CFiltersListPage filterPage(engine, layer);
|
|
if (filterPage.GetFilterCount()) {
|
|
filterPage.SetTitle(L"Filters");
|
|
filterPage.m_psp.dwFlags |= PSP_USEICONID;
|
|
filterPage.m_psp.pszIcon = MAKEINTRESOURCE(IDI_FILTER);
|
|
sheet.AddPage(filterPage);
|
|
}
|
|
return (int)sheet.DoModal();
|
|
}
|
|
|
|
int WFPHelper::ShowFilterProperties(WFPEngine& engine, FWPM_FILTER* filter) {
|
|
auto name = L"Filter: " + GetFilterName(engine, filter->filterKey);
|
|
CPropertySheet sheet((PCWSTR)name);
|
|
sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_USEICONID | PSH_NOCONTEXTHELP | PSH_RESIZABLE;
|
|
sheet.m_psh.pszIcon = MAKEINTRESOURCE(IDI_FILTER);
|
|
CFilterGeneralPage general(engine, filter);
|
|
general.m_psp.dwFlags |= PSP_USEICONID;
|
|
general.m_psp.pszIcon = MAKEINTRESOURCE(IDI_CUBE);
|
|
CFilterConditionsPage cond(engine, filter);
|
|
sheet.AddPage(general);
|
|
if (filter->numFilterConditions > 0) {
|
|
cond.m_psp.dwFlags |= PSP_USEICONID;
|
|
cond.m_psp.pszIcon = MAKEINTRESOURCE(IDI_CONDITION);
|
|
sheet.AddPage(cond);
|
|
}
|
|
return (int)sheet.DoModal();
|
|
}
|
|
|
|
int WFPHelper::ShowSublayerProperties(WFPEngine& engine, FWPM_SUBLAYER* sublayer) {
|
|
CSubLayerDlg dlg(engine, sublayer);
|
|
dlg.DoModal();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int WFPHelper::ShowProviderProperties(WFPEngine& engine, FWPM_PROVIDER* provider) {
|
|
CProviderDlg dlg(provider);
|
|
return (int)dlg.DoModal();
|
|
}
|
|
|
|
int WFPHelper::ShowCalloutProperties(WFPEngine& engine, FWPM_CALLOUT* callout) {
|
|
CCalloutDlg dlg(engine, callout);
|
|
return (int)dlg.DoModal();
|
|
}
|
|
|
|
bool WFPHelper::Sort(FWP_VALUE const& v1, FWP_VALUE const& v2, bool asc) {
|
|
if (v1.type != v2.type) {
|
|
if (v1.type == FWP_EMPTY)
|
|
return asc;
|
|
if (v2.type == FWP_EMPTY)
|
|
return !asc;
|
|
}
|
|
|
|
//
|
|
// cover some common cases...
|
|
//
|
|
switch (v1.type + (v2.type << 8)) {
|
|
case FWP_UINT8 + (FWP_UINT8 << 8): return SortHelper::Sort(v1.uint8, v2.uint8, asc);
|
|
case FWP_UINT8 + (FWP_UINT64 << 8) : return SortHelper::Sort<UINT64>(v1.uint8, *v2.uint64, asc);
|
|
case FWP_UINT64 + (FWP_UINT8 << 8) : return SortHelper::Sort<UINT64>(*v1.uint64, v2.uint8, asc);
|
|
case FWP_UINT16 + (FWP_UINT16 << 8) : return SortHelper::Sort(v1.uint16, v2.uint16, asc);
|
|
case FWP_UINT32 + (FWP_UINT32 << 8) : return SortHelper::Sort(v1.uint32, v2.uint32, asc);
|
|
case FWP_UINT64 + (FWP_UINT64 << 8) : return SortHelper::Sort(*v1.uint64, *v2.uint64, asc);
|
|
case FWP_INT8 + (FWP_INT64 << 8) : return SortHelper::Sort(v1.int8, *v2.int64, asc);
|
|
case FWP_INT16 + (FWP_INT16 << 8) : return SortHelper::Sort(v1.int16, v2.int16, asc);
|
|
case FWP_INT32 + (FWP_INT32 << 8): return SortHelper::Sort(v1.int32, v2.int32, asc);
|
|
case FWP_INT64 + (FWP_INT64 << 8): return SortHelper::Sort(*v1.int64, *v2.int64, asc);
|
|
}
|
|
return false;
|
|
}
|