Обнаружил интересное поведение функций WaitFor...Object(). Если при вызове указано состояние Alertable = FALSE, то вызывающий поток не будет обрабатывать user-mode APC и будет ждать либо истечения тайм-аута, либо активации переданных хендлов. Посылаю такому потоку user-mode APC с помощью драйвера (сначала user-apc, затем kernel-mode APC). После того, как поток обработает kernel-mode APC он переводится ядром в alertable state и обрабатывает user-mode APCs. В результате WaitForxxxObject() выходит из состояния ожидания со статусом STATUS_ALERTED, как будто Alertable было FALSE. Таким способом, например, убивается система, если послать apc to smss.exe, который как раз находится в таком состоянии. Собс-но вопрос в следующем: можно ли в описанной ситуации выполнить APC, не прерывая ожидания у потока?
Вопрос по-прежнему акутален. Есть ли у кого-нибудь любые *безумные* идеи как можно отправить user-mode APC максимальному числу потоков в системе без прерывания non-alertable ожидания? Пример безумства (к сожалению не рабочий ): захукать все функции ожидания (KeWaitForSingleObject(), KeWaitForMultipleObjects() и KeDelayExecutionThread()) и возобновляю прерванное приходом APC ожидание. Не работает из-за того, что user-mode APC выполняются как ни странно в юзер-моде. Т.е. ожидание-то возобновляется, но APC не доставляется.