Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 58 стр.

UptoLike

Составители: 

58
3.15 Вызов функций завершения
За вызов всех функций завершения, установленных данным драйверов в
элементах стека ввода-вывода отвечает IoCompleteRequest. Схема вызова этих
функций показана на рисунке 3.6.
Рисунок 3.6 – Схема вызова функций завершения
На схеме показано, что после вызова функции IoCompleteRequest она
проверяет текущий элемент стека ввода-вывода на предмет наличия в нем
функции завершения, установленной драйвером высшего уровня. Если функция
не обнаружена, указатель стека смещается на один уровень вверх, и проверка
выполняется снова. Процесс проверки выполняется до
тех пор, пока не будет
найден элемент стека с установленной функцией завершения, или функция
IoCompleteRequest не достигнет вершины стека. Затем функция
IoCompleteRequest выполняет все необходимые действия (в том числе и
освобождение памяти, занимаемой IRP).
Если функция IoCompleteRequest находит позицию стека с указателем на
функцию завершения, она вызывает эту функцию и анализирует
код возврата.
Если код возврата не совпадает с
STATUS_MORE_PROCESSING_REQUIRED, IoCompleteRequest перемещает
       3.15 Вызов функций завершения
       За вызов всех функций завершения, установленных данным драйверов в
элементах стека ввода-вывода отвечает IoCompleteRequest. Схема вызова этих
функций показана на рисунке 3.6.




                Рисунок 3.6 – Схема вызова функций завершения
       На схеме показано, что после вызова функции IoCompleteRequest она
проверяет текущий элемент стека ввода-вывода на предмет наличия в нем
функции завершения, установленной драйвером высшего уровня. Если функция
не обнаружена, указатель стека смещается на один уровень вверх, и проверка
выполняется снова. Процесс проверки выполняется до тех пор, пока не будет
найден элемент стека с установленной функцией завершения, или функция
IoCompleteRequest      не   достигнет        вершины   стека.   Затем   функция
IoCompleteRequest выполняет все необходимые действия (в том числе и
освобождение памяти, занимаемой IRP).
       Если функция IoCompleteRequest находит позицию стека с указателем на
функцию завершения, она вызывает эту функцию и анализирует код возврата.
Если           код          возврата             не         совпадает         с
STATUS_MORE_PROCESSING_REQUIRED, IoCompleteRequest перемещает
                                        58