| # This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| # You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| from ctypes import sizeof, windll, addressof, c_wchar, create_unicode_buffer |
| from ctypes.wintypes import DWORD, HANDLE |
| |
| PROCESS_TERMINATE = 0x0001 |
| PROCESS_QUERY_INFORMATION = 0x0400 |
| PROCESS_VM_READ = 0x0010 |
| |
| def get_pids(process_name): |
| BIG_ARRAY = DWORD * 4096 |
| processes = BIG_ARRAY() |
| needed = DWORD() |
| |
| pids = [] |
| result = windll.psapi.EnumProcesses(processes, |
| sizeof(processes), |
| addressof(needed)) |
| if not result: |
| return pids |
| |
| num_results = needed.value / sizeof(DWORD) |
| |
| for i in range(num_results): |
| pid = processes[i] |
| process = windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | |
| PROCESS_VM_READ, |
| 0, pid) |
| if process: |
| module = HANDLE() |
| result = windll.psapi.EnumProcessModules(process, |
| addressof(module), |
| sizeof(module), |
| addressof(needed)) |
| if result: |
| name = create_unicode_buffer(1024) |
| result = windll.psapi.GetModuleBaseNameW(process, module, |
| name, len(name)) |
| # TODO: This might not be the best way to |
| # match a process name; maybe use a regexp instead. |
| if name.value.startswith(process_name): |
| pids.append(pid) |
| windll.kernel32.CloseHandle(module) |
| windll.kernel32.CloseHandle(process) |
| |
| return pids |
| |
| def kill_pid(pid): |
| process = windll.kernel32.OpenProcess(PROCESS_TERMINATE, 0, pid) |
| if process: |
| windll.kernel32.TerminateProcess(process, 0) |
| windll.kernel32.CloseHandle(process) |