Я изо всех сил пытаюсь найти способ динамически отслеживать процессы Windows, когда они порождают (загружают) и умирают (выгружают), используя как можно меньше ЦП.
Мое текущее решение использует K32EnumProcesses
чтобы получить все запущенные pids (идентификаторы процессов) и операции базового набора для определения мертвых и порожденных pids.
class Procs:
def __init__(self):
pass
def get_all_processes(self):
pProcessIds = (c_ulong * 4096)()
pBytesReturned = c_ulong()
hModule = c_ulong()
count = c_ulong()
kernel32.K32EnumProcesses(byref(pProcessIds), sizeof(pProcessIds), byref(pBytesReturned))
nReturned = pBytesReturned.value/sizeof(c_ulong())
for pid in [i for i in pProcessIds][:int(nReturned)]:
yield int(pid)
def find_dead(self, prev_pids, curr_pids):
return prev_pids - curr_pids
def find_live(self, prev_pids, curr_pids):
return curr_pids - prev_pids
if __name__ == '__main__':
proc_obj = Procs()
prev_procs = set()
while True:
curr_procs = set(proc_obj.get_all_processes())
dead = proc_obj.find_dead(prev_procs, curr_procs)
live = proc_obj.find_live(prev_procs, curr_procs)
[print(f'died: {d}') for d in dead]
[print(f'live: {l}') for l in live]
dead = None
live = None
prev_procs = curr_procs
Проблема этого решения заключается в том, что оно использует около 50% ЦП.
Использование ЦП и памяти (изображение)
Я попытался передать в список задач cmd и проанализировать вывод, но это не лучше.
Не знаюНе знаю, есть ли способ получить окна, чтобы уведомить программу, когда новый процесс загружен, или мне, возможно, придется прибегнуть к драйверу.
Чтобы дать немного контекста, это решение будет частьюпрограмма, которая будет сканировать процессы при загрузке на наличие вредоносных программ и работать на старых системах, в которых недостаточно вычислительной мощности или доступной памяти.