Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA] fix gdb/901 - attach to process running as service on Windows
@ 2002-12-26  4:53 Joel Brobecker
  2002-12-26 11:14 ` Christopher Faylor
  0 siblings, 1 reply; 3+ messages in thread
From: Joel Brobecker @ 2002-12-26  4:53 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 450 bytes --]

The following patch fixes gdb/901. I am submitting it on behalf of
Pascal Obry, who found the fix. No new regression on Windows XP.

2002-12-26  J. Brobecker  <brobecker@gnat.com>

        From Pascal Obry  <obry@act-europe.fr>
        * win32-nat.c (SetPrivilege): New routine.
        (Child_Attach): call SetPrivilege to correctly set child
        privileges to be able to debug applications running as services.

Ok to commit?

Thanks,
-- 
Joel

[-- Attachment #2: win32-nat.diff --]
[-- Type: text/plain, Size: 2609 bytes --]

Index: win32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/win32-nat.c,v
retrieving revision 1.66
diff -c -3 -p -r1.66 win32-nat.c
*** win32-nat.c	23 Nov 2002 02:49:45 -0000	1.66
--- win32-nat.c	26 Dec 2002 12:32:02 -0000
*************** has_detach_ability (void)
*** 1374,1388 ****
--- 1374,1459 ----
    return 0;
  }
  
+ /* This routine is copied from the knowledge base of the SDK
+   see article PSS ID Number: Q131065 on http://support.microsoft.com.
+ 
+   This routine is used to gain the right privileges to be able to debug
+   Windows applications running as Services.  */
+ 
+ BOOL SetPrivilege (HANDLE hToken, LPCTSTR Privilege, BOOL bEnablePrivilege)
+ {
+   TOKEN_PRIVILEGES tp;
+   LUID luid;
+   TOKEN_PRIVILEGES tpPrevious;
+   DWORD cbPrevious = sizeof (TOKEN_PRIVILEGES);
+ 
+   if (!LookupPrivilegeValue (NULL, Privilege, &luid)) 
+     return FALSE;
+ 
+   /* First pass.  Get current privilege setting.  */
+   tp.PrivilegeCount           = 1;
+   tp.Privileges[0].Luid       = luid;
+   tp.Privileges[0].Attributes = 0;
+ 
+   AdjustTokenPrivileges (hToken,
+ 			 FALSE,
+ 			 &tp,
+ 			 sizeof (TOKEN_PRIVILEGES),
+ 			 &tpPrevious,
+ 			 &cbPrevious);
+ 
+   if (GetLastError() != ERROR_SUCCESS) 
+     return FALSE;
+   
+   /* Second pass.  Set privilege based on previous setting.  */
+   tpPrevious.PrivilegeCount     = 1;
+   tpPrevious.Privileges[0].Luid = luid;
+ 
+   if (bEnablePrivilege) 
+     {
+       tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
+     }
+   else 
+     {
+       tpPrevious.Privileges[0].Attributes ^= 
+ 	(SE_PRIVILEGE_ENABLED & tpPrevious.Privileges[0].Attributes);
+     }
+ 
+   AdjustTokenPrivileges (hToken,
+ 			 FALSE,
+ 			 &tpPrevious,
+ 			 cbPrevious,
+ 			 NULL,
+ 			 NULL);
+ 
+   if (GetLastError() != ERROR_SUCCESS) 
+     return FALSE;
+   
+   return TRUE;
+ }
+ 
  /* Attach to process PID, then initialize for debugging it.  */
  static void
  child_attach (char *args, int from_tty)
  {
    BOOL ok;
    DWORD pid;
+   HANDLE hToken;
  
    if (!args)
      error_no_arg ("process-id to attach");
+ 
+   if (OpenProcessToken (GetCurrentProcess(),
+ 			TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
+ 			&hToken))
+     {
+       if (!SetPrivilege (hToken, SE_DEBUG_NAME, TRUE))
+         {
+           printf_unfiltered ("Failed to get SE_DEBUG_NAME priviledge");
+           printf_unfiltered ("This can cause attach to fail on Windows NT");
+         }
+       CloseHandle (hToken);
+     }
  
    pid = strtoul (args, 0, 0);
    ok = DebugActiveProcess (pid);

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2003-01-10 20:23 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-12-26  4:53 [RFA] fix gdb/901 - attach to process running as service on Windows Joel Brobecker
2002-12-26 11:14 ` Christopher Faylor
2003-01-10 20:23   ` Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox