diff --git a/src/defender-control/dcontrol.cpp b/src/defender-control/dcontrol.cpp index 0521a85..87416e3 100644 --- a/src/defender-control/dcontrol.cpp +++ b/src/defender-control/dcontrol.cpp @@ -42,9 +42,9 @@ namespace dcontrol CloseHandle(proc); } - // Stop or run the windefend service - // - bool manage_windefend(bool enable) + // TODO: create a single function + + bool manage_security_service(bool enable, std::string service_name) { auto sc_manager = OpenSCManagerA(0, 0, SC_MANAGER_CONNECT); @@ -53,7 +53,7 @@ namespace dcontrol auto service = OpenServiceA( sc_manager, - "WinDefend", + service_name.c_str(), enable ? SERVICE_ALL_ACCESS : (SERVICE_CHANGE_CONFIG | SERVICE_STOP | DELETE) ); @@ -64,9 +64,6 @@ namespace dcontrol return false; } - // TODO: Add a better implementation - // https://docs.microsoft.com/en-us/windows/win32/services/starting-a-service - if (enable) { // Change to auto-start @@ -78,14 +75,14 @@ namespace dcontrol 0, 0, 0, 0, 0, 0, 0 )) { - throw std::runtime_error("Failed to modify windefend service" + std::to_string(GetLastError())); + throw std::runtime_error("Failed to modify " + service_name + " " + std::to_string(GetLastError())); return false; } // Start the service if (!StartServiceA(service, 0, NULL)) { - throw std::runtime_error("Failed to start service"); + throw std::runtime_error("Failed to start " + service_name); return false; } } @@ -101,7 +98,7 @@ namespace dcontrol return true; throw std::runtime_error( - "Failed to stop windefend service " + std::to_string(last_error) + "Failed to stop " + service_name + " " + std::to_string(last_error) ); return false; } @@ -116,7 +113,7 @@ namespace dcontrol )) { throw std::runtime_error( - "Failed to modify windefend service" + std::to_string(GetLastError()) + "Failed to modify " + service_name + " " + std::to_string(GetLastError()) ); return false; @@ -127,12 +124,24 @@ namespace dcontrol Sleep(3000); } - CloseServiceHandle(service); - CloseServiceHandle(sc_manager); - return true; } + // Stop or run security center (wscvc) + // The default value is autostart + // + bool manage_security_center(bool enable) + { + return manage_security_service(enable, "wscsvc"); + } + + // Stop or run the windefend service + // + bool manage_windefend(bool enable) + { + return manage_security_service(enable, "WinDefend"); + } + // Disables window defender // bool disable_defender() @@ -318,6 +327,7 @@ namespace dcontrol delete helper; manage_windefend(true); + manage_security_center(true); return true; } diff --git a/src/defender-control/dcontrol.hpp b/src/defender-control/dcontrol.hpp index 04283f3..e63221f 100644 --- a/src/defender-control/dcontrol.hpp +++ b/src/defender-control/dcontrol.hpp @@ -31,4 +31,8 @@ namespace dcontrol // Stop or run the windefend service // bool manage_windefend(bool enable); + + // Stop or run the security center + // + bool manage_security_center(bool enable); } \ No newline at end of file diff --git a/src/defender-control/main.cpp b/src/defender-control/main.cpp index bfaa3d3..ce36716 100644 --- a/src/defender-control/main.cpp +++ b/src/defender-control/main.cpp @@ -27,6 +27,7 @@ int main(int argc, char** argv) { dcontrol::kill_smartscreen(); dcontrol::manage_windefend(false); + dcontrol::manage_security_center(false); dcontrol::toggle_tamper(false); printf(dcontrol::check_defender() ? diff --git a/src/defender-control/settings.hpp b/src/defender-control/settings.hpp index e2cb04b..4db34f1 100644 --- a/src/defender-control/settings.hpp +++ b/src/defender-control/settings.hpp @@ -6,4 +6,4 @@ #define DEFENDER_DISABLE 2 #define DEFENDER_GUI 3 -#define DEFENDER_CONFIG DEFENDER_ENABLE +#define DEFENDER_CONFIG DEFENDER_DISABLE