-
Notifications
You must be signed in to change notification settings - Fork 0
/
service.h
171 lines (162 loc) · 6.21 KB
/
service.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#ifndef SERVICE_H
#define SERVICE_H
/*
MSDN says the commandline in CreateProcess() is limited to 32768 characters
and the application name to MAX_PATH.
A service name and service display name are limited to 256 characters.
A registry key is limited to 255 characters.
A registry value is limited to 16383 characters.
Therefore we limit the service name to accommodate the path under HKLM.
*/
#define EXE_LENGTH PATH_LENGTH
#define CMD_LENGTH 32768
#define KEY_LENGTH 255
#define VALUE_LENGTH 16383
#define SERVICE_NAME_LENGTH 256
#define ACTION_LEN 16
#define NSSM_KERNEL_DRIVER _T("SERVICE_KERNEL_DRIVER")
#define NSSM_FILE_SYSTEM_DRIVER _T("SERVICE_FILE_SYSTEM_DRIVER")
#define NSSM_WIN32_OWN_PROCESS _T("SERVICE_WIN32_OWN_PROCESS")
#define NSSM_WIN32_SHARE_PROCESS _T("SERVICE_WIN32_SHARE_PROCESS")
#define NSSM_INTERACTIVE_PROCESS _T("SERVICE_INTERACTIVE_PROCESS")
#define NSSM_SHARE_INTERACTIVE_PROCESS NSSM_WIN32_SHARE_PROCESS _T("|") NSSM_INTERACTIVE_PROCESS
#define NSSM_UNKNOWN _T("?")
#define NSSM_ROTATE_OFFLINE 0
#define NSSM_ROTATE_ONLINE 1
#define NSSM_ROTATE_ONLINE_ASAP 2
typedef struct {
bool native;
TCHAR name[SERVICE_NAME_LENGTH];
TCHAR displayname[SERVICE_NAME_LENGTH];
TCHAR description[VALUE_LENGTH];
unsigned long startup;
TCHAR *username;
size_t usernamelen;
TCHAR *password;
size_t passwordlen;
unsigned long type;
TCHAR image[PATH_LENGTH];
TCHAR exe[EXE_LENGTH];
TCHAR flags[VALUE_LENGTH];
TCHAR dir[DIR_LENGTH];
TCHAR *env;
__int64 affinity;
TCHAR *dependencies;
unsigned long dependencieslen;
unsigned long envlen;
TCHAR *env_extra;
unsigned long env_extralen;
unsigned long priority;
unsigned long no_console;
TCHAR stdin_path[PATH_LENGTH];
unsigned long stdin_sharing;
unsigned long stdin_disposition;
unsigned long stdin_flags;
TCHAR stdout_path[PATH_LENGTH];
unsigned long stdout_sharing;
unsigned long stdout_disposition;
unsigned long stdout_flags;
bool use_stdout_pipe;
HANDLE stdout_si;
HANDLE stdout_pipe;
HANDLE stdout_thread;
unsigned long stdout_tid;
TCHAR stderr_path[PATH_LENGTH];
unsigned long stderr_sharing;
unsigned long stderr_disposition;
unsigned long stderr_flags;
bool use_stderr_pipe;
HANDLE stderr_si;
HANDLE stderr_pipe;
HANDLE stderr_thread;
unsigned long stderr_tid;
bool hook_share_output_handles;
bool rotate_files;
bool timestamp_log;
bool stdout_copy_and_truncate;
bool stderr_copy_and_truncate;
unsigned long rotate_stdout_online;
unsigned long rotate_stderr_online;
unsigned long rotate_seconds;
unsigned long rotate_bytes_low;
unsigned long rotate_bytes_high;
unsigned long rotate_delay;
unsigned long default_exit_action;
unsigned long restart_delay;
unsigned long throttle_delay;
unsigned long stop_method;
unsigned long kill_console_delay;
unsigned long kill_window_delay;
unsigned long kill_threads_delay;
bool kill_process_tree;
SC_HANDLE handle;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE status_handle;
HANDLE process_handle;
unsigned long pid;
HANDLE wait_handle;
unsigned long exitcode;
bool stopping;
bool allow_restart;
unsigned long throttle;
CRITICAL_SECTION throttle_section;
bool throttle_section_initialised;
CRITICAL_SECTION hook_section;
bool hook_section_initialised;
CONDITION_VARIABLE throttle_condition;
HANDLE throttle_timer;
LARGE_INTEGER throttle_duetime;
FILETIME nssm_creation_time;
FILETIME creation_time;
FILETIME exit_time;
TCHAR *initial_env;
unsigned long last_control;
unsigned long start_requested_count;
unsigned long start_count;
unsigned long exit_count;
} nssm_service_t;
void WINAPI service_main(unsigned long, TCHAR **);
TCHAR *service_control_text(unsigned long);
TCHAR *service_status_text(unsigned long);
void log_service_control(TCHAR *, unsigned long, bool);
unsigned long WINAPI service_control_handler(unsigned long, unsigned long, void *, void *);
int affinity_mask_to_string(__int64, TCHAR **);
int affinity_string_to_mask(TCHAR *, __int64 *);
unsigned long priority_mask();
int priority_constant_to_index(unsigned long);
unsigned long priority_index_to_constant(int);
nssm_service_t *alloc_nssm_service();
void set_nssm_service_defaults(nssm_service_t *);
void cleanup_nssm_service(nssm_service_t *);
SC_HANDLE open_service_manager(unsigned long);
SC_HANDLE open_service(SC_HANDLE, TCHAR *, unsigned long, TCHAR *, unsigned long);
QUERY_SERVICE_CONFIG *query_service_config(const TCHAR *, SC_HANDLE);
int append_to_dependencies(TCHAR *, unsigned long, TCHAR *, TCHAR **, unsigned long *, int);
int remove_from_dependencies(TCHAR *, unsigned long, TCHAR *, TCHAR **, unsigned long *, int);
int set_service_dependencies(const TCHAR *, SC_HANDLE, TCHAR *);
int get_service_dependencies(const TCHAR *, SC_HANDLE, TCHAR **, unsigned long *, int);
int get_service_dependencies(const TCHAR *, SC_HANDLE, TCHAR **, unsigned long *);
int set_service_description(const TCHAR *, SC_HANDLE, TCHAR *);
int get_service_description(const TCHAR *, SC_HANDLE, unsigned long, TCHAR *);
int get_service_startup(const TCHAR *, SC_HANDLE, const QUERY_SERVICE_CONFIG *, unsigned long *);
int get_service_username(const TCHAR *, const QUERY_SERVICE_CONFIG *, TCHAR **, size_t *);
void set_service_environment(nssm_service_t *);
void unset_service_environment(nssm_service_t *);
int pre_install_service(int, TCHAR **);
int pre_remove_service(int, TCHAR **);
int pre_edit_service(int, TCHAR **);
int install_service(nssm_service_t *);
int remove_service(nssm_service_t *);
int edit_service(nssm_service_t *, bool);
int control_service(unsigned long, int, TCHAR **, bool);
int control_service(unsigned long, int, TCHAR **);
void set_service_recovery(nssm_service_t *);
int monitor_service(nssm_service_t *);
int start_service(nssm_service_t *);
int stop_service(nssm_service_t *, unsigned long, bool, bool);
void CALLBACK end_service(void *, unsigned char);
void throttle_restart(nssm_service_t *);
int await_single_handle(SERVICE_STATUS_HANDLE, SERVICE_STATUS *, HANDLE, TCHAR *, TCHAR *, unsigned long);
int list_nssm_services(int, TCHAR **);
int service_process_tree(int, TCHAR **);
#endif