44 *
55 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
66 *
7- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.107 2009/01/15 22:33:19 petere Exp $
7+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.108 2009/01/28 11:19:37 mha Exp $
88 *
99 *-------------------------------------------------------------------------
1010 */
@@ -121,7 +121,7 @@ static void pgwin32_SetServiceStatus(DWORD);
121121static void WINAPI pgwin32_ServiceHandler (DWORD );
122122static void WINAPI pgwin32_ServiceMain (DWORD , LPTSTR * );
123123static void pgwin32_doRunAsService (void );
124- static int CreateRestrictedProcess (char * cmd , PROCESS_INFORMATION * processInfo );
124+ static int CreateRestrictedProcess (char * cmd , PROCESS_INFORMATION * processInfo , bool as_service );
125125
126126static SERVICE_STATUS status ;
127127static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE ) 0 ;
@@ -385,7 +385,7 @@ start_postmaster(void)
385385 snprintf (cmd , MAXPGPATH , "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1" SYSTEMQUOTE ,
386386 postgres_path , pgdata_opt , post_opts , DEVNULL );
387387
388- if (!CreateRestrictedProcess (cmd , & pi ))
388+ if (!CreateRestrictedProcess (cmd , & pi , false ))
389389 return GetLastError ();
390390 CloseHandle (pi .hProcess );
391391 CloseHandle (pi .hThread );
@@ -1210,7 +1210,7 @@ pgwin32_ServiceMain(DWORD argc, LPTSTR * argv)
12101210
12111211 /* Start the postmaster */
12121212 pgwin32_SetServiceStatus (SERVICE_START_PENDING );
1213- if (!CreateRestrictedProcess (pgwin32_CommandLine (false), & pi ))
1213+ if (!CreateRestrictedProcess (pgwin32_CommandLine (false), & pi , true ))
12141214 {
12151215 pgwin32_SetServiceStatus (SERVICE_STOPPED );
12161216 return ;
@@ -1313,7 +1313,7 @@ typedef BOOL(WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS,
13131313 * automatically destroyed when pg_ctl exits.
13141314 */
13151315static int
1316- CreateRestrictedProcess (char * cmd , PROCESS_INFORMATION * processInfo )
1316+ CreateRestrictedProcess (char * cmd , PROCESS_INFORMATION * processInfo , bool as_service )
13171317{
13181318 int r ;
13191319 BOOL b ;
@@ -1449,6 +1449,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo)
14491449 JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit ;
14501450 JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions ;
14511451 JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit ;
1452+ OSVERSIONINFO osv ;
14521453
14531454 ZeroMemory (& basicLimit , sizeof (basicLimit ));
14541455 ZeroMemory (& uiRestrictions , sizeof (uiRestrictions ));
@@ -1459,8 +1460,23 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo)
14591460 _SetInformationJobObject (job , JobObjectBasicLimitInformation , & basicLimit , sizeof (basicLimit ));
14601461
14611462 uiRestrictions .UIRestrictionsClass = JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS |
1462- JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_HANDLES | JOB_OBJECT_UILIMIT_READCLIPBOARD |
1463+ JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_READCLIPBOARD |
14631464 JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS | JOB_OBJECT_UILIMIT_WRITECLIPBOARD ;
1465+
1466+ if (as_service )
1467+ {
1468+ osv .dwOSVersionInfoSize = sizeof (osv );
1469+ if (!GetVersionEx (& osv ) ||
1470+ osv .dwMajorVersion < 6 ||
1471+ (osv .dwMajorVersion == 6 && osv .dwMinorVersion == 0 ))
1472+ {
1473+ /*
1474+ * On Windows 7 (and presumably later), JOB_OBJECT_UILIMIT_HANDLES prevents us from
1475+ * starting as a service. So we only enable it on Vista and earlier (version <= 6.0)
1476+ */
1477+ uiRestrictions .UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES ;
1478+ }
1479+ }
14641480 _SetInformationJobObject (job , JobObjectBasicUIRestrictions , & uiRestrictions , sizeof (uiRestrictions ));
14651481
14661482 securityLimit .SecurityLimitFlags = JOB_OBJECT_SECURITY_NO_ADMIN | JOB_OBJECT_SECURITY_ONLY_TOKEN ;
0 commit comments