in src/native/windows/apps/prunsrv/prunsrv.c [1018:1103]
static BOOL docmdUpdateService(LPAPXCMDLINE lpCmdline)
{
APXHANDLE hService;
BOOL rv = TRUE;
apxLogWrite(APXLOG_MARK_INFO "Updating service...");
hService = apxCreateService(gPool, SC_MANAGER_CREATE_SERVICE, FALSE);
if (IS_INVALID_HANDLE(hService)) {
apxLogWrite(APXLOG_MARK_ERROR "Unable to open the Service Manager.");
return FALSE;
}
SetLastError(0);
/* Open the service */
if (!apxServiceOpen(hService, lpCmdline->szApplication, SERVICE_ALL_ACCESS)) {
/* Close the existing manager handler.
* It will be reopened inside install.
*/
apxCloseHandle(hService);
/* In case service doesn't exist try to install it.
* Install will fail if there is no minimum parameters required.
*/
return docmdInstallService(lpCmdline);
}
else {
DWORD dwStart = SERVICE_NO_CHANGE;
DWORD dwResult;
BOOL bDelayedStart = FALSE;
DWORD dwType = SERVICE_NO_CHANGE;
LPCWSTR su = NULL;
LPCWSTR sp = NULL;
if (ST_SUSER & APXCMDOPT_FOUND) {
su = SO_SUSER;
apxLogWrite(APXLOG_MARK_DEBUG "Setting service user '%S'.",
SO_SUSER);
}
if (ST_SPASSWORD & APXCMDOPT_FOUND) {
sp = SO_SPASSWORD;
apxLogWrite(APXLOG_MARK_DEBUG "Setting service password '%S'.",
SO_SPASSWORD);
}
rv = (rv && apxServiceSetNames(hService,
NULL, /* Never update the ImagePath */
SO_DISPLAYNAME,
SO_DESCRIPTION,
su,
sp));
dwResult = apxSecurityGrantFileAccessToUser(SO_LOGPATH, su);
if (dwResult) {
logGrantFileAccessFail(su, SO_LOGPATH, dwResult);
}
/* Update the --Startup mode */
if (ST_STARTUP & APXCMDOPT_FOUND) {
if (!lstrcmpiW(SO_STARTUP, PRSRV_DELAYED)) {
dwStart = SERVICE_DEMAND_START;
bDelayedStart = TRUE;
}
else if (!lstrcmpiW(SO_STARTUP, PRSRV_AUTO))
dwStart = SERVICE_AUTO_START;
else if (!lstrcmpiW(SO_STARTUP, PRSRV_MANUAL))
dwStart = SERVICE_DEMAND_START;
}
if (ST_TYPE & APXCMDOPT_FOUND) {
if (!lstrcmpiW(SO_TYPE, STYPE_INTERACTIVE))
dwType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
}
rv = (rv && apxServiceSetOptions(hService,
SO_DEPENDSON,
dwType,
dwStart,
bDelayedStart,
SERVICE_NO_CHANGE));
apxLogWrite(APXLOG_MARK_INFO "Updated service '%S'.",
lpCmdline->szApplication);
rv = (rv && saveConfiguration(lpCmdline));
}
apxCloseHandle(hService);
if (rv)
apxLogWrite(APXLOG_MARK_INFO "Finished updating service '%S'.", lpCmdline->szApplication);
else
apxLogWrite(APXLOG_MARK_INFO "Failed updating service '%S'.",
lpCmdline->szApplication);
return rv;
}