summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
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 d28bd56452..2e3f6c4fe0 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) {