Процедуры StartIo в драйверах Higher-Level
Любой драйвер более высокого уровня может иметь подпрограмму StartIo . Однако такой драйвер вряд ли будет совместим с существующими драйверами более низкого уровня и, скорее всего, будет иметь плохие характеристики производительности.
Подпрограмма StartIo в драйвере более высокого уровня имеет следующие последствия:
Входящие irP можно поместить в очередь, вызвав IoStartPacket из подпрограмм DispatchXxx драйвера и IoStartNextPacket из его подпрограмм IoCompletion , что приводит к обработке irP по одному через подпрограмму StartIo .
Пропускная способность ввода-вывода водителя может стать заметно медленнее в периоды высокой нагрузки на операции ввода-вывода, так как ее подпрограмма StartIo может стать узким местом.
Подпрограмма StartIo драйвера вызывает IoCallDriver с каждым IRP в IRQL = DISPATCH_LEVEL, что приводит к тому, что все подпрограммы диспетчеризации драйверов более низкого уровня также будут выполняться в IRQL = DISPATCH_LEVEL. Это ограничивает набор подпрограмм поддержки, которые более низкие драйверы могут вызывать в своих подпрограммах диспетчеризации. Поскольку большинство средств записи драйверов предполагают, что процедуры диспетчеризации их драйверов выполняются на DISPATCH_LEVEL IRQL < , драйвер более высокого уровня вряд ли будет совместим со многими существующими драйверами более низкого уровня.
Подпрограмма StartIo снижает общую пропускную способность системы, так как она и подпрограммы диспетчеризации всех драйверов нижнего уровня в ее цепочке выполняются в irQL = DISPATCH_LEVEL.
Дополнительные сведения о списках IRQL, в которых выполняются стандартные подпрограммы драйверов, см. в разделе Управление приоритетами оборудования.
Ни один из системных драйверов более высокого уровня не имеет подпрограммы StartIo , так как он может замедлить обработку IRP для самого драйвера, для всех драйверов выше и ниже, а также для системы в целом.
Большинство драйверов более высокого уровня просто отправляют irP драйверам более низкого уровня из своих процедур диспетчеризации и выполняют необходимую обработку очистки в своих процедурах IoCompletion .
Однако драйверы более высокого уровня могут настроить внутренние очереди для irP, которые запрашивают определенные виды операций, или настроить внутренние очереди для хранения IRP, привязанных к набору разнородных базовых устройств, таких как драйвер порта SCSI. Дополнительные сведения см. в разделе Очередей и вывода из очереди irPs.