2 * QEMU Guest Agent helpers for win32 service management
4 * Copyright IBM Corp. 2012
7 * Gal Hammer <ghammer@redhat.com>
8 * Michael Roth <mdroth@linux.vnet.ibm.com>
10 * This work is licensed under the terms of the GNU GPL, version 2 or later.
11 * See the COPYING file in the top-level directory.
17 #include "qga/service-win32.h"
19 static int printf_win_error(const char *text
)
21 DWORD err
= GetLastError();
25 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|
26 FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS
,
29 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
32 n
= printf("%s. (Error: %d) %s", text
, (int)err
, message
);
38 int ga_install_service(const char *path
, const char *logfile
,
39 const char *state_dir
)
43 TCHAR module_fname
[MAX_PATH
];
46 if (GetModuleFileName(NULL
, module_fname
, MAX_PATH
) == 0) {
47 printf_win_error("No full path to service's executable");
51 cmdline
= g_string_new(module_fname
);
52 g_string_append(cmdline
, " -d");
55 g_string_append_printf(cmdline
, " -p %s", path
);
58 g_string_append_printf(cmdline
, " -l %s -v", logfile
);
61 g_string_append_printf(cmdline
, " -t %s", state_dir
);
64 g_debug("service's cmdline: %s", cmdline
->str
);
66 manager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
67 if (manager
== NULL
) {
68 printf_win_error("No handle to service control manager");
69 g_string_free(cmdline
, TRUE
);
73 service
= CreateService(manager
, QGA_SERVICE_NAME
, QGA_SERVICE_DISPLAY_NAME
,
74 SERVICE_ALL_ACCESS
, SERVICE_WIN32_OWN_PROCESS
, SERVICE_AUTO_START
,
75 SERVICE_ERROR_NORMAL
, cmdline
->str
, NULL
, NULL
, NULL
, NULL
, NULL
);
78 SERVICE_DESCRIPTION desc
= { (char *)QGA_SERVICE_DESCRIPTION
};
79 ChangeServiceConfig2(service
, SERVICE_CONFIG_DESCRIPTION
, &desc
);
81 printf("Service was installed successfully.\n");
83 printf_win_error("Failed to install service");
86 CloseServiceHandle(service
);
87 CloseServiceHandle(manager
);
89 g_string_free(cmdline
, TRUE
);
90 return (service
== NULL
);
93 int ga_uninstall_service(void)
98 manager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
99 if (manager
== NULL
) {
100 printf_win_error("No handle to service control manager");
104 service
= OpenService(manager
, QGA_SERVICE_NAME
, DELETE
);
105 if (service
== NULL
) {
106 printf_win_error("No handle to service");
107 CloseServiceHandle(manager
);
111 if (DeleteService(service
) == FALSE
) {
112 printf_win_error("Failed to delete service");
114 printf("Service was deleted successfully.\n");
117 CloseServiceHandle(service
);
118 CloseServiceHandle(manager
);