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
)
42 TCHAR module_fname
[MAX_PATH
];
45 if (GetModuleFileName(NULL
, module_fname
, MAX_PATH
) == 0) {
46 printf_win_error("No full path to service's executable");
50 cmdline
= g_string_new(module_fname
);
51 g_string_append(cmdline
, " -d");
54 g_string_append_printf(cmdline
, " -p %s", path
);
57 g_string_append_printf(cmdline
, " -l %s -v", logfile
);
60 g_debug("service's cmdline: %s", cmdline
->str
);
62 manager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
63 if (manager
== NULL
) {
64 printf_win_error("No handle to service control manager");
65 g_string_free(cmdline
, TRUE
);
69 service
= CreateService(manager
, QGA_SERVICE_NAME
, QGA_SERVICE_DISPLAY_NAME
,
70 SERVICE_ALL_ACCESS
, SERVICE_WIN32_OWN_PROCESS
, SERVICE_AUTO_START
,
71 SERVICE_ERROR_NORMAL
, cmdline
->str
, NULL
, NULL
, NULL
, NULL
, NULL
);
74 SERVICE_DESCRIPTION desc
= { (char *)QGA_SERVICE_DESCRIPTION
};
75 ChangeServiceConfig2(service
, SERVICE_CONFIG_DESCRIPTION
, &desc
);
77 printf("Service was installed successfully.\n");
79 printf_win_error("Failed to install service");
82 CloseServiceHandle(service
);
83 CloseServiceHandle(manager
);
85 g_string_free(cmdline
, TRUE
);
86 return (service
== NULL
);
89 int ga_uninstall_service(void)
94 manager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_ALL_ACCESS
);
95 if (manager
== NULL
) {
96 printf_win_error("No handle to service control manager");
100 service
= OpenService(manager
, QGA_SERVICE_NAME
, DELETE
);
101 if (service
== NULL
) {
102 printf_win_error("No handle to service");
103 CloseServiceHandle(manager
);
107 if (DeleteService(service
) == FALSE
) {
108 printf_win_error("Failed to delete service");
110 printf("Service was deleted successfully.\n");
113 CloseServiceHandle(service
);
114 CloseServiceHandle(manager
);