32 static SERVICE_STATUS_HANDLE service_status_handle = 0;
34 static int service_argc = 0;
36 static char **service_argv = NULL;
38 static int service_initialized = 0;
40 int main(
int argc,
char **argv);
45 int SCRunningAsService(
void)
47 HANDLE h = INVALID_HANDLE_VALUE;
48 if ((h = CreateFile(
"CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
60 static void SCAtExitHandler(
void)
62 SERVICE_STATUS status = {
65 SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
75 if (!SetServiceStatus(service_status_handle, &status)) {
78 SCLogInfo(
"Service status set to: SERVICE_STOPPED");
85 static DWORD WINAPI SCServiceCtrlHandlerEx(DWORD
code, DWORD etype, LPVOID edata, LPVOID context)
87 if (code == SERVICE_CONTROL_SHUTDOWN || code == SERVICE_CONTROL_STOP) {
88 SERVICE_STATUS status = {
91 SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
98 SCLogInfo(
"Service control handler called with %s control code.",
99 ((code == SERVICE_CONTROL_SHUTDOWN) ? (
"SERVICE_CONTROL_SHUTDOWN") : (
"SERVICE_CONTROL_STOP")));
102 if (!SetServiceStatus(service_status_handle, &status)) {
105 SCLogInfo(
"Service status set to: SERVICE_STOP_PENDING");
114 return ERROR_CALL_NOT_IMPLEMENTED;
120 static void WINAPI SCServiceMain(uint32_t argc,
char** argv)
122 SERVICE_STATUS status = {
125 SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
132 if ((service_status_handle = RegisterServiceCtrlHandlerEx((
char *)
PROG_NAME, SCServiceCtrlHandlerEx, NULL)) == (SERVICE_STATUS_HANDLE)0) {
138 if (atexit(SCAtExitHandler)) {
143 if (!SetServiceStatus(service_status_handle, &status)) {
146 SCLogInfo(
"Service status set to: SERVICE_RUNNING");
152 main(service_argc, service_argv);
157 status.dwCurrentState = SERVICE_STOPPED;
159 if (!SetServiceStatus(service_status_handle, &status)) {
162 SCLogInfo(
"Service status set to: SERVICE_STOPPED");
172 int SCServiceInit(
int argc,
char **argv)
174 SERVICE_TABLE_ENTRY DispatchTable[] = {
175 {(
char *)
PROG_NAME, (LPSERVICE_MAIN_FUNCTION) SCServiceMain},
180 if (service_initialized) {
189 service_initialized = 1;
191 SCLogInfo(
"Entering service control dispatcher...");
193 if (!StartServiceCtrlDispatcher(DispatchTable)) {
198 SCLogInfo(
"Leaving service control dispatcher.");
210 int SCServiceInstall(
int argc,
char **argv)
213 SC_HANDLE service = NULL;
214 SC_HANDLE scm = NULL;
219 memset(path, 0,
sizeof(path));
221 if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
227 for (i = 1; i < argc; i++) {
228 if ((strlen(argv[i]) <= strlen(
"--service-install")) && (strncmp(
"--service-install", argv[i], strlen(argv[i])) == 0)) {
231 strlcat(path,
" ",
sizeof(path) - strlen(path) - 1);
232 strlcat(path, argv[i],
sizeof(path) - strlen(path) - 1);
235 if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
240 service = CreateService(
245 SERVICE_WIN32_OWN_PROCESS,
246 SERVICE_DEMAND_START,
247 SERVICE_ERROR_NORMAL,
255 if (service == NULL) {
265 CloseServiceHandle(service);
269 CloseServiceHandle(scm);
281 int SCServiceRemove(
int argc,
char **argv)
283 SERVICE_STATUS status;
284 SC_HANDLE service = NULL;
285 SC_HANDLE scm = NULL;
289 if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
294 if ((service = OpenService(scm,
PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
299 if (!QueryServiceStatus(service, &status)) {
304 if (status.dwCurrentState != SERVICE_STOPPED) {
309 if (!DeleteService(service)) {
319 CloseServiceHandle(service);
323 CloseServiceHandle(scm);
335 int SCServiceChangeParams(
int argc,
char **argv)
338 SC_HANDLE service = NULL;
339 SC_HANDLE scm = NULL;
344 memset(path, 0,
sizeof(path));
346 if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
352 for (i = 1; i < argc; i++) {
353 if ((strlen(argv[i]) <= strlen(
"--service-change-params")) && (strncmp(
"--service-change-params", argv[i], strlen(argv[i])) == 0)) {
356 strlcat(path,
" ",
sizeof(path) - strlen(path) - 1);
357 strlcat(path, argv[i],
sizeof(path) - strlen(path) - 1);
360 if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
365 if ((service = OpenService(scm,
PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
370 if (!ChangeServiceConfig(
372 SERVICE_WIN32_OWN_PROCESS,
373 SERVICE_DEMAND_START,
374 SERVICE_ERROR_NORMAL,
size_t strlcat(char *, const char *src, size_t siz)
#define SCLogError(err_code,...)
Macro used to log ERROR messages.
#define SCLogWarning(err_code,...)
Macro used to log WARNING messages.
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
int main(int argc, char **argv)
void EngineStop(void)
make sure threads can stop the engine by calling this function. Purpose: pcap file mode needs to be a...