Программирование драйверов Windows

       

DPC процедуры как средство синхронизации


Процедуры DPC, точнее, объекты, с ними ассоциированные, могут размещаться в очереди DPC объектов только в единичном экземпляре. Если DPC объект находится в очереди, то следующему запросу на размещении там DPC объекта (соответственно, и отложенного вызова DPC процедуры) будет отказано.

Таким образом, в многопроцессорных архитектурах DPC процедура может безопасно обращаться к данным, если доступ к ним производится только из этой DPC процедуры драйвера (ассоциированной с данным DPC объектом), не опасаясь вмешательства кода драйвера, возможно, работающего на другом процессоре.

Правда, такого типа синхронизация достаточно вычурна, поскольку произвольно запланировать вызов DPC процедуры можно при помощи вызова KeInsertQueueDpc, а сделать его можно только из кода, работающего на уровне не ниже DISPATCH_LEVEL. Процедура DPC будет вызвана, когда приоритет снизится до уровня ниже DISPATCH_LEVEL.

Следует также помнить, что к моменту вызова KeInsertQueueDpc

должен существовать инициализированный DPC объект (см. описание вызова KeInitializeDpc, таблица 10.23), соотнесенный с интересующей DPC процедурой.



Содержание раздела