1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Use CreateToolhelp32Snapshot instead of NtQueryInformationProcess to get ppid on Windows

Try to get rid of a spec error.
This commit is contained in:
NAKAMURA Usaku 2019-04-30 03:32:41 +09:00
parent b7d9ec8caa
commit 09022b6d70

View file

@ -42,6 +42,7 @@
#include <shlobj.h>
#include <mbstring.h>
#include <shlwapi.h>
#include <tlhelp32.h>
#if _MSC_VER >= 1400
#include <crtdbg.h>
#include <rtcapi.h>
@ -6139,6 +6140,26 @@ rb_w32_getppid(void)
static query_func *pNtQueryInformationProcess = (query_func *)-1;
rb_pid_t ppid = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE) {
BOOL ok;
PROCESSENTRY32 pe;
DWORD pid = GetCurrentProcessId();
pe.dwSize = sizeof(pe);
ok = Process32First(hSnap, &pe);
while (ok) {
if (pe.th32ProcessID == pid) {
ppid = (rb_pid_t)pe.th32ParentProcessID;
break;
}
ok = Process32Next(hSnap, &pe);
}
CloseHandle(hSnap);
if (ppid != 0) {
return ppid;
}
}
if (pNtQueryInformationProcess == (query_func *)-1)
pNtQueryInformationProcess = (query_func *)get_proc_address("ntdll.dll", "NtQueryInformationProcess", NULL);
if (pNtQueryInformationProcess) {