diff options
Diffstat (limited to 'um/libservice/src')
-rw-r--r-- | um/libservice/src/device.cpp | 136 | ||||
-rw-r--r-- | um/libservice/src/handle.cpp | 27 | ||||
-rw-r--r-- | um/libservice/src/service.cpp | 276 | ||||
-rw-r--r-- | um/libservice/src/service_handle.cpp | 27 | ||||
-rw-r--r-- | um/libservice/src/service_manager.cpp | 44 | ||||
-rw-r--r-- | um/libservice/src/windows_error.cpp | 39 |
6 files changed, 0 insertions, 549 deletions
diff --git a/um/libservice/src/device.cpp b/um/libservice/src/device.cpp deleted file mode 100644 index 5643106..0000000 --- a/um/libservice/src/device.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <Windows.h> - -#include <cstddef> - -#include <limits> -#include <stdexcept> -#include <string> -#include <system_error> -#include <utility> - -namespace libservice -{ - namespace - { - Handle open_device(const std::string& path) - { - const auto raw = CreateFileA( - path.c_str(), - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (INVALID_HANDLE_VALUE == raw) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return Handle(raw); - } - } - - Device Device::open(const std::string& path) - { - return Device(open_device(path)); - } - - std::size_t Device::get_required_output_size( - Code code, - const void* in_buf, - std::size_t in_buf_size) const - { - DWORD nbreq; - - if (in_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("input buffer size is too large"); - - std::size_t nbwritten = DeviceIoControl( - handle, - code, - const_cast<void*>(in_buf), - static_cast<DWORD>(in_buf_size), - NULL, - 0, - &nbreq, - NULL); - - if (0 == nbwritten) - { - const auto ec = GetLastError(); - - switch (ec) - { - case ERROR_MORE_DATA: - return nbreq; - - default: - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - } - - return nbwritten; - } - - std::size_t Device::send_control_code( - Code code, - const void* in_buf, - std::size_t in_buf_size, - void* out_buf, - std::size_t out_buf_size) const - { - DWORD nbreq; - - if (in_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("input buffer size is too large"); - if (out_buf_size > std::numeric_limits<DWORD>::max()) - throw std::range_error("output buffer size is too large"); - - std::size_t nbwritten = DeviceIoControl( - handle, - code, - const_cast<void*>(in_buf), - static_cast<DWORD>(in_buf_size), - out_buf, - static_cast<DWORD>(out_buf_size), - &nbreq, - NULL); - - if (0 == nbwritten) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return nbwritten; - } - - void swap(Device& a, Device& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} - -namespace std -{ - template <> - void swap<libservice::Device>( - libservice::Device& a, - libservice::Device& b) - { - a.swap(b); - } -} diff --git a/um/libservice/src/handle.cpp b/um/libservice/src/handle.cpp deleted file mode 100644 index 7567781..0000000 --- a/um/libservice/src/handle.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <utility> - -namespace libservice -{ - void swap(Handle& a, Handle& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} - -namespace std -{ - template <> - void swap<libservice::Handle>( - libservice::Handle& a, - libservice::Handle& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} diff --git a/um/libservice/src/service.cpp b/um/libservice/src/service.cpp deleted file mode 100644 index 8b5e043..0000000 --- a/um/libservice/src/service.cpp +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <Windows.h> - -#include <string> -#include <system_error> -#include <utility> -#include <vector> - -namespace libservice -{ - namespace - { - ServiceHandle open_service( - const ServiceManager& mgr, - const std::string& name) - { - const auto raw = OpenServiceA( - mgr, - name.c_str(), - SERVICE_ALL_ACCESS); - - if (NULL == raw) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return raw; - } - - 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); - - if (NULL == raw) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return raw; - } - - void start_service(const ServiceHandle& handle) - { - if (!StartService(handle, 0, NULL)) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - } - - void stop_service(const ServiceHandle& handle) - { - SERVICE_STATUS service_status; - - if (!ControlService(handle, SERVICE_CONTROL_STOP, &service_status)) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - } - - void uninstall_service(const ServiceHandle& handle) - { - if (!DeleteService(handle)) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - } - - bool service_exists( - const ServiceManager& mgr, - const std::string& name) - { - const auto raw = OpenServiceA( - mgr, - name.c_str(), - SERVICE_QUERY_STATUS); - - if (NULL != raw) - { - ServiceHandle handle(raw); - return true; - } - - const auto ec = GetLastError(); - - switch (ec) - { - case ERROR_SERVICE_DOES_NOT_EXIST: - return false; - - default: - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - } - - SERVICE_STATUS_PROCESS query_service_status(const ServiceHandle& handle) - { - SERVICE_STATUS_PROCESS status; - DWORD nbreq; - - const auto buf_ptr = reinterpret_cast<BYTE*>(&status); - const auto buf_size = sizeof(status); - - if (!QueryServiceStatusEx( - handle, SC_STATUS_PROCESS_INFO, buf_ptr, buf_size, &nbreq)) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return status; - } - - DWORD query_service_state(const ServiceHandle& handle) - { - return query_service_status(handle).dwCurrentState; - } - - SERVICE_STATUS_PROCESS wait_for_service_state( - const ServiceHandle& handle, - const DWORD desired_state) - { - auto status = query_service_status(handle); - - DWORD old_timestamp = GetTickCount(); - - DWORD old_check_point = status.dwCheckPoint; - DWORD old_wait_hint = status.dwWaitHint; - - while (desired_state != status.dwCurrentState) - { - DWORD wait_time = old_wait_hint / 10; - - if (wait_time < 1000) - wait_time = 1000; - else if (wait_time > 10000) - wait_time = 10000; - - Sleep(wait_time); - - status = query_service_status(handle); - - if (desired_state == status.dwCurrentState) - break; - - 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; - } - } - - return status; - } - } - - Service Service::open( - const ServiceManager& mgr, - const std::string& name) - { - return open_service(mgr, name); - } - - Service Service::install( - const ServiceManager& mgr, - const std::string& name, - const std::string& bin_path) - { - return install_service(mgr, name, bin_path); - } - - bool Service::exists( - const ServiceManager& mgr, - const std::string& name) - { - return service_exists(mgr, name); - } - - void Service::start() const - { - const auto state = query_service_state(handle); - - switch (state) - { - case SERVICE_STOPPED: - break; - - case SERVICE_STOP_PENDING: - wait_for_service_state(handle, SERVICE_STOPPED); - break; - - default: - return; - } - - start_service(handle); - wait_for_service_state(handle, SERVICE_RUNNING); - } - - void Service::stop() const - { - switch (query_service_state(handle)) - { - case SERVICE_STOPPED: - return; - - case SERVICE_STOP_PENDING: - wait_for_service_state(handle, SERVICE_STOPPED); - return; - } - - stop_service(handle); - wait_for_service_state(handle, SERVICE_STOPPED); - } - - void Service::uninstall() const - { - stop(); - uninstall_service(handle); - } - - void swap(Service& a, Service& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} - -namespace std -{ - template <> - void swap<libservice::Service>( - libservice::Service& a, - libservice::Service& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} diff --git a/um/libservice/src/service_handle.cpp b/um/libservice/src/service_handle.cpp deleted file mode 100644 index adce7f0..0000000 --- a/um/libservice/src/service_handle.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <utility> - -namespace libservice -{ - void swap(ServiceHandle& a, ServiceHandle& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} - -namespace std -{ - template <> - void swap<libservice::ServiceHandle>( - libservice::ServiceHandle& a, - libservice::ServiceHandle& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} diff --git a/um/libservice/src/service_manager.cpp b/um/libservice/src/service_manager.cpp deleted file mode 100644 index 61662de..0000000 --- a/um/libservice/src/service_manager.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <Windows.h> - -#include <system_error> -#include <utility> - -namespace libservice -{ - ServiceManager ServiceManager::open() - { - SC_HANDLE raw = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - - if (NULL == raw) - { - const auto ec = GetLastError(); - throw std::system_error( - ec, WindowsErrorCategory::get(), LIBSERVICE_ERROR_PREFIX); - } - - return ServiceHandle(raw); - } - - void swap(ServiceManager& a, ServiceManager& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} - -namespace std -{ - template <> - void swap<libservice::ServiceManager>( - libservice::ServiceManager& a, - libservice::ServiceManager& b) LIBSERVICE_NOEXCEPT - { - a.swap(b); - } -} diff --git a/um/libservice/src/windows_error.cpp b/um/libservice/src/windows_error.cpp deleted file mode 100644 index f27018b..0000000 --- a/um/libservice/src/windows_error.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2015 Egor Tensin <Egor.Tensin@gmail.com> -// This file is part of the "Windows 7 drivers" project. -// For details, see https://github.com/egor-tensin/windows7-drivers. -// Distributed under the MIT License. - -#include "libservice/all.hpp" - -#include <Windows.h> - -#include <string> - -namespace libservice -{ - std::string WindowsErrorCategory::message(int code) const - { - char* buf_ptr; - - const auto nbwritten = FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - reinterpret_cast<char*>(&buf_ptr), - 0, - NULL); - - if (0 == nbwritten) - { - LocalFree(buf_ptr); - return "Couldn't format error message"; - } - - std::string str(buf_ptr, nbwritten - 2); - LocalFree(buf_ptr); - return str; - } -} |