From 040bf28e0773a748ac14427a51738bb6f07dbd95 Mon Sep 17 00:00:00 2001 From: usa Date: Tue, 24 Jun 2008 02:14:00 +0000 Subject: * include/ruby/win32.h, win32/win32.c (rb_w32_getppid): now support getppid() on win32 (but only Win2k or later). * process.c (get_ppid): remove win32 special logic. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@17553 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/win32.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'win32') diff --git a/win32/win32.c b/win32/win32.c index e79bbf2ba..dec12eb8d 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -3829,6 +3829,40 @@ rb_w32_getpid(void) return pid; } + +rb_pid_t +rb_w32_getppid(void) +{ + static long (WINAPI *pNtQueryInformationProcess)(HANDLE, int, void *, ULONG, ULONG *) = NULL; + rb_pid_t ppid = 0; + + if (!IsWin95() && rb_w32_osver() >= 5) { + if (!pNtQueryInformationProcess) { + HANDLE hNtDll = GetModuleHandle("ntdll.dll"); + if (hNtDll) { + pNtQueryInformationProcess = (long (WINAPI *)(HANDLE, int, void *, ULONG, ULONG *))GetProcAddress(hNtDll, "NtQueryInformationProcess"); + if (pNtQueryInformationProcess) { + struct { + long ExitStatus; + void* PebBaseAddress; + ULONG AffinityMask; + ULONG BasePriority; + ULONG UniqueProcessId; + ULONG ParentProcessId; + } pbi; + ULONG len; + long ret = pNtQueryInformationProcess(GetCurrentProcess(), 0, &pbi, sizeof(pbi), &len); + if (!ret) { + ppid = pbi.ParentProcessId; + } + } + } + } + } + + return ppid; +} + int rb_w32_fclose(FILE *fp) { -- cgit