Module: MswinBuild::ProcessTree

Extended by:
Fiddle::Importer
Includes:
Fiddle::Win32Types
Defined in:
lib/mswin-build/process_tree.rb

Constant Summary collapse

TH32CS_SNAPPROCESS =

from tlhelp32.h

0x00000002
PROCESSENTRY32 =
struct([
  "DWORD dwSize",
  "DWORD cntUsage",
  "DWORD th32ProcessID",
  "ULONG_PTR th32DefaultHeapID",
  "DWORD th32ModuleID",
  "DWORD cntThreads",
  "DWORD th32ParentProcessID",
  "long pcPriClassBase",
  "DWORD dwFlags",
  "TCHAR szExeFile[260]", # [MAX_PATH]
])

Class Method Summary collapse

Class Method Details

.terminate_process_tree(pid, code = 0) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/mswin-build/process_tree.rb', line 49

def self.terminate_process_tree(pid, code = 0)
  begin
    terminated = 0
    h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    unless pid == Process.pid
      Process.kill(:KILL, pid)
      terminated += 1
    end
    pe32 = PROCESSENTRY32.malloc
    pe32.dwSize = PROCESSENTRY32.size
    if Process32First(h, pe32) != 0
      begin
        if pe32.th32ParentProcessID == pid
          terminated += terminate_process_tree(pe32.th32ProcessID, code)
        end
      end while Process32Next(h, pe32) != 0
    else
      raise sprintf("Cannot get processes: %d", GetLastError())
    end
  ensure
    CloseHandle(h) if h
  end

  if pid == Process.pid
    Process.kill(:KILL, pid)
    terminated += 1
  end

  terminated
end