From: Magnus Hagander Date: Wed, 28 Jan 2009 11:19:40 +0000 (+0000) Subject: Support running as a service on Windows 7, by not specifying X-Git-Tag: REL8_3_6~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5b82d268e4406cb0581bfe0c9fa8e39dd35142c4;p=postgresql Support running as a service on Windows 7, by not specifying the JOB_OBJECT_UILIMIT_HANDLES flag. Dave Page & Magnus Hagander --- diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 59f304b438..cf9bb4a639 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -4,7 +4,7 @@ * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.92.2.5 2008/09/30 13:14:07 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.92.2.6 2009/01/28 11:19:40 mha Exp $ * *------------------------------------------------------------------------- */ @@ -124,7 +124,7 @@ static void pgwin32_SetServiceStatus(DWORD); static void WINAPI pgwin32_ServiceHandler(DWORD); static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *); static void pgwin32_doRunAsService(void); -static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo); +static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service); static SERVICE_STATUS status; static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0; @@ -391,7 +391,7 @@ start_postmaster(void) SYSTEMQUOTE, postgres_path, pgdata_opt, post_opts, DEVNULL, SYSTEMQUOTE); - if (!CreateRestrictedProcess(cmd, &pi)) + if (!CreateRestrictedProcess(cmd, &pi, false)) return GetLastError(); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); @@ -1213,7 +1213,7 @@ pgwin32_ServiceMain(DWORD argc, LPTSTR * argv) /* Start the postmaster */ pgwin32_SetServiceStatus(SERVICE_START_PENDING); - if (!CreateRestrictedProcess(pgwin32_CommandLine(false), &pi)) + if (!CreateRestrictedProcess(pgwin32_CommandLine(false), &pi, true)) { pgwin32_SetServiceStatus(SERVICE_STOPPED); return; @@ -1316,7 +1316,7 @@ typedef BOOL(WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, * automatically destroyed when pg_ctl exits. */ static int -CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo) +CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service) { int r; BOOL b; @@ -1452,6 +1452,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo) JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit; JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions; JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit; + OSVERSIONINFO osv; ZeroMemory(&basicLimit, sizeof(basicLimit)); ZeroMemory(&uiRestrictions, sizeof(uiRestrictions)); @@ -1462,8 +1463,23 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo) _SetInformationJobObject(job, JobObjectBasicLimitInformation, &basicLimit, sizeof(basicLimit)); uiRestrictions.UIRestrictionsClass = JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS | - JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_HANDLES | JOB_OBJECT_UILIMIT_READCLIPBOARD | + JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_READCLIPBOARD | JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS | JOB_OBJECT_UILIMIT_WRITECLIPBOARD; + + if (as_service) + { + osv.dwOSVersionInfoSize = sizeof(osv); + if (!GetVersionEx(&osv) || + osv.dwMajorVersion < 6 || + (osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0)) + { + /* + * On Windows 7 (and presumably later), JOB_OBJECT_UILIMIT_HANDLES prevents us from + * starting as a service. So we only enable it on Vista and earlier (version <= 6.0) + */ + uiRestrictions.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES; + } + } _SetInformationJobObject(job, JobObjectBasicUIRestrictions, &uiRestrictions, sizeof(uiRestrictions)); securityLimit.SecurityLimitFlags = JOB_OBJECT_SECURITY_NO_ADMIN | JOB_OBJECT_SECURITY_ONLY_TOKEN;