From d7fe576b000f57de56b7d8ba887c5889291bf920 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Fri, 24 Aug 2007 12:21:41 +0000 Subject: [PATCH] Fixed: request global privileges (Vista/Terminal Services compatibility) --- X2UtSingleInstance.pas | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/X2UtSingleInstance.pas b/X2UtSingleInstance.pas index 58d0dcd..b783e89 100644 --- a/X2UtSingleInstance.pas +++ b/X2UtSingleInstance.pas @@ -247,6 +247,33 @@ end; procedure TX2Instance.Open(); + + procedure AdjustPrivileges(); + var + tokenHandle: THandle; + luid: Int64; + newPrivileges: TTokenPrivileges; + returnLength: Cardinal; + + begin + if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or + TOKEN_QUERY, tokenHandle) then + begin + if LookupPrivilegeValue(nil, SE_CREATE_GLOBAL_NAME, luid) then + begin + FillChar(newPrivileges, SizeOf(TTokenPrivileges), #0); + newPrivileges.PrivilegeCount := 1; + newPrivileges.Privileges[0].Luid := luid; + newPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; + + returnLength := 0; + AdjustTokenPrivileges(tokenHandle, False, newPrivileges, + SizeOf(TTokenPrivileges), nil, returnLength); + end; + end; + end; + + const ScopePrefix: array[Boolean] of String = ('Local\', 'Global\'); @@ -259,6 +286,11 @@ begin FFirstInstance := True; + { Attempt to get global privileges (required for Terminal Services and + Vista) } + if Global then + AdjustPrivileges; + { Attempt to create shared memory } SetLastError(0); FFileMapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,