aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/um/service/include/service
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2017-05-01 15:39:00 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2017-05-01 15:39:00 +0300
commit2293d0875ee3bb27b923d51550ff4ba4bf2b9669 (patch)
tree275efbfacceae4c40d47b749c1563e761a65c03f /um/service/include/service
parentservice: code style (diff)
downloadwindows7-drivers-2293d0875ee3bb27b923d51550ff4ba4bf2b9669.tar.gz
windows7-drivers-2293d0875ee3bb27b923d51550ff4ba4bf2b9669.zip
um: strip the 'lib' prefix from include/ dirs
Diffstat (limited to 'um/service/include/service')
-rw-r--r--um/service/include/service/all.hpp15
-rw-r--r--um/service/include/service/common.hpp17
-rw-r--r--um/service/include/service/device.hpp81
-rw-r--r--um/service/include/service/handle.hpp83
-rw-r--r--um/service/include/service/service.hpp79
-rw-r--r--um/service/include/service/service_handle.hpp82
-rw-r--r--um/service/include/service/service_manager.hpp69
-rw-r--r--um/service/include/service/singleton.hpp43
-rw-r--r--um/service/include/service/windows_error.hpp54
9 files changed, 523 insertions, 0 deletions
diff --git a/um/service/include/service/all.hpp b/um/service/include/service/all.hpp
new file mode 100644
index 0000000..a5761e0
--- /dev/null
+++ b/um/service/include/service/all.hpp
@@ -0,0 +1,15 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+#include "device.hpp"
+#include "handle.hpp"
+#include "service.hpp"
+#include "service_handle.hpp"
+#include "service_manager.hpp"
+#include "singleton.hpp"
+#include "windows_error.hpp"
diff --git a/um/service/include/service/common.hpp b/um/service/include/service/common.hpp
new file mode 100644
index 0000000..a1c46fb
--- /dev/null
+++ b/um/service/include/service/common.hpp
@@ -0,0 +1,17 @@
+// 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.
+
+#pragma once
+
+#define LIBSERVICE_FILE_PATH __FILE__
+#define LIBSERVICE_LINE_NUMBER __LINE__
+#define LIBSERVICE_FUNCTION_NAME __FUNCTION__
+
+#define LIBSERVICE_TO_STRING(s) LIBSERVICE_TO_STRING_(s)
+#define LIBSERVICE_TO_STRING_(s) #s
+
+#define LIBSERVICE_LINE_NUMBER_STRING LIBSERVICE_TO_STRING(LIBSERVICE_LINE_NUMBER)
+
+#define LIBSERVICE_NOEXCEPT throw()
diff --git a/um/service/include/service/device.hpp b/um/service/include/service/device.hpp
new file mode 100644
index 0000000..f61c59a
--- /dev/null
+++ b/um/service/include/service/device.hpp
@@ -0,0 +1,81 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+#include "handle.hpp"
+
+#include <Windows.h>
+
+#include <cstddef>
+
+#include <string>
+#include <utility>
+
+namespace libservice
+{
+ class Device
+ {
+ public:
+ typedef DWORD Code;
+
+ static Device open(const std::string& path);
+
+ Device(Device&& other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ }
+
+ Device& operator=(Device other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ return *this;
+ }
+
+ void swap(Device& other) LIBSERVICE_NOEXCEPT
+ {
+ using std::swap;
+ swap(handle, other.handle);
+ }
+
+ std::size_t get_required_output_size(
+ Code code,
+ const void* in_buf,
+ std::size_t in_buf_size) const;
+
+ std::size_t 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;
+
+ private:
+ Device(Handle handle)
+ : handle(std::move(handle))
+ { }
+
+ Handle handle;
+
+ Device(const Device&) = delete;
+ };
+
+ inline void swap(Device& a, Device& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
+
+namespace std
+{
+ template <>
+ inline void swap<libservice::Device>(
+ libservice::Device& a,
+ libservice::Device& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
diff --git a/um/service/include/service/handle.hpp b/um/service/include/service/handle.hpp
new file mode 100644
index 0000000..abd1d5a
--- /dev/null
+++ b/um/service/include/service/handle.hpp
@@ -0,0 +1,83 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+
+#include <Windows.h>
+
+#include <memory>
+#include <type_traits>
+#include <utility>
+
+namespace libservice
+{
+ class Handle
+ {
+ public:
+ Handle() = default;
+
+ Handle(HANDLE raw)
+ : impl(raw)
+ { }
+
+ Handle(Handle&& other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ }
+
+ Handle& operator=(Handle other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ return *this;
+ }
+
+ operator bool() const
+ {
+ return static_cast<bool>(impl);
+ }
+
+ operator HANDLE() const
+ {
+ return impl.get();
+ }
+
+ void swap(Handle& other) LIBSERVICE_NOEXCEPT
+ {
+ using std::swap;
+ swap(impl, other.impl);
+ }
+
+ private:
+ struct Deleter
+ {
+ void operator()(HANDLE raw)
+ {
+ CloseHandle(raw);
+ }
+ };
+
+ std::unique_ptr<std::remove_pointer<HANDLE>::type, Deleter> impl;
+
+ Handle(const Handle&) = delete;
+ };
+
+ inline void swap(Handle& a, Handle& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
+
+namespace std
+{
+ template <>
+ inline void swap<libservice::Handle>(
+ libservice::Handle& a,
+ libservice::Handle& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
diff --git a/um/service/include/service/service.hpp b/um/service/include/service/service.hpp
new file mode 100644
index 0000000..ca01ab4
--- /dev/null
+++ b/um/service/include/service/service.hpp
@@ -0,0 +1,79 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+#include "service_handle.hpp"
+#include "service_manager.hpp"
+
+#include <string>
+#include <utility>
+
+namespace libservice
+{
+ class Service
+ {
+ public:
+ static bool exists(
+ const ServiceManager&,
+ const std::string& name);
+
+ static Service open(
+ const ServiceManager&,
+ const std::string& name);
+
+ static Service install(
+ const ServiceManager&,
+ const std::string& name,
+ const std::string& bin_path);
+
+ void start() const;
+ void stop() const;
+ void uninstall() const;
+
+ Service(Service&& other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ }
+
+ Service& operator=(Service other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ return *this;
+ }
+
+ void swap(Service& other) LIBSERVICE_NOEXCEPT
+ {
+ using std::swap;
+ swap(handle, other.handle);
+ }
+
+ private:
+ Service(ServiceHandle handle)
+ : handle(std::move(handle))
+ { }
+
+ ServiceHandle handle;
+
+ Service(const Service&) = delete;
+ };
+
+ inline void swap(Service& a, Service& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
+
+namespace std
+{
+ template <>
+ inline void swap<libservice::Service>(
+ libservice::Service& a,
+ libservice::Service& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
diff --git a/um/service/include/service/service_handle.hpp b/um/service/include/service/service_handle.hpp
new file mode 100644
index 0000000..52e37f4
--- /dev/null
+++ b/um/service/include/service/service_handle.hpp
@@ -0,0 +1,82 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+
+#include <Windows.h>
+
+#include <memory>
+#include <utility>
+
+namespace libservice
+{
+ class ServiceHandle
+ {
+ public:
+ ServiceHandle() = default;
+
+ ServiceHandle(SC_HANDLE raw)
+ : impl(raw)
+ { }
+
+ ServiceHandle(ServiceHandle&& other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ }
+
+ ServiceHandle& operator=(ServiceHandle other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ return *this;
+ }
+
+ operator bool() const
+ {
+ return static_cast<bool>(impl);
+ }
+
+ operator SC_HANDLE() const
+ {
+ return impl.get();
+ }
+
+ void swap(ServiceHandle& other) LIBSERVICE_NOEXCEPT
+ {
+ using std::swap;
+ swap(impl, other.impl);
+ }
+
+ private:
+ struct Deleter
+ {
+ void operator()(SC_HANDLE raw)
+ {
+ CloseServiceHandle(raw);
+ }
+ };
+
+ std::unique_ptr<SC_HANDLE__, Deleter> impl;
+
+ ServiceHandle(const ServiceHandle&) = delete;
+ };
+
+ inline void swap(ServiceHandle& a, ServiceHandle& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
+
+namespace std
+{
+ template <>
+ inline void swap<libservice::ServiceHandle>(
+ libservice::ServiceHandle& a,
+ libservice::ServiceHandle& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
diff --git a/um/service/include/service/service_manager.hpp b/um/service/include/service/service_manager.hpp
new file mode 100644
index 0000000..3d4fe3a
--- /dev/null
+++ b/um/service/include/service/service_manager.hpp
@@ -0,0 +1,69 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+#include "service_handle.hpp"
+
+#include <Windows.h>
+
+#include <utility>
+
+namespace libservice
+{
+ class ServiceManager
+ {
+ public:
+ static ServiceManager open();
+
+ ServiceManager(ServiceManager&& other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ }
+
+ ServiceManager& operator=(ServiceManager other) LIBSERVICE_NOEXCEPT
+ {
+ swap(other);
+ return *this;
+ }
+
+ void swap(ServiceManager& other) LIBSERVICE_NOEXCEPT
+ {
+ using std::swap;
+ swap(handle, other.handle);
+ }
+
+ operator SC_HANDLE() const
+ {
+ return handle;
+ }
+
+ private:
+ ServiceManager(ServiceHandle handle)
+ : handle(std::move(handle))
+ { }
+
+ ServiceHandle handle;
+
+ ServiceManager(const ServiceManager&) = delete;
+ };
+
+ inline void swap(ServiceManager& a, ServiceManager& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
+
+namespace std
+{
+ template <>
+ inline void swap<libservice::ServiceManager>(
+ libservice::ServiceManager& a,
+ libservice::ServiceManager& b) LIBSERVICE_NOEXCEPT
+ {
+ a.swap(b);
+ }
+}
diff --git a/um/service/include/service/singleton.hpp b/um/service/include/service/singleton.hpp
new file mode 100644
index 0000000..1c7b1a7
--- /dev/null
+++ b/um/service/include/service/singleton.hpp
@@ -0,0 +1,43 @@
+// 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.
+
+#pragma once
+
+#include <mutex>
+
+namespace libservice
+{
+ template <typename DerivedT>
+ class Singleton
+ {
+ public:
+ static DerivedT& get()
+ {
+ std::call_once(initialized, initialize);
+ return get_unsafe();
+ }
+
+ protected:
+ Singleton() = default;
+ virtual ~Singleton() = default;
+
+ private:
+ static void initialize()
+ {
+ get_unsafe();
+ }
+
+ static DerivedT& get_unsafe()
+ {
+ static DerivedT instance;
+ return instance;
+ }
+
+ static std::once_flag initialized;
+ };
+
+ template <typename DerivedT>
+ std::once_flag Singleton<DerivedT>::initialized;
+}
diff --git a/um/service/include/service/windows_error.hpp b/um/service/include/service/windows_error.hpp
new file mode 100644
index 0000000..13d7f47
--- /dev/null
+++ b/um/service/include/service/windows_error.hpp
@@ -0,0 +1,54 @@
+// 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.
+
+#pragma once
+
+#include "common.hpp"
+#include "singleton.hpp"
+
+#include <sstream>
+#include <string>
+#include <system_error>
+
+namespace libservice
+{
+ class WindowsErrorCategory
+ : public std::error_category
+ , public Singleton<WindowsErrorCategory>
+ {
+ public:
+ const char* name() const LIBSERVICE_NOEXCEPT { return "Windows"; }
+
+ std::string message(int) const;
+
+ private:
+ friend class Singleton<WindowsErrorCategory>;
+ };
+
+ namespace error
+ {
+ inline std::string build_what(
+ const char* function,
+ const char* file,
+ int line)
+ {
+ std::ostringstream oss;
+ oss << "Error in function '" << function
+ << "' at file '" << file
+ << "', line " << line;
+ return oss.str();
+ }
+ }
+}
+
+#if defined(_MSC_VER)
+#define LIBSERVICE_ERROR_PREFIX \
+ "Error in function '" LIBSERVICE_FUNCTION_NAME "' at file '" LIBSERVICE_FILE_PATH "', line " LIBSERVICE_LINE_NUMBER_STRING
+#elif defined(__GNUC__)
+#define LIBSERVICE_ERROR_PREFIX \
+ libservice::error::build_what(LIBSERVICE_FUNCTION_NAME, LIBSERVICE_FILE_PATH, LIBSERVICE_LINE_NUMBER)
+#else
+#define LIBSERVICE_ERROR_PREFIX "Error"
+#endif