有几种方法可以做到这一点。如果您只需要跟踪来自特定程序(或几个程序)的进程创建,那么在此提到的EasyHook/Detours方法将非常有效,但您需要在每个程序中对CreateProcess安装钩子,因此如果您想要跟踪系统中的所有进程创建,则不是一个很好的解决方案。NT-based Windows变体(NT/2000/XP/Vista)中有一个特定的API用于此,称为PsSetCreateProcessNotifyRoutine()。不幸的是,您只能从ring0调用此函数,因此它需要在驱动程序中完成。在这篇CodeProject文章中有一个方便的解释(和代码):http://www.codeproject.com/KB/threads/procmon.aspx。据我所知,这只是一个通知,本身并不能告诉系统是否应该创建进程。但是,如果您需要这样做,您可以暂停进程(例如通过将其附加为调试器)而您的代码决定是否杀死它。
你应该看看easyhook-continuing-detours项目,它是Microsoft Detours项目的.NET移植版。它将允许你钩取未托管的API(如CreateProcess)。在这里查看简单的FileMon样式程序的代码示例here。
您可以通过使用实时ETW消费者找出进程何时启动 - 但是,如果要采取可能会取消进程启动的某些操作,则必须做一些不光彩/未记录的事情,例如挂钩CreateProcess,或使用内核过滤驱动程序阻止对EXE的读取。