aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/um/service/src/service.cpp
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-06-15 14:05:29 +0200
committerEgor Tensin <egor@tensin.name>2026-06-15 14:12:29 +0200
commitb3eef140da853414776c8e03a70629a613a25ed0 (patch)
treedcdb314d2fdd92f501c09f3ae5681a731cb00dee /um/service/src/service.cpp
parentwdk10: disable the packaging target (diff)
downloadwindows7-drivers-b3eef140da853414776c8e03a70629a613a25ed0.tar.gz
windows7-drivers-b3eef140da853414776c8e03a70629a613a25ed0.zip
workflows/ci: add clang-format job
Diffstat (limited to 'um/service/src/service.cpp')
-rw-r--r--um/service/src/service.cpp343
1 files changed, 152 insertions, 191 deletions
diff --git a/um/service/src/service.cpp b/um/service/src/service.cpp
index b7384ce..698a9d9 100644
--- a/um/service/src/service.cpp
+++ b/um/service/src/service.cpp
@@ -9,242 +9,203 @@
#include <string>
-namespace service
-{
- namespace
- {
- ServiceHandle open_service(
- const ServiceManager& mgr,
- const std::string& name)
- {
- const auto raw = OpenServiceA(
- mgr,
- name.c_str(),
- SERVICE_ALL_ACCESS);
+namespace service {
+namespace {
- if (NULL == raw)
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
+ServiceHandle open_service(const ServiceManager& mgr, const std::string& name) {
+ const auto raw = OpenServiceA(mgr, name.c_str(), SERVICE_ALL_ACCESS);
- return raw;
- }
+ if (NULL == raw) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
- ServiceHandle install_service(
- const ServiceManager& mgr,
- const std::string& name,
- const std::string& bin_path)
- {
- const auto raw = CreateServiceA(
- mgr,
- name.c_str(),
- name.c_str(),
- SERVICE_ALL_ACCESS,
- SERVICE_KERNEL_DRIVER,
- SERVICE_DEMAND_START,
- SERVICE_ERROR_NORMAL,
- bin_path.c_str(),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL);
+ return raw;
+}
- if (NULL == raw)
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
+ServiceHandle install_service(
+ const ServiceManager& mgr,
+ const std::string& name,
+ const std::string& bin_path
+) {
+ const auto raw = CreateServiceA(
+ mgr,
+ name.c_str(),
+ name.c_str(),
+ SERVICE_ALL_ACCESS,
+ SERVICE_KERNEL_DRIVER,
+ SERVICE_DEMAND_START,
+ SERVICE_ERROR_NORMAL,
+ bin_path.c_str(),
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ );
- return raw;
- }
+ if (NULL == raw) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
- void start_service(const ServiceHandle& handle)
- {
- if (!StartService(handle, 0, NULL))
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
- }
+ return raw;
+}
- void stop_service(const ServiceHandle& handle)
- {
- SERVICE_STATUS service_status;
+void start_service(const ServiceHandle& handle) {
+ if (!StartService(handle, 0, NULL)) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
+}
- if (!ControlService(handle, SERVICE_CONTROL_STOP, &service_status))
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
- }
+void stop_service(const ServiceHandle& handle) {
+ SERVICE_STATUS service_status;
- void uninstall_service(const ServiceHandle& handle)
- {
- if (!DeleteService(handle))
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
- }
+ if (!ControlService(handle, SERVICE_CONTROL_STOP, &service_status)) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
+}
- bool service_exists(
- const ServiceManager& mgr,
- const std::string& name)
- {
- const auto raw = OpenServiceA(
- mgr,
- name.c_str(),
- SERVICE_QUERY_STATUS);
+void uninstall_service(const ServiceHandle& handle) {
+ if (!DeleteService(handle)) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
+}
- if (NULL != raw)
- {
- ServiceHandle handle(raw);
- return true;
- }
+bool service_exists(const ServiceManager& mgr, const std::string& name) {
+ const auto raw = OpenServiceA(mgr, name.c_str(), SERVICE_QUERY_STATUS);
- const auto ec = GetLastError();
+ if (NULL != raw) {
+ ServiceHandle handle(raw);
+ return true;
+ }
- switch (ec)
- {
- case ERROR_SERVICE_DOES_NOT_EXIST:
- return false;
+ const auto ec = GetLastError();
- default:
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
- }
+ switch (ec) {
+ case ERROR_SERVICE_DOES_NOT_EXIST:
+ return false;
- SERVICE_STATUS_PROCESS query_service_status(const ServiceHandle& handle)
- {
- SERVICE_STATUS_PROCESS status;
- DWORD nbreq;
+ default:
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
+}
- const auto buf_ptr = reinterpret_cast<BYTE*>(&status);
- const auto buf_size = sizeof(status);
+SERVICE_STATUS_PROCESS query_service_status(const ServiceHandle& handle) {
+ SERVICE_STATUS_PROCESS status;
+ DWORD nbreq;
- if (!QueryServiceStatusEx(
- handle, SC_STATUS_PROCESS_INFO, buf_ptr, buf_size, &nbreq))
- {
- const auto ec = GetLastError();
- throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
- }
+ const auto buf_ptr = reinterpret_cast<BYTE*>(&status);
+ const auto buf_size = sizeof(status);
- return status;
- }
+ if (!QueryServiceStatusEx(handle, SC_STATUS_PROCESS_INFO, buf_ptr, buf_size, &nbreq)) {
+ const auto ec = GetLastError();
+ throw windows_error::make(ec, __FILE__, __LINE__, __FUNCTION__);
+ }
- DWORD query_service_state(const ServiceHandle& handle)
- {
- return query_service_status(handle).dwCurrentState;
- }
+ return status;
+}
- SERVICE_STATUS_PROCESS wait_for_service_state(
- const ServiceHandle& handle,
- const DWORD desired_state)
- {
- auto status = query_service_status(handle);
+DWORD query_service_state(const ServiceHandle& handle) {
+ return query_service_status(handle).dwCurrentState;
+}
- DWORD old_timestamp = GetTickCount();
+SERVICE_STATUS_PROCESS wait_for_service_state(
+ const ServiceHandle& handle,
+ const DWORD desired_state
+) {
+ auto status = query_service_status(handle);
- DWORD old_check_point = status.dwCheckPoint;
- DWORD old_wait_hint = status.dwWaitHint;
+ DWORD old_timestamp = GetTickCount();
- while (desired_state != status.dwCurrentState)
- {
- DWORD wait_time = old_wait_hint / 10;
+ DWORD old_check_point = status.dwCheckPoint;
+ DWORD old_wait_hint = status.dwWaitHint;
- if (wait_time < 1000)
- wait_time = 1000;
- else if (wait_time > 10000)
- wait_time = 10000;
+ while (desired_state != status.dwCurrentState) {
+ DWORD wait_time = old_wait_hint / 10;
- Sleep(wait_time);
+ if (wait_time < 1000)
+ wait_time = 1000;
+ else if (wait_time > 10000)
+ wait_time = 10000;
- status = query_service_status(handle);
+ Sleep(wait_time);
- if (desired_state == status.dwCurrentState)
- break;
+ status = query_service_status(handle);
- if (status.dwCheckPoint > old_check_point)
- {
- old_timestamp = GetTickCount();
+ if (desired_state == status.dwCurrentState)
+ break;
- old_check_point = status.dwCheckPoint;
- old_wait_hint = status.dwWaitHint;
- }
- else if (GetTickCount() - old_timestamp > old_wait_hint)
- {
- return status;
- }
- }
+ if (status.dwCheckPoint > old_check_point) {
+ old_timestamp = GetTickCount();
+ old_check_point = status.dwCheckPoint;
+ old_wait_hint = status.dwWaitHint;
+ } else if (GetTickCount() - old_timestamp > old_wait_hint) {
return status;
}
}
- Service Service::open(
- const ServiceManager& mgr,
- const std::string& name)
- {
- return open_service(mgr, name);
- }
+ return status;
+}
- Service Service::install(
- const ServiceManager& mgr,
- const std::string& name,
- const std::string& bin_path)
- {
- return install_service(mgr, name, bin_path);
- }
+} // namespace
- bool Service::exists(
- const ServiceManager& mgr,
- const std::string& name)
- {
- return service_exists(mgr, name);
- }
+Service Service::open(const ServiceManager& mgr, const std::string& name) {
+ return open_service(mgr, name);
+}
- void Service::start() const
- {
- const auto state = query_service_state(handle);
+Service Service::install(
+ const ServiceManager& mgr,
+ const std::string& name,
+ const std::string& bin_path
+) {
+ return install_service(mgr, name, bin_path);
+}
- switch (state)
- {
- case SERVICE_STOPPED:
- break;
+bool Service::exists(const ServiceManager& mgr, const std::string& name) {
+ return service_exists(mgr, name);
+}
- case SERVICE_STOP_PENDING:
- wait_for_service_state(handle, SERVICE_STOPPED);
- break;
+void Service::start() const {
+ const auto state = query_service_state(handle);
- default:
- return;
- }
+ switch (state) {
+ case SERVICE_STOPPED:
+ break;
- start_service(handle);
- wait_for_service_state(handle, SERVICE_RUNNING);
+ case SERVICE_STOP_PENDING:
+ wait_for_service_state(handle, SERVICE_STOPPED);
+ break;
+
+ default:
+ return;
}
- void Service::stop() const
- {
- switch (query_service_state(handle))
- {
- case SERVICE_STOPPED:
- return;
+ start_service(handle);
+ wait_for_service_state(handle, SERVICE_RUNNING);
+}
- case SERVICE_STOP_PENDING:
- wait_for_service_state(handle, SERVICE_STOPPED);
- return;
- }
+void Service::stop() const {
+ switch (query_service_state(handle)) {
+ case SERVICE_STOPPED:
+ return;
- stop_service(handle);
- wait_for_service_state(handle, SERVICE_STOPPED);
+ case SERVICE_STOP_PENDING:
+ wait_for_service_state(handle, SERVICE_STOPPED);
+ return;
}
- void Service::uninstall() const
- {
- stop();
- uninstall_service(handle);
- }
+ stop_service(handle);
+ wait_for_service_state(handle, SERVICE_STOPPED);
}
+
+void Service::uninstall() const {
+ stop();
+ uninstall_service(handle);
+}
+
+} // namespace service