Deskflow 1.22.0.197
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
ArchDaemonWindows.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include "arch/IArchDaemon.h"
12
13#define WIN32_LEAN_AND_MEAN
14#include <Windows.h>
15#include <tchar.h>
16
17#include <functional>
18#include <string>
19
20#define ARCH_DAEMON ArchDaemonWindows
21
24{
25public:
26 using RunFunc = std::function<int()>;
27
29 ~ArchDaemonWindows() override = default;
30
32
44 static int runDaemon(RunFunc runFunc);
45
47
52 static void daemonRunning(bool running);
53
55
59 static void daemonFailed(int result);
60
62
67 static UINT getDaemonQuitMessage();
68
69 // IArchDaemon overrides
70 void installDaemon(
71 const char *name, const char *description, const char *pathname, const char *commandLine, const char *dependencies
72 ) override;
73 void uninstallDaemon(const char *name) override;
74 void installDaemon() override;
75 void uninstallDaemon() override;
76 int daemonize(const char *name, DaemonFunc const &func) override;
77 bool canInstallDaemon(const char *name) override;
78 bool isDaemonInstalled(const char *name) override;
79 std::string commandLine() const override
80 {
81 return m_commandLine;
82 }
83
84private:
85 static HKEY openNTServicesKey();
86
87 int doRunDaemon(RunFunc runFunc);
88 void doDaemonRunning(bool running);
89 UINT doGetDaemonQuitMessage();
90
91 static void setStatus(DWORD state);
92 static void setStatus(DWORD state, DWORD step, DWORD waitHint);
93 static void setStatusError(DWORD error);
94
95 static bool isRunState(DWORD state);
96
97 void serviceMain(DWORD, LPTSTR *);
98 static void WINAPI serviceMainEntry(DWORD, LPTSTR *);
99
100 void serviceHandler(DWORD ctrl);
101 static void WINAPI serviceHandlerEntry(DWORD ctrl);
102
103 void start(const char *name);
104 void stop(const char *name);
105
106private:
107 class XArchDaemonRunFailed
108 {
109 public:
110 XArchDaemonRunFailed(int result) : m_result(result)
111 {
112 }
113
114 public:
115 int m_result;
116 };
117
118private:
119 static ArchDaemonWindows *s_daemon;
120
121 ArchMutex m_serviceMutex;
122 ArchCond m_serviceCondVar;
123 DWORD m_serviceState;
124 bool m_serviceHandlerWaiting;
125 bool m_serviceRunning;
126
127 DWORD m_daemonThreadID;
128 DaemonFunc m_daemonFunc;
129 int m_daemonResult;
130
131 SERVICE_STATUS_HANDLE m_statusHandle;
132
133 UINT m_quitMessage;
134
135 std::string m_commandLine;
136};
137
138#define DEFAULT_DAEMON_INFO _T("Runs the Core process on secure desktops (UAC prompts, login screen, etc).")
139
140#define LEGACY_SERVER_DAEMON_NAME _T("Deskflow Server")
141#define LEGACY_CLIENT_DAEMON_NAME _T("Deskflow Client")
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:27
static const WSAEVENT FAR DWORD
Definition ArchNetworkWinsock.cpp:54
static int(PASCAL FAR *bind_winsock)(SOCKET s
ArchMutexImpl * ArchMutex
Opaque mutex type. An opaque type representing a mutex.
Definition IArchMultithread.h:39
ArchCondImpl * ArchCond
Opaque condition variable type. An opaque type representing a condition variable.
Definition IArchMultithread.h:25
void uninstallDaemon() override
Uninstall daemon.
Definition ArchDaemonWindows.cpp:622
~ArchDaemonWindows() override=default
bool canInstallDaemon(const char *name) override
Check if user has permission to install the daemon.
Definition ArchDaemonWindows.cpp:221
void installDaemon() override
Install daemon.
Definition ArchDaemonWindows.cpp:606
static UINT getDaemonQuitMessage()
Get daemon quit message.
Definition ArchDaemonWindows.cpp:42
static void daemonRunning(bool running)
Indicate daemon is in main loop.
Definition ArchDaemonWindows.cpp:35
bool isDaemonInstalled(const char *name) override
Check if the daemon is installed.
Definition ArchDaemonWindows.cpp:237
std::function< int()> RunFunc
Definition ArchDaemonWindows.h:26
static void daemonFailed(int result)
Indicate failure of running daemon.
Definition ArchDaemonWindows.cpp:51
std::string commandLine() const override
Get the command line.
Definition ArchDaemonWindows.h:79
static int runDaemon(RunFunc runFunc)
Run the daemon.
Definition ArchDaemonWindows.cpp:29
int daemonize(const char *name, DaemonFunc const &func) override
Daemonize the process.
Definition ArchDaemonWindows.cpp:193
ArchDaemonWindows()
Definition ArchDaemonWindows.cpp:24
Interface for architecture dependent daemonizing.
Definition IArchDaemon.h:22
std::function< int(int, const char **)> DaemonFunc
Definition IArchDaemon.h:24