Здравствуйте! У меня есть драйвер для обслуживания устройства ввода цифрового сигнала. Я передаю в него события и затем, по прерыванию от устройства, взвожу эти события для пользовательского процесса чтобы он обработал информацию в отображенном на его пространство совместном с драйвером разделе памяти. Проблема в том что сегодня вдруг система "зависла" без синего экрана но не реагируя ни на какие раздражители. Я подумал что это повышение IRQL. Дело в том что я набираюсь наглости и вызываю KeSetEvent для совместных с пользовательским приложением событий прямо в процедуре обработки аппаратного прерывания от устройства. Может быть так что внтури KeSetEvent временно повысится IRQL (как написано в документации) а в это время происходит переключение ? и после переключения идет мертвая петля с ожиданием понижения IRQL ? Или же взведенное событие взывает переключение прямо при обработке прерывания ? Но это по идее невозможно. Обязательно ли в этом случае использовать DPC процедуру в драйвере для окончательной обработки поступившего прерывания и в частности взведения события ? Буду очень признателен за замечания и рекомендации!
Interrupt handlers выполняются на IRQL_HIGH который выше DISPATCH. Насколько я знаю KeSetEvent() оттуда вызывать нельзя. Используй DPCs (Deferred Procedure Calls)
Deferred Procedure Calls он... отложенный - deferred То есть выполнится при DISPATCH чуть позже. Почитай доки в DDK.