Есть несколько способов сделать это. Если вам нужно только отследить создание процесса, поступающего из определенной программы (или нескольких программ), упомянутый здесь метод EasyHook / Detours будет работать довольно хорошо, но вам фактически нужно установить хук CreateProcess в каждой программе, так что отличное решение, если вы хотите отслеживать все процессы в системе.
Существует специальный API для этого в NT-вариантах Windows (NT / 2000 / XP / Vista), называемый PsSetCreateProcessNotifyRoutine (). К сожалению, вы можете вызывать эту функцию только из ring0, так что это нужно сделать в драйвере. В этой статье CodeProject есть удобное объяснение (и код): http://www.codeproject.com/KB/threads/procmon.aspx.
AFAIK, это просто уведомление, и оно само по себе не позволяет сообщать системе, должен ли процесс быть создан или нет. Однако, если вам нужно было сделать это, вы можете приостановить процесс (например, подключившись к нему в качестве отладчика), пока ваш код решает, убить его или нет.