+static SC_HANDLE manager = NULL;
+static SC_HANDLE service = NULL;
+static SERVICE_STATUS status = {0};
+static SERVICE_STATUS_HANDLE statushandle = 0;
+
+static bool install_service(void) {
+ char command[4096] = "\"";
+ SERVICE_DESCRIPTION description = {"Virtual Private Network daemon"};
+
+ manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+ if(!manager) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Could not open service manager: %s", winerror(GetLastError()));
+ return false;
+ }
+
+ if(!strchr(program_name, '\\')) {
+ GetCurrentDirectory(sizeof command - 1, command + 1);
+ strncat(command, "\\", sizeof command - strlen(command));
+ }
+
+ strncat(command, program_name, sizeof command - strlen(command));
+
+ strncat(command, "\"", sizeof command - strlen(command));
+
+ for(char **argp = g_argv + 1; *argp; argp++) {
+ char *space = strchr(*argp, ' ');
+ strncat(command, " ", sizeof command - strlen(command));
+
+ if(space)
+ strncat(command, "\"", sizeof command - strlen(command));
+
+ strncat(command, *argp, sizeof command - strlen(command));
+
+ if(space)
+ strncat(command, "\"", sizeof command - strlen(command));
+ }
+
+ service = CreateService(manager, identname, identname,
+ SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
+ command, NULL, NULL, NULL, NULL, NULL);