@@ -115,6 +115,60 @@ void terminateSelf() noexcept
115115 TerminateProcess (hself, 0 );
116116}
117117
118+ // Slightly modified from:
119+ // https://learn.microsoft.com/en-us/windows/win32/secauthz/enabling-and-disabling-privileges-in-c--
120+ BOOL SetPrivilege (
121+ HANDLE hToken, // access token handle
122+ LPCTSTR lpszPrivilege, // name of privilege to enable/disable
123+ BOOL bEnablePrivilege // to enable or disable privilege
124+ )
125+ {
126+ TOKEN_PRIVILEGES tp;
127+ LUID luid;
128+
129+ if (!LookupPrivilegeValue (
130+ NULL , // lookup privilege on local system
131+ lpszPrivilege, // privilege to lookup
132+ &luid)) // receives LUID of privilege
133+ {
134+ TRACE_PRINT1 (" LookupPrivilegeValue error: %u\n " , GetLastError ());
135+ return FALSE ;
136+ }
137+
138+ tp.PrivilegeCount = 1 ;
139+ tp.Privileges [0 ].Luid = luid;
140+ if (bEnablePrivilege)
141+ {
142+ tp.Privileges [0 ].Attributes = SE_PRIVILEGE_ENABLED;
143+ }
144+ else
145+ {
146+ tp.Privileges [0 ].Attributes = 0 ;
147+ }
148+
149+ // Enable the privilege or disable all privileges.
150+
151+ if (!AdjustTokenPrivileges (
152+ hToken,
153+ FALSE ,
154+ &tp,
155+ sizeof (TOKEN_PRIVILEGES),
156+ (PTOKEN_PRIVILEGES)NULL ,
157+ (PDWORD)NULL ))
158+ {
159+ TRACE_PRINT1 (" AdjustTokenPrivileges error: %u\n " , GetLastError ());
160+ return FALSE ;
161+ }
162+
163+ if (GetLastError () == ERROR_NOT_ALL_ASSIGNED)
164+ {
165+ TRACE_PRINT (" The token does not have the specified privilege.\n " );
166+ return FALSE ;
167+ }
168+
169+ return TRUE ;
170+ }
171+
118172_Must_inspect_result_
119173_Success_ (return != INVALID_HANDLE_VALUE)
120174HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_ (_Out_range_(1 ,MAXDWORD)) DWORD *pdwError)
@@ -124,6 +178,7 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
124178 DWORD dwError;
125179 BOOL bResult;
126180 HANDLE hClientProcess;
181+ HANDLE hMyToken;
127182
128183 TRACE_PRINT1 (" Original handle: %08p.\n " , hFile);
129184 if (hFile == INVALID_HANDLE_VALUE)
@@ -132,6 +187,23 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
132187 TRACE_PRINT1 (" CreateFileA failed, GLE=%d.\n " , dwError);
133188 return INVALID_HANDLE_VALUE;
134189 }
190+
191+ bResult = OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hMyToken);
192+ if (!bResult)
193+ {
194+ *pdwError = dwError = GetLastError ();
195+ TRACE_PRINT1 (" OpenProcessToken failed, GLE=%d.\n " , dwError);
196+ return INVALID_HANDLE_VALUE;
197+ }
198+
199+ bResult = SetPrivilege (hMyToken, SE_DEBUG_NAME, TRUE );
200+ if (!bResult)
201+ {
202+ *pdwError = dwError = GetLastError ();
203+ TRACE_PRINT1 (" SetPrivilege failed, GLE=%d.\n " , dwError);
204+ return INVALID_HANDLE_VALUE;
205+ }
206+
135207 hClientProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE , g_sourcePID);
136208 if (hClientProcess == NULL )
137209 {
@@ -208,13 +280,17 @@ BOOL createPipe(LPCSTR pipeName) noexcept
208280 TRACE_PRINT (" Invalid owner SID\n " );
209281 return FALSE ;
210282 }
283+
284+ SID creatorOwnerRightsSid{ 1 , 1 , SECURITY_CREATOR_SID_AUTHORITY, {SECURITY_CREATOR_OWNER_RIGHTS_RID} };
285+
211286 SECURITY_DESCRIPTOR sd;
212287 if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
213288 {
214289 TRACE_PRINT1 (" InitializeSecurityDescriptor failed: %#x\n " , GetLastError ());
215290 return FALSE ;
216291 }
217- DWORD cbDacl = sizeof (ACL) + sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD);
292+ DWORD cbDacl = sizeof (ACL) + 2 * sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD);
293+ cbDacl += GetLengthSid (&creatorOwnerRightsSid);
218294 cbDacl += GetLengthSid (tokenInfoBuffer.tokenUser .User .Sid );
219295 PACL pDacl = (PACL) HeapAlloc (hHeap, 0 , cbDacl);
220296 if (pDacl == NULL )
@@ -228,6 +304,12 @@ BOOL createPipe(LPCSTR pipeName) noexcept
228304 HeapFree (hHeap, 0 , pDacl);
229305 return FALSE ;
230306 }
307+ if (!AddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, &creatorOwnerRightsSid))
308+ {
309+ TRACE_PRINT1 (" AddAccessAllowedAce failed: %#x\n " , GetLastError ());
310+ HeapFree (hHeap, 0 , pDacl);
311+ return FALSE ;
312+ }
231313 if (!AddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, tokenInfoBuffer.tokenUser .User .Sid ))
232314 {
233315 TRACE_PRINT1 (" AddAccessAllowedAce failed: %#x\n " , GetLastError ());
0 commit comments