diff options
author | NAKAMURA Usaku <[email protected]> | 2019-04-30 03:32:41 +0900 |
---|---|---|
committer | NAKAMURA Usaku <[email protected]> | 2019-04-30 03:33:31 +0900 |
commit | 09022b6d70ad16737964e58db039aac00a1488ea (patch) | |
tree | 3056e73503827b2cae21ddbe448fcbf47c13d62e /win32/win32.c | |
parent | b7d9ec8caa4fb9d279df22f82fe28777a98fa37e (diff) |
Use CreateToolhelp32Snapshot instead of NtQueryInformationProcess to get ppid on Windows
Try to get rid of a spec error.
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 21 |
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) { |