@@ -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)
@@ -123,6 +177,7 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
123177 HANDLE hFileDup;
124178 BOOL bResult;
125179 HANDLE hClientProcess;
180+ HANDLE hMyToken;
126181
127182 TRACE_PRINT1 (" Original handle: %08p.\n " , hFile);
128183 if (hFile == INVALID_HANDLE_VALUE)
@@ -131,6 +186,23 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
131186 TRACE_PRINT1 (" CreateFileA failed, GLE=%d.\n " , *pdwError);
132187 return INVALID_HANDLE_VALUE;
133188 }
189+
190+ bResult = OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hMyToken);
191+ if (!bResult)
192+ {
193+ *pdwError = dwError = GetLastError ();
194+ TRACE_PRINT1 (" OpenProcessToken failed, GLE=%d.\n " , dwError);
195+ return INVALID_HANDLE_VALUE;
196+ }
197+
198+ bResult = SetPrivilege (hMyToken, SE_DEBUG_NAME, TRUE );
199+ if (!bResult)
200+ {
201+ *pdwError = dwError = GetLastError ();
202+ TRACE_PRINT1 (" SetPrivilege failed, GLE=%d.\n " , dwError);
203+ return INVALID_HANDLE_VALUE;
204+ }
205+
134206 hClientProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE , g_sourcePID);
135207 if (hClientProcess == NULL )
136208 {
@@ -206,13 +278,17 @@ BOOL createPipe(LPCSTR pipeName) noexcept
206278 TRACE_PRINT (" Invalid owner SID\n " );
207279 return FALSE ;
208280 }
281+
282+ SID creatorOwnerRightsSid{ 1 , 1 , SECURITY_CREATOR_SID_AUTHORITY, {SECURITY_CREATOR_OWNER_RIGHTS_RID} };
283+
209284 SECURITY_DESCRIPTOR sd;
210285 if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
211286 {
212287 TRACE_PRINT1 (" InitializeSecurityDescriptor failed: %#x\n " , GetLastError ());
213288 return FALSE ;
214289 }
215- DWORD cbDacl = sizeof (ACL) + sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD);
290+ DWORD cbDacl = sizeof (ACL) + 2 * sizeof (ACCESS_ALLOWED_ACE) - sizeof (DWORD);
291+ cbDacl += GetLengthSid (&creatorOwnerRightsSid);
216292 cbDacl += GetLengthSid (tokenInfoBuffer.tokenUser .User .Sid );
217293 PACL pDacl = (PACL) HeapAlloc (hHeap, 0 , cbDacl);
218294 if (pDacl == NULL )
@@ -226,6 +302,12 @@ BOOL createPipe(LPCSTR pipeName) noexcept
226302 HeapFree (hHeap, 0 , pDacl);
227303 return FALSE ;
228304 }
305+ if (!AddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, &creatorOwnerRightsSid))
306+ {
307+ TRACE_PRINT1 (" AddAccessAllowedAce failed: %#x\n " , GetLastError ());
308+ HeapFree (hHeap, 0 , pDacl);
309+ return FALSE ;
310+ }
229311 if (!AddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, tokenInfoBuffer.tokenUser .User .Sid ))
230312 {
231313 TRACE_PRINT1 (" AddAccessAllowedAce failed: %#x\n " , GetLastError ());
0 commit comments