diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2020-12-14 14:09:18 +0100 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2020-12-14 14:09:18 +0100 |
commit | 0f0c29eb78bd86e98d86d76615f7c46c44bff49b (patch) | |
tree | 1983c0dff9bb7b4a3a2bcc3c2c22280ce29c8f74 | |
parent | 6ea12c3c0a93b1370a1db2670cda60eadbf618dd (diff) | |
download | psutil-0f0c29eb78bd86e98d86d76615f7c46c44bff49b.tar.gz |
issue #1877: turn OpenProcess -> ERROR_SUCCESS into AD or NSP
Signed-off-by: Giampaolo Rodola <g.rodola@gmail.com>
-rw-r--r-- | psutil/arch/windows/process_utils.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/psutil/arch/windows/process_utils.c b/psutil/arch/windows/process_utils.c index f9d2f2f9..b40449be 100644 --- a/psutil/arch/windows/process_utils.c +++ b/psutil/arch/windows/process_utils.c @@ -55,14 +55,16 @@ psutil_get_pids(DWORD *numberOfReturnedPIDs) { // Return 1 if PID exists, 0 if not, -1 on error. int -psutil_pid_in_pids(DWORD pid) { +psutil_pid_exists(DWORD pid) { DWORD *proclist = NULL; DWORD numberOfReturnedPIDs; DWORD i; proclist = psutil_get_pids(&numberOfReturnedPIDs); - if (proclist == NULL) + if (proclist == NULL) { + psutil_debug("psutil_get_pids() failed"); return -1; + } for (i = 0; i < numberOfReturnedPIDs; i++) { if (proclist[i] == pid) { free(proclist); @@ -85,7 +87,22 @@ psutil_check_phandle(HANDLE hProcess, DWORD pid) { if (GetLastError() == ERROR_INVALID_PARAMETER) { // Yeah, this is the actual error code in case of // "no such process". - NoSuchProcess("OpenProcess"); + psutil_debug("OpenProcess -> ERROR_INVALID_PARAMETER turned " + "into NSP"); + NoSuchProcess("OpenProcess -> ERROR_INVALID_PARAMETER"); + return NULL; + } + if (GetLastError() == ERROR_SUCCESS) { + // Yeah, it's this bad. + // https://github.com/giampaolo/psutil/issues/1877 + if (psutil_pid_exists(pid) == 1) { + psutil_debug("OpenProcess -> ERROR_SUCCESS turned into AD"); + AccessDenied("OpenProcess -> ERROR_SUCCESS"); + } + else { + psutil_debug("OpenProcess -> ERROR_SUCCESS turned into NSP"); + NoSuchProcess("OpenProcess -> ERROR_SUCCESS"); + } return NULL; } PyErr_SetFromOSErrnoWithSyscall("OpenProcess"); @@ -98,7 +115,7 @@ psutil_check_phandle(HANDLE hProcess, DWORD pid) { if (exitCode == STILL_ACTIVE) { return hProcess; } - if (psutil_pid_in_pids(pid) == 1) { + if (psutil_pid_exists(pid) == 1) { return hProcess; } CloseHandle(hProcess); @@ -167,5 +184,5 @@ psutil_pid_is_running(DWORD pid) { CloseHandle(hProcess); PyErr_Clear(); - return psutil_pid_in_pids(pid); + return psutil_pid_exists(pid); } |