Поделиться через


Асинхронная обработка передач

За исключением драйверов самого высокого уровня, все драйверы обрабатывают IRP_MJ_READ и IRP_MJ_WRITE запросы асинхронно. Подпрограммы DispatchRead и DispatchWrite даже в драйвере самого высокого уровня не могут ждать завершения обработки асинхронного запроса на чтение или запись драйверами более низкого уровня; они должны передать такой запрос более низким водителям и вернуть STATUS_PENDING.

Аналогичным образом подпрограмма DispatchReadWrite драйвера устройства низкого уровня должна передавать запрос на передачу другим подпрограммам драйвера, которые обрабатывают запросы на ввод-вывод устройства, а затем возвращают STATUS_PENDING.

Драйверу более высокого уровня иногда приходится настраивать ИРП с частичной передачей и передавать их более низким драйверам. Драйвер более высокого уровня может завершить исходный IRP для чтения и записи, только если его запросы на частичную передачу были выполнены более низкими драйверами.

Например, подпрограмма DispatchReadWrite драйвера класса SCSI необходима для разделения больших запросов на передачу, превышающих возможности передачи базового адаптера, на набор запросов частичной передачи. Драйвер класса должен настроить параметры в своих irP с частичной передачей, чтобы драйверы портов или минипортов SCSI могли удовлетворить каждый запрос частичной передачи в рамках одной операции DMA.

Другим драйверам устройств, используюющим DMA или PIO, также может потребоваться разделить большие запросы на передачу.

Дополнительные сведения об использовании DMA и PIO см. в разделе Методы ввода и вывода.