Wenn es um einen bestimmten Prozessnamen geht, hat sich das für mich bewährt:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Dort einen neuen Schlüssel für zum Beispiel calc.exe anlegen und dort einen REG_SZ mit dem Namen Debugger und dem Wert deines Überwachungsprogramms erstellen.
Ich habe meinem Programm dann noch ein
Mutex gegeben und Commandline Options mit in den REG_SZ Eintrag geschrieben, so dass mein Programm nicht zig mal gestartet wird, sondern die erste Instanz wieder die Kontrolle bekommt und auf den Start der Executable reagieren kann.
Im Kernelmode dagegen kann man PsSetLoadImageNotifyRoutine() benutzen.