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

       

Пост-обработка, выполняемая Диспетчером ввода/вывода


После того как DPC процедура или одна из рабочих процедур помечают IRP пакет как завершенный, Диспетчер ввода/вывода (разумеется, когда получит управление) осуществляет завершающие действия, которые в литературе и документации DDK собирательно называются "очисткой" (cleanup). Это означает:

  • В том случае, если выполнялась операция записи при буферизованном вводе/выводе (buffered I/O), Диспетчер ввода/вывода освобождает буферную область, использованную во время только что завершенного переноса данных.
  • В случае, если выполнялась процедура прямого ввода/вывода (direct I/O), Диспетчер ввода/вывода отменяет фиксацию (lock) в оперативной памяти тех страниц, в которых размещался пользовательский буфер.
  • Диспетчер ввода/вывода помещает в очередь запрос к программному потоку, инициатору первоначального запроса, на выполнение асинхронного процедурного вызова (asynchronous procedure call, APC), работающего в режиме ядра. Этот APC вызов будет выполнять программный код Диспетчера ввода/вывода в контексте потока-инициатора запроса на операцию ввода/вывода.
  • Выполняющийся в режиме ядра программный АРС-поток производит перенос информации о состоянии и размере переданных данных в пространство пользовательского приложения.
  • В случае, если выполнялась процедура чтения категории буферизованного ввода/вывода (buffered I/O), процедура APC производит копирование содержимого буферной области, размещенной в нестраничном пуле памяти, в область памяти, предоставленную пользовательским приложением в качестве рабочего буфера. Затем освобождается системный буфер в нестраничном пуле.
  • В случае, если исходный запрос был сделан для выполнения асинхронного ввода/вывода, процедура APC устанавливает ассоциированное событие (event) и/или файловый объект в состояние, сигнализирующее пользователю об окончании обработки запроса. (Если читатель не знаком с асинхронным вводом/выводом, то может получить доступ к его описанию в документации MSDN по ключевым словам OVERLAPPED, CancelIo, ReadFileEx и т.п.)
  • В случае, если исходный запрос содержал процедуру завершения (как, например, при использовании функций пользовательского режима ReadFileEx/WriteFileEx

    в пользовательском приложении), APC процедура производит планирование вызова в дальнейшем APC процедуры пользовательского режима, которая выполнит вызов процедуры завершения, указанных в параметрах вызовов ReadFileEx/WriteFileEx.



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