From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27995 invoked by alias); 26 Dec 2002 12:38:38 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 27988 invoked from network); 26 Dec 2002 12:38:35 -0000 Received: from unknown (HELO takamaka.act-europe.fr) (80.13.18.130) by 209.249.29.67 with SMTP; 26 Dec 2002 12:38:35 -0000 Received: by takamaka.act-europe.fr (Postfix, from userid 507) id 63924D34AE; Thu, 26 Dec 2002 16:38:17 +0400 (RET) Date: Thu, 26 Dec 2002 04:53:00 -0000 From: Joel Brobecker To: gdb-patches@sources.redhat.com Subject: [RFA] fix gdb/901 - attach to process running as service on Windows Message-ID: <20021226123817.GR1137@gnat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nVMJ2NtxeReIH9PS" Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2002-12/txt/msg00681.txt.bz2 --nVMJ2NtxeReIH9PS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 450 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 From Pascal Obry * 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 --nVMJ2NtxeReIH9PS Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="win32-nat.diff" Content-length: 2609 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); --nVMJ2NtxeReIH9PS--