очереди IRP Driver-Managed
За исключением драйверов файловой системы, диспетчер ввода-вывода связывает объект очереди устройств (для очередей IRP) с каждым объектом устройства, создаваемым драйвером.
Большинство драйверов устройств обращаются к подпрограммам поддержки диспетчера ввода-вывода для использования связанной очереди устройств, которая содержит IRP всякий раз, когда запросы ввода-вывода устройства для целевого объекта устройства поступают быстрее, чем драйвер может обработать их до завершения. При использовании этого метода IRP помещаются в очередь в предоставляемую драйвером подпрограмму StartIo .
Для повышения производительности большинство промежуточных драйверов просто передают irP в более низкие драйверы так быстро, как они поступают, поэтому промежуточные драйверы почти никогда не используют очереди устройств, связанные с соответствующими объектами устройств.
Однако можно спроектировать драйвер для управления внутренними очередями IRP, явно настроив одну или несколько очередей устройств, заблокированных очередей или очередей, безопасных для отмены. Этот подход может быть особенно полезен, если драйвер управляет устройством, которое перекрывает операции ввода-вывода. Для такого устройства может быть трудно управлять параллельной обработкой двух или более irP для одного целевого объекта устройства, используя только одну очередь.
Самый простой способ создать внутреннюю очередь — использовать безопасную для отмены платформу очередей IRP. Вы можете реализовать механизм очередей по своему выбору в драйвере. Затем можно использовать IoCsqInitialize для регистрации набора процедур обратного вызова, которые обрабатывают вставку и удаление IRP, а также блокировку и разблокировку очереди. Безопасная для отмены платформа очередей IRP предоставляет подпрограммы IoCsqInsertIrp, IoCsqRemoveIrp и IoCsqRemoveNextIrp , которые автоматически используют подпрограммы обратного вызова для безопасной вставки и удаления IRP из очереди драйвера. Система также использует процедуры обратного вызова для безопасного удаления всех отмененных irp.
Вы также можете настроить дополнительные очереди для IRP в драйвере контроллера устройства для набора разнородных физических устройств. Например, драйвер порта SCSI использует объекты очереди устройств для внутренних очередей. Этот драйвер имеет подпрограмму StartIo и настраивает объекты очереди устройств в качестве дополнительных очередей в дополнение к очереди устройств, связанной с объектом устройства, который он создает для представления HBA. Драйвер порта SCSI использует свои дополнительные очереди устройств для хранения irp, привязанных к определенным логическим единицам в шине SCSI, управляемой адаптером SCSI.
Драйвер системного контроллера гибких дисков — это пример драйвера, который не имеет подпрограммы StartIo и использует заблокированную очередь. Этот драйвер настраивает вдвойне связанную очередь, в которую и из которой драйвер и его выделенный для устройства поток вставлять и удалять irP.
Ядро определяет тип объекта очереди устройства. Компонент поддержки для руководителей предоставляет процедуры для вставки и удаления irp в заблокированных очередях. Драйверы для Windows XP и более поздних версий Windows могут использовать безопасные для отмены очереди IRP для обработки очередей IRP.
В следующих разделах объясняется, как использовать очереди устройств, заблокированные очереди и очереди, безопасные для отмены.
Настройка и использование очередей устройств
Управление очередями устройств
Настройка и использование заблокированных очередей
Управление заблокированными очередями с помощью потока Driver-Created