@@ -115,6 +115,60 @@ void terminateSelf() noexcept
115
115
TerminateProcess (hself, 0 );
116
116
}
117
117
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
+
118
172
_Must_inspect_result_
119
173
_Success_ (return != INVALID_HANDLE_VALUE)
120
174
HANDLE 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
124
178
DWORD dwError;
125
179
BOOL bResult;
126
180
HANDLE hClientProcess;
181
+ HANDLE hMyToken;
127
182
128
183
TRACE_PRINT1 (" Original handle: %08p.\n " , hFile);
129
184
if (hFile == INVALID_HANDLE_VALUE)
@@ -132,6 +187,23 @@ HANDLE getDeviceHandleInternal(_In_ LPCSTR SymbolicLinkA, _Out_ _On_failure_(_Ou
132
187
TRACE_PRINT1 (" CreateFileA failed, GLE=%d.\n " , dwError);
133
188
return INVALID_HANDLE_VALUE;
134
189
}
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
+
135
207
hClientProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE , g_sourcePID);
136
208
if (hClientProcess == NULL )
137
209
{
@@ -208,13 +280,17 @@ BOOL createPipe(LPCSTR pipeName) noexcept
208
280
TRACE_PRINT (" Invalid owner SID\n " );
209
281
return FALSE ;
210
282
}
283
+
284
+ SID creatorOwnerRightsSid{ 1 , 1 , SECURITY_CREATOR_SID_AUTHORITY, {SECURITY_CREATOR_OWNER_RIGHTS_RID} };
285
+
211
286
SECURITY_DESCRIPTOR sd;
212
287
if (!InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
213
288
{
214
289
TRACE_PRINT1 (" InitializeSecurityDescriptor failed: %#x\n " , GetLastError ());
215
290
return FALSE ;
216
291
}
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);
218
294
cbDacl += GetLengthSid (tokenInfoBuffer.tokenUser .User .Sid );
219
295
PACL pDacl = (PACL) HeapAlloc (hHeap, 0 , cbDacl);
220
296
if (pDacl == NULL )
@@ -228,6 +304,12 @@ BOOL createPipe(LPCSTR pipeName) noexcept
228
304
HeapFree (hHeap, 0 , pDacl);
229
305
return FALSE ;
230
306
}
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
+ }
231
313
if (!AddAccessAllowedAce (pDacl, ACL_REVISION, GENERIC_ALL, tokenInfoBuffer.tokenUser .User .Sid ))
232
314
{
233
315
TRACE_PRINT1 (" AddAccessAllowedAce failed: %#x\n " , GetLastError ());
0 commit comments