Неувязочка вышла, KeWaitForSingleObject нельзя вызывать на IRQL=APC_LEVEL. Процесс останавливается, но не запускается. Что получилось - смотри в аттаче. 1177600832__StopProcess.rar
Можно сделать через спинлоки. Создаёшь его и лочишь, а потом вешаешь APC с ожиданием по спинлоку. До тех пор, пока сам не разлочишь- потоки не разблокируются.
Спинлок - ресурс глобальный, когда он залочен, то его могут ожидать и другие потоки в драйверах, такое использование спинлоков быстро повесит систему. Есть вариант - циклически проверять в APC какой-нибудь флаг, и продолжать выполнение при его установке, но это бесполезная трата процессорного времени.
Заметь, что система останавливает нить тоже на IRQL=APC_LEVEL вызывая KiSuspendThread а в ней и WaitForSingleObject. И остановка нити происходит при DeluverApc, если туда в очередь постьавлен АПЦ с KiSuspendThread. Проблем вроде не должно быть.