diff options
Diffstat (limited to 'winsup/cygwin/sec_helper.cc')
-rw-r--r-- | winsup/cygwin/sec_helper.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc index 1771d934c..19ab47115 100644 --- a/winsup/cygwin/sec_helper.cc +++ b/winsup/cygwin/sec_helper.cc @@ -397,3 +397,43 @@ got_it: return TRUE; } + +int +set_process_privilege (const char *privilege, BOOL enable) +{ + HANDLE hToken = NULL; + LUID restore_priv; + TOKEN_PRIVILEGES new_priv; + int ret = -1; + + if (!OpenProcessToken (hMainProc, TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + __seterrno (); + goto out; + } + + if (!LookupPrivilegeValue (NULL, privilege, &restore_priv)) + { + __seterrno (); + goto out; + } + + new_priv.PrivilegeCount = 1; + new_priv.Privileges[0].Luid = restore_priv; + new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0; + + if (!AdjustTokenPrivileges (hToken, FALSE, &new_priv, 0, NULL, NULL)) + { + __seterrno (); + goto out; + } + + ret = 0; + +out: + if (hToken) + CloseHandle (hToken); + + syscall_printf ("%d = set_process_privilege (%s, %d)",ret, privilege, enable); + return ret; +} |