|
|
|
|
@ -44,14 +44,14 @@ int main(int argc, char **argv);
|
|
|
|
|
*/
|
|
|
|
|
int SCRunningAsService(void)
|
|
|
|
|
{
|
|
|
|
|
HANDLE h = INVALID_HANDLE_VALUE;
|
|
|
|
|
if ((h = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
|
|
|
|
|
SCLogInfo("Running as service: yes");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
CloseHandle(h);
|
|
|
|
|
SCLogInfo("Running as service: no");
|
|
|
|
|
return 0;
|
|
|
|
|
HANDLE h = INVALID_HANDLE_VALUE;
|
|
|
|
|
if ((h = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
|
|
|
|
|
SCLogInfo("Running as service: yes");
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
CloseHandle(h);
|
|
|
|
|
SCLogInfo("Running as service: no");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -59,24 +59,24 @@ int SCRunningAsService(void)
|
|
|
|
|
*/
|
|
|
|
|
void SCAtExitHandler(void)
|
|
|
|
|
{
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_STOPPED,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Exit handler called.");
|
|
|
|
|
|
|
|
|
|
/* mark service as stopped */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOPPED");
|
|
|
|
|
}
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_STOPPED,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Exit handler called.");
|
|
|
|
|
|
|
|
|
|
/* mark service as stopped */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOPPED");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -84,34 +84,34 @@ void SCAtExitHandler(void)
|
|
|
|
|
*/
|
|
|
|
|
static DWORD WINAPI SCServiceCtrlHandlerEx(DWORD code, DWORD etype, LPVOID edata, LPVOID context)
|
|
|
|
|
{
|
|
|
|
|
if (code == SERVICE_CONTROL_SHUTDOWN || code == SERVICE_CONTROL_STOP) {
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_STOP_PENDING,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Service control handler called with %s control code.",
|
|
|
|
|
((code == SERVICE_CONTROL_SHUTDOWN) ? ("SERVICE_CONTROL_SHUTDOWN") : ("SERVICE_CONTROL_STOP")));
|
|
|
|
|
|
|
|
|
|
/* mark service as stop pending */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOP_PENDING");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mark engine as stopping */
|
|
|
|
|
EngineStop();
|
|
|
|
|
|
|
|
|
|
return NO_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
|
|
|
if (code == SERVICE_CONTROL_SHUTDOWN || code == SERVICE_CONTROL_STOP) {
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_STOP_PENDING,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Service control handler called with %s control code.",
|
|
|
|
|
((code == SERVICE_CONTROL_SHUTDOWN) ? ("SERVICE_CONTROL_SHUTDOWN") : ("SERVICE_CONTROL_STOP")));
|
|
|
|
|
|
|
|
|
|
/* mark service as stop pending */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOP_PENDING");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mark engine as stopping */
|
|
|
|
|
EngineStop();
|
|
|
|
|
|
|
|
|
|
return NO_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -119,48 +119,48 @@ static DWORD WINAPI SCServiceCtrlHandlerEx(DWORD code, DWORD etype, LPVOID edata
|
|
|
|
|
*/
|
|
|
|
|
static void WINAPI SCServiceMain(uint32_t argc, char** argv)
|
|
|
|
|
{
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_RUNNING,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if ((service_status_handle = RegisterServiceCtrlHandlerEx(PROG_NAME, SCServiceCtrlHandlerEx, NULL)) == (SERVICE_STATUS_HANDLE)0) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't register service control handler: %d", (int)GetLastError());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* register exit handler */
|
|
|
|
|
if (atexit(SCAtExitHandler)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't register exit handler: %d", (int)GetLastError());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mark service as running immediately */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_RUNNING");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Entering main function...");
|
|
|
|
|
|
|
|
|
|
/* suricata initialization -> main loop -> uninitialization */
|
|
|
|
|
main(service_argc, service_argv);
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Leaving main function.");
|
|
|
|
|
|
|
|
|
|
/* mark service as stopped */
|
|
|
|
|
status.dwCurrentState = SERVICE_STOPPED;
|
|
|
|
|
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOPPED");
|
|
|
|
|
}
|
|
|
|
|
SERVICE_STATUS status = {
|
|
|
|
|
SERVICE_WIN32,
|
|
|
|
|
SERVICE_RUNNING,
|
|
|
|
|
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
NO_ERROR,
|
|
|
|
|
0,
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if ((service_status_handle = RegisterServiceCtrlHandlerEx(PROG_NAME, SCServiceCtrlHandlerEx, NULL)) == (SERVICE_STATUS_HANDLE)0) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't register service control handler: %d", (int)GetLastError());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* register exit handler */
|
|
|
|
|
if (atexit(SCAtExitHandler)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't register exit handler: %d", (int)GetLastError());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mark service as running immediately */
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_RUNNING");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Entering main function...");
|
|
|
|
|
|
|
|
|
|
/* suricata initialization -> main loop -> uninitialization */
|
|
|
|
|
main(service_argc, service_argv);
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Leaving main function.");
|
|
|
|
|
|
|
|
|
|
/* mark service as stopped */
|
|
|
|
|
status.dwCurrentState = SERVICE_STOPPED;
|
|
|
|
|
|
|
|
|
|
if (!SetServiceStatus(service_status_handle, &status)) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Can't set service status: %d", (int)GetLastError());
|
|
|
|
|
} else {
|
|
|
|
|
SCLogInfo("Service status set to: SERVICE_STOPPED");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -171,34 +171,34 @@ static void WINAPI SCServiceMain(uint32_t argc, char** argv)
|
|
|
|
|
*/
|
|
|
|
|
int SCServiceInit(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
SERVICE_TABLE_ENTRY DispatchTable[] = {
|
|
|
|
|
{PROG_NAME, (LPSERVICE_MAIN_FUNCTION) SCServiceMain},
|
|
|
|
|
{NULL, NULL}
|
|
|
|
|
};
|
|
|
|
|
SERVICE_TABLE_ENTRY DispatchTable[] = {
|
|
|
|
|
{PROG_NAME, (LPSERVICE_MAIN_FUNCTION) SCServiceMain},
|
|
|
|
|
{NULL, NULL}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* continue with suricata initialization */
|
|
|
|
|
if (service_initialized) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Service is already initialized.");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
/* continue with suricata initialization */
|
|
|
|
|
if (service_initialized) {
|
|
|
|
|
SCLogWarning(SC_ERR_SVC, "Service is already initialized.");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* save args */
|
|
|
|
|
service_argc = argc;
|
|
|
|
|
service_argv = argv;
|
|
|
|
|
/* save args */
|
|
|
|
|
service_argc = argc;
|
|
|
|
|
service_argv = argv;
|
|
|
|
|
|
|
|
|
|
service_initialized = 1;
|
|
|
|
|
service_initialized = 1;
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Entering service control dispatcher...");
|
|
|
|
|
SCLogInfo("Entering service control dispatcher...");
|
|
|
|
|
|
|
|
|
|
if (!StartServiceCtrlDispatcher(DispatchTable)) {
|
|
|
|
|
/* exit with failure */
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
if (!StartServiceCtrlDispatcher(DispatchTable)) {
|
|
|
|
|
/* exit with failure */
|
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCLogInfo("Leaving service control dispatcher.");
|
|
|
|
|
SCLogInfo("Leaving service control dispatcher.");
|
|
|
|
|
|
|
|
|
|
/* exit with success */
|
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
|
/* exit with success */
|
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -209,67 +209,67 @@ int SCServiceInit(int argc, char **argv)
|
|
|
|
|
*/
|
|
|
|
|
int SCServiceInstall(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
char path[2048];
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
memset(path, 0, sizeof(path));
|
|
|
|
|
|
|
|
|
|
if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* skip name of binary itself */
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
if ((strlen(argv[i]) <= strlen("--service-install")) && (strncmp("--service-install", argv[i], strlen(argv[i])) == 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
strlcat(path, " ", sizeof(path) - strlen(path) - 1);
|
|
|
|
|
strlcat(path, argv[i], sizeof(path) - strlen(path) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
service = CreateService(
|
|
|
|
|
scm,
|
|
|
|
|
PROG_NAME,
|
|
|
|
|
PROG_NAME,
|
|
|
|
|
SERVICE_ALL_ACCESS,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS,
|
|
|
|
|
SERVICE_DEMAND_START,
|
|
|
|
|
SERVICE_ERROR_NORMAL,
|
|
|
|
|
path,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
if (service == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't create service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
if (service) {
|
|
|
|
|
CloseServiceHandle(service);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scm) {
|
|
|
|
|
CloseServiceHandle(scm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
char path[2048];
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
memset(path, 0, sizeof(path));
|
|
|
|
|
|
|
|
|
|
if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* skip name of binary itself */
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
if ((strlen(argv[i]) <= strlen("--service-install")) && (strncmp("--service-install", argv[i], strlen(argv[i])) == 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
strlcat(path, " ", sizeof(path) - strlen(path) - 1);
|
|
|
|
|
strlcat(path, argv[i], sizeof(path) - strlen(path) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
service = CreateService(
|
|
|
|
|
scm,
|
|
|
|
|
PROG_NAME,
|
|
|
|
|
PROG_NAME,
|
|
|
|
|
SERVICE_ALL_ACCESS,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS,
|
|
|
|
|
SERVICE_DEMAND_START,
|
|
|
|
|
SERVICE_ERROR_NORMAL,
|
|
|
|
|
path,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
if (service == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't create service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
if (service) {
|
|
|
|
|
CloseServiceHandle(service);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scm) {
|
|
|
|
|
CloseServiceHandle(scm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -280,50 +280,50 @@ int SCServiceInstall(int argc, char **argv)
|
|
|
|
|
*/
|
|
|
|
|
int SCServiceRemove(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
SERVICE_STATUS status;
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!QueryServiceStatus(service, &status)) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't query service status: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status.dwCurrentState != SERVICE_STOPPED) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Service isn't in stopped state: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!DeleteService(service)) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't delete service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
if (service) {
|
|
|
|
|
CloseServiceHandle(service);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scm) {
|
|
|
|
|
CloseServiceHandle(scm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
SERVICE_STATUS status;
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!QueryServiceStatus(service, &status)) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't query service status: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status.dwCurrentState != SERVICE_STOPPED) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Service isn't in stopped state: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!DeleteService(service)) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't delete service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
if (service) {
|
|
|
|
|
CloseServiceHandle(service);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scm) {
|
|
|
|
|
CloseServiceHandle(scm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -334,61 +334,61 @@ int SCServiceRemove(int argc, char **argv)
|
|
|
|
|
*/
|
|
|
|
|
int SCServiceChangeParams(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
char path[2048];
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
memset(path, 0, sizeof(path));
|
|
|
|
|
|
|
|
|
|
if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* skip name of binary itself */
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
if ((strlen(argv[i]) <= strlen("--service-change-params")) && (strncmp("--service-change-params", argv[i], strlen(argv[i])) == 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
strlcat(path, " ", sizeof(path) - strlen(path) - 1);
|
|
|
|
|
strlcat(path, argv[i], sizeof(path) - strlen(path) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ChangeServiceConfig(
|
|
|
|
|
service,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS,
|
|
|
|
|
SERVICE_DEMAND_START,
|
|
|
|
|
SERVICE_ERROR_NORMAL,
|
|
|
|
|
path,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
PROG_NAME))
|
|
|
|
|
{
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't change service configuration: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
char path[2048];
|
|
|
|
|
SC_HANDLE service = NULL;
|
|
|
|
|
SC_HANDLE scm = NULL;
|
|
|
|
|
int ret = -1;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
memset(path, 0, sizeof(path));
|
|
|
|
|
|
|
|
|
|
if (GetModuleFileName(NULL, path, MAX_PATH) == 0 ){
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't get path to service binary: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* skip name of binary itself */
|
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
|
|
|
if ((strlen(argv[i]) <= strlen("--service-change-params")) && (strncmp("--service-change-params", argv[i], strlen(argv[i])) == 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
strlcat(path, " ", sizeof(path) - strlen(path) - 1);
|
|
|
|
|
strlcat(path, argv[i], sizeof(path) - strlen(path) - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open SCM: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((service = OpenService(scm, PROG_NAME, SERVICE_ALL_ACCESS)) == NULL) {
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't open service: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ChangeServiceConfig(
|
|
|
|
|
service,
|
|
|
|
|
SERVICE_WIN32_OWN_PROCESS,
|
|
|
|
|
SERVICE_DEMAND_START,
|
|
|
|
|
SERVICE_ERROR_NORMAL,
|
|
|
|
|
path,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
PROG_NAME))
|
|
|
|
|
{
|
|
|
|
|
SCLogError(SC_ERR_SVC, "Can't change service configuration: %d", (int)GetLastError());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
|
|
} while(0);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* OS_WIN32 */
|
|
|
|
|
|