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);