From 01980b30521f9a381609b9795f6bc93b5f91c1af Mon Sep 17 00:00:00 2001 From: es3n1n Date: Sat, 31 May 2025 14:13:19 +0200 Subject: [PATCH] feat(bootstrap): apply IWscASStatus, pass true to updatestatus --- defendnot/bootstrap/bootstrap.cpp | 43 ++++++++++++++++++++----------- defendnot/core/com.hpp | 13 +++++++--- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/defendnot/bootstrap/bootstrap.cpp b/defendnot/bootstrap/bootstrap.cpp index 913c807..096f3ee 100644 --- a/defendnot/bootstrap/bootstrap.cpp +++ b/defendnot/bootstrap/bootstrap.cpp @@ -7,20 +7,36 @@ #include namespace defendnot { + namespace { + template + void apply(const std::string_view log_prefix, const BSTR name) { + /// Get the WSC interface + auto inst = com::query(); + + /// This can fail if we dont have any products registered so no com_checked + logln("{}_unregister: {:#x}", log_prefix, com::retry_while_pending([&inst]() -> HRESULT { return inst->Unregister(); }) & 0xFFFFFFFF); + if (shared::ctx.state == shared::State::OFF) { + return; + } + + /// Register and activate + logln("{}_register: {:#x}", log_prefix, com::checked(inst->Register(name, name, 0, 0))); + logln("{}_update: {:#x}", log_prefix, com::checked(inst->UpdateStatus(WSCSecurityProductState::ON, static_cast(true)))); + + /// Update the substatuses, if the interface supports this + if constexpr (std::is_same_v) { + logln("{}_scan_update: {:#x}", log_prefix, com::checked(inst->UpdateScanSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); + logln("{}_settings_update: {:#x}", log_prefix, com::checked(inst->UpdateSettingsSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); + logln("{}_prot_update: {:#x}", log_prefix, com::checked(inst->UpdateProtectionUpdateSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); + } + } + } // namespace + void startup() { /// Setup shared::ctx.deserialize(); logln("init: {:#x}", com::checked(CoInitialize(nullptr))); - /// Get the main WSC interface we will be dealing with - auto inst = com::query(); - - /// This can fail if we dont have any avs registered so no com_checked - logln("unregister: {:#x}", com::retry_while_pending([&inst]() -> HRESULT { return inst->Unregister(); }) & 0xFFFFFFFF); - if (shared::ctx.state == shared::State::OFF) { - return; - } - /// WSC will reject the register request if name is empty auto name_w = std::wstring(shared::ctx.name.begin(), shared::ctx.name.end()); if (name_w.empty()) { @@ -33,11 +49,8 @@ namespace defendnot { SysFreeString(name); }; - /// Register and activate our AV - logln("register: {:#x}", com::checked(inst->Register(name, name, 0, 0))); - logln("update: {:#x}", com::checked(inst->UpdateStatus(WSCSecurityProductState::ON, WSCSecurityProductState::ON))); - logln("scan_update: {:#x}", com::checked(inst->UpdateScanSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); - logln("settings_update: {:#x}", com::checked(inst->UpdateSettingsSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); - logln("prot_update: {:#x}", com::checked(inst->UpdateProtectionUpdateSubstatus(WSCSecurityProductSubStatus::NO_ACTION))); + /// Register our stuff in the WSC interfaces + apply("IWscASStatus", name); + apply("IWscAVStatus4", name); } } // namespace defendnot diff --git a/defendnot/core/com.hpp b/defendnot/core/com.hpp index 1874f83..e98fd28 100644 --- a/defendnot/core/com.hpp +++ b/defendnot/core/com.hpp @@ -42,7 +42,7 @@ namespace defendnot { public: virtual HRESULT Register(BSTR path_to_signed_product_exe, BSTR display_name, std::uint32_t, std::uint32_t) = 0; virtual HRESULT Unregister() = 0; - virtual HRESULT UpdateStatus(WSCSecurityProductState state, WSCSecurityProductState state2) = 0; + virtual HRESULT UpdateStatus(WSCSecurityProductState state, BOOL unk) = 0; virtual HRESULT InitiateOfflineCleaning(std::uint16_t*, std::uint16_t*) = 0; virtual HRESULT NotifyUserForNearExpiration(std::uint32_t) = 0; virtual HRESULT MakeDefaultProductRequest() = 0; @@ -52,7 +52,7 @@ namespace defendnot { virtual HRESULT UpdateProtectionUpdateSubstatus(WSCSecurityProductSubStatus status) = 0; virtual HRESULT RegisterAV(std::uint16_t*, std::uint16_t*, std::uint32_t, std::uint32_t) = 0; virtual HRESULT UnregisterAV() = 0; - virtual HRESULT UpdateStatusAV(WSCSecurityProductState state, WSCSecurityProductState state2) = 0; + virtual HRESULT UpdateStatusAV(WSCSecurityProductState state, BOOL unk) = 0; virtual HRESULT InitiateOfflineCleaningAV(std::uint16_t*, std::uint16_t*) = 0; virtual HRESULT NotifyUserForNearExpirationAV(std::uint32_t) = 0; virtual HRESULT RegisterFW(std::uint16_t*, std::uint16_t*, std::uint32_t, std::uint32_t) = 0; @@ -60,6 +60,13 @@ namespace defendnot { virtual HRESULT UpdateStatusFW(WSCSecurityProductState state) = 0; virtual HRESULT RegisterAS(std::uint16_t*, std::uint16_t*, std::uint32_t, std::uint32_t) = 0; virtual HRESULT UnregisterAS() = 0; - virtual HRESULT UpdateStatusAS(WSCSecurityProductState state, WSCSecurityProductState state2) = 0; + virtual HRESULT UpdateStatusAS(WSCSecurityProductState state, BOOL unk) = 0; + }; + + class IWscASStatus : public com::IBaseObject { + public: + virtual HRESULT Register(BSTR path_to_signed_product_exe, BSTR display_name, std::uint32_t, std::uint32_t) = 0; + virtual HRESULT Unregister() = 0; + virtual HRESULT UpdateStatus(WSCSecurityProductState state, BOOL unk) = 0; }; } // namespace defendnot