From 09022b6d70ad16737964e58db039aac00a1488ea Mon Sep 17 00:00:00 2001 From: NAKAMURA Usaku Date: Tue, 30 Apr 2019 03:32:41 +0900 Subject: Use CreateToolhelp32Snapshot instead of NtQueryInformationProcess to get ppid on Windows Try to get rid of a spec error. --- win32/win32.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'win32/win32.c') diff --git a/win32/win32.c b/win32/win32.c index d28bd56452..2e3f6c4fe0 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -42,6 +42,7 @@ #include #include #include +#include #if _MSC_VER >= 1400 #include #include @@ -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) { -- cgit v1.2.3