Is there a way to recieve a event about a process starting in windows?
TL; DR
我用C语言编写了一个程序,以关闭所有"新"启动的程序,这些程序在我的程序启动时未运行。目前,我通过捕获所有PID来执行此操作,然后根据此列表不断检查所有已注册的应用程序。那些不在我名单上的人,我试图关闭/杀死。对于这样一个简单的任务,这非常占用CPU资源。有没有办法接收某种Windows事件,所以我不需要一个非常活跃的线程?
我发现了这个钩子,它也许可以满足我的需要,但似乎是为其他目的而设计的,并非完全符合我的需要。
简而言之:
在进程启动之后/之前,我是否可以从Windows接收事件?
- 签出信息亭模式。如果尚未停止。旧功能。
-
您需要使用PsSetCreateProcessNotifyRoutine[Ex]注册自己的回调
-
嗯,那可能就是我所需要的。该描述是否会完全按照我的要求进行工作还是令人困惑,但是我将尝试一下。谢谢!
理想情况下,您可以在用户模式下执行此操作,而无需轮询,而我能想到的唯一接近的是WMI事件。
一个C例子可以在这里找到。您可能还想阅读__InstanceCreationEvent和Win32_ProcessStartTrace之间的区别。
- 不进行轮询-但是此WMI事件如何在内部实现?我的意思是WMI本身如何获得有关进程开始/停止的通知?如果存在用于此目的的用户模式api(无需轮询),我们可以直接调用它,而无需wmi和rpc。如果wmi确实在轮询自己-这种胡扯的用法-可以直接轮询而无需wmi
-
我假设WMI不轮询但使用PsSetCreateProcessNotifyRoutine或ETW。我不知道为什么没有简单的用户模式API可以执行相同的操作。
-
根据fireeye.com/content/dam/fireeye-www/global/en/current-threat??s/…的说法,诸如Win32_ ProcessStartTrace之类的WMI外在事件不会轮询。
-
是的,你正确的。 wmi在这里使用krnlprov.dll,它通过Microsoft-Windows-Kernel-Process({22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716})提供程序上的ETW从内核获取事件