diff options
| -rw-r--r-- | windows/winfw/src/winfw/objectpurger.cpp | 14 | ||||
| -rw-r--r-- | windows/winfw/src/winfw/objectpurger.h | 2 | ||||
| -rw-r--r-- | windows/winfw/src/winfw/winfw.cpp | 15 |
3 files changed, 22 insertions, 9 deletions
diff --git a/windows/winfw/src/winfw/objectpurger.cpp b/windows/winfw/src/winfw/objectpurger.cpp index b9c6048658..60c32cd53e 100644 --- a/windows/winfw/src/winfw/objectpurger.cpp +++ b/windows/winfw/src/winfw/objectpurger.cpp @@ -4,6 +4,7 @@ #include "wfpobjecttype.h" #include "libwfp/filterengine.h" #include "libwfp/objectdeleter.h" +#include "libwfp/transaction.h" #include <algorithm> namespace @@ -52,3 +53,16 @@ ObjectPurger::RemovalFunctor ObjectPurger::GetRemoveAllFunctor() RemoveRange(engine, wfp::ObjectDeleter::DeleteProvider, registry.equal_range(WfpObjectType::Provider)); }; } + +//static +bool ObjectPurger::Execute(RemovalFunctor f) +{ + auto engine = wfp::FilterEngine::StandardSession(); + + auto wrapper = [&]() + { + return f(*engine), true; + }; + + return wfp::Transaction::Execute(*engine, wrapper); +} diff --git a/windows/winfw/src/winfw/objectpurger.h b/windows/winfw/src/winfw/objectpurger.h index fa82a86f91..62f7ce2e11 100644 --- a/windows/winfw/src/winfw/objectpurger.h +++ b/windows/winfw/src/winfw/objectpurger.h @@ -15,4 +15,6 @@ public: static RemovalFunctor GetRemoveFiltersFunctor(); static RemovalFunctor GetRemoveAllFunctor(); + + static bool Execute(RemovalFunctor f); }; diff --git a/windows/winfw/src/winfw/winfw.cpp b/windows/winfw/src/winfw/winfw.cpp index d47139cb7d..53ec4e5301 100644 --- a/windows/winfw/src/winfw/winfw.cpp +++ b/windows/winfw/src/winfw/winfw.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "winfw.h" #include "fwcontext.h" +#include "objectpurger.h" #include "libwfp/ipaddress.h" #include <windows.h> #include <stdexcept> @@ -228,17 +229,13 @@ bool WINFW_API WinFw_Reset() { - if (nullptr == g_fwContext) - { - // - // This is OK because the practical difference between having no instance - // and having a reset instance is negligible. - // - return true; - } - try { + if (nullptr == g_fwContext) + { + return ObjectPurger::Execute(ObjectPurger::GetRemoveAllFunctor()); + } + return g_fwContext->reset(); } catch (std::exception &err) |
