summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorNAKAMURA Usaku <usa@ruby-lang.org>2019-04-30 03:32:41 +0900
committerNAKAMURA Usaku <usa@ruby-lang.org>2019-04-30 03:33:31 +0900
commit09022b6d70ad16737964e58db039aac00a1488ea (patch)
tree3056e73503827b2cae21ddbe448fcbf47c13d62e /win32
parentb7d9ec8caa4fb9d279df22f82fe28777a98fa37e (diff)
Use CreateToolhelp32Snapshot instead of NtQueryInformationProcess to get ppid on Windows
Try to get rid of a spec error.
Diffstat (limited to 'win32')
-rw-r--r--win32/win32.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/win32/win32.c b/win32/win32.c
index d28bd56..2e3f6c4 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -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) {