| Index: third_party/psutil/psutil/arch/mswindows/security.c
|
| diff --git a/third_party/psutil/psutil/arch/mswindows/security.c b/third_party/psutil/psutil/arch/mswindows/security.c
|
| deleted file mode 100644
|
| index 5a07df2f5553722448e8688d99bdc3d4f71435c6..0000000000000000000000000000000000000000
|
| --- a/third_party/psutil/psutil/arch/mswindows/security.c
|
| +++ /dev/null
|
| @@ -1,240 +0,0 @@
|
| -/*
|
| - * $Id: security.c 1142 2011-10-05 18:45:49Z g.rodola $
|
| - *
|
| - * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved.
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - *
|
| - * Security related functions for Windows platform (Set privileges such as
|
| - * SeDebug), as well as security helper functions.
|
| - */
|
| -
|
| -#include <windows.h>
|
| -#include <Python.h>
|
| -
|
| -/*
|
| - * Convert a process handle to a process token handle.
|
| - */
|
| -HANDLE
|
| -token_from_handle(HANDLE hProcess) {
|
| - HANDLE hToken = NULL;
|
| -
|
| - if (! OpenProcessToken(hProcess, TOKEN_QUERY, &hToken) ) {
|
| - return PyErr_SetFromWindowsErr(0);
|
| - }
|
| -
|
| - return hToken;
|
| -}
|
| -
|
| -
|
| -/*
|
| - * http://www.ddj.com/windows/184405986
|
| - *
|
| - * There's a way to determine whether we're running under the Local System
|
| - * account. However (you guessed it), we have to call more Win32 functions to
|
| - * determine this. Backing up through the code listing, we need to make another
|
| - * call to GetTokenInformation, but instead of passing through the TOKEN_USER
|
| - * constant, we pass through the TOKEN_PRIVILEGES constant. This value returns
|
| - * an array of privileges that the account has in the environment. Iterating
|
| - * through the array, we call the function LookupPrivilegeName looking for the
|
| - * string “SeTcbPrivilege. If the function returns this string, then this
|
| - * account has Local System privileges
|
| - */
|
| -int HasSystemPrivilege(HANDLE hProcess) {
|
| - DWORD i;
|
| - DWORD dwSize = 0;
|
| - DWORD dwRetval = 0;
|
| - TCHAR privName[256];
|
| - DWORD dwNameSize = 256;
|
| - //PTOKEN_PRIVILEGES tp = NULL;
|
| - BYTE *pBuffer = NULL;
|
| - TOKEN_PRIVILEGES* tp = NULL;
|
| - HANDLE hToken = token_from_handle(hProcess);
|
| -
|
| - if (NULL == hToken) {
|
| - return -1;
|
| - }
|
| -
|
| - // call GetTokenInformation first to get the buffer size
|
| - if (! GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwSize)) {
|
| - dwRetval = GetLastError();
|
| - // if it failed for a reason other than the buffer, bail out
|
| - if (dwRetval != ERROR_INSUFFICIENT_BUFFER ) {
|
| - PyErr_SetFromWindowsErr(dwRetval);
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| - // allocate buffer and call GetTokenInformation again
|
| - //tp = (PTOKEN_PRIVILEGES) GlobalAlloc(GPTR, dwSize);
|
| - pBuffer = (BYTE *) malloc(dwSize);
|
| -
|
| - if (pBuffer == NULL) {
|
| - PyErr_SetFromWindowsErr(0);
|
| - LocalFree(pBuffer);
|
| - return -1;
|
| - }
|
| -
|
| - if (! GetTokenInformation(hToken, TokenPrivileges, pBuffer, dwSize, &dwSize) ) {
|
| - PyErr_SetFromWindowsErr(0);
|
| - LocalFree(pBuffer);
|
| - return -1;
|
| - }
|
| -
|
| - // convert the BYTE buffer to a TOKEN_PRIVILEGES struct pointer
|
| - tp = (TOKEN_PRIVILEGES*)pBuffer;
|
| -
|
| - // check all the privileges looking for SeTcbPrivilege
|
| - for(i=0; i < tp->PrivilegeCount; i++) {
|
| - // reset the buffer contents and the buffer size
|
| - strcpy(privName, "");
|
| - dwNameSize = sizeof(privName) / sizeof(TCHAR);
|
| - if (! LookupPrivilegeName(NULL,
|
| - &tp->Privileges[i].Luid,
|
| - (LPTSTR)privName,
|
| - &dwNameSize)) {
|
| -
|
| - PyErr_SetFromWindowsErr(0);
|
| - free(pBuffer);
|
| - return -1;
|
| - }
|
| -
|
| - // if we find the SeTcbPrivilege then it's a LocalSystem process
|
| - if (! lstrcmpi(privName, TEXT("SeTcbPrivilege"))) {
|
| - free(pBuffer);
|
| - return 1;
|
| - }
|
| -
|
| - } //for
|
| -
|
| - free(pBuffer);
|
| - return 0;
|
| -}
|
| -
|
| -
|
| -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;
|
| -}
|
| -
|
| -
|
| -int SetSeDebug()
|
| -{
|
| - HANDLE hToken;
|
| - if(! OpenThreadToken(GetCurrentThread(),
|
| - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
| - FALSE,
|
| - &hToken)
|
| - ){
|
| - if (GetLastError() == ERROR_NO_TOKEN){
|
| - if (!ImpersonateSelf(SecurityImpersonation)){
|
| - CloseHandle(hToken);
|
| - return 0;
|
| - }
|
| - if (!OpenThreadToken(GetCurrentThread(),
|
| - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
| - FALSE,
|
| - &hToken)
|
| - ){
|
| - RevertToSelf();
|
| - CloseHandle(hToken);
|
| - return 0;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // enable SeDebugPrivilege (open any process)
|
| - if (! SetPrivilege(hToken, SE_DEBUG_NAME, TRUE)){
|
| - RevertToSelf();
|
| - CloseHandle(hToken);
|
| - return 0;
|
| - }
|
| -
|
| - RevertToSelf();
|
| - CloseHandle(hToken);
|
| - return 1;
|
| -}
|
| -
|
| -
|
| -int UnsetSeDebug()
|
| -{
|
| - HANDLE hToken;
|
| - if(! OpenThreadToken(GetCurrentThread(),
|
| - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
| - FALSE,
|
| - &hToken)
|
| - ){
|
| - if(GetLastError() == ERROR_NO_TOKEN){
|
| - if(! ImpersonateSelf(SecurityImpersonation)){
|
| - //Log2File("Error setting impersonation! [UnsetSeDebug()]", L_DEBUG);
|
| - return 0;
|
| - }
|
| -
|
| - if(!OpenThreadToken(GetCurrentThread(),
|
| - TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
| - FALSE,
|
| - &hToken)
|
| - ){
|
| - //Log2File("Error Opening Thread Token! [UnsetSeDebug()]", L_DEBUG);
|
| - return 0;
|
| - }
|
| - }
|
| - }
|
| -
|
| - //now disable SeDebug
|
| - if(!SetPrivilege(hToken, SE_DEBUG_NAME, FALSE)){
|
| - //Log2File("Error unsetting SeDebug Privilege [SetPrivilege()]", L_WARN);
|
| - return 0;
|
| - }
|
| -
|
| - CloseHandle(hToken);
|
| - return 1;
|
| -}
|
| -
|
|
|