Необязательные процедуры диспетчеризации
Драйверы могут включать следующие процедуры диспетчеризации:
-
IRP_MJ_CLEANUP указывает, что закрывается последний дескриптор для объекта файла, связанного с объектом целевого устройства. Невыполненные запросы ввода-вывода для объекта файла могут по-прежнему существовать. Драйверы могут реализовать подпрограмму DispatchCleanup для выполнения очистки, которая не является конкретной дескриптором файла. Драйверы также могут использовать свою подпрограмму DispatchClose для той же цели.
DispatchQueryInformation, DispatchSetInformation
Некоторым драйверам самого высокого уровня может потребоваться обработать IRP_MJ_QUERY_INFORMATION и IRP_MJ_SET_INFORMATION IRP. Такие запросы указывают, что приложение пользовательского режима, компонент режима ядра или драйвер запросили сведения о длине объекта файла (представляющего объект устройства драйвера), для которого у инициатора запроса пользовательского режима есть дескриптор, или что инициатор запроса в пользовательском режиме пытается задать конец файла для этого объекта файла.
Параллельные драйверы классов и последовательных устройств обрабатывают эти запросы, устанавливая для FILE_STANDARD_INFORMATION или FILE_POSITION_INFORMATION длину или положение равным нулю. Другие драйверы устройств самого высокого уровня должны поддерживать эти запросы, особенно если приложение в пользовательском режиме или драйвер режима ядра могут вызывать функции среды выполнения C для управления объектом файла. Драйверы файловой системы должны поддерживать эти запросы более полно, чем драйверы устройств самого высокого уровня.
-
Драйвер, который кэширует данные на устройстве или буферизует данные внутри памяти, выделенной драйвером, может получить IRP_MJ_FLUSH_BUFFERS. Получение этого запроса указывает, что драйвер должен записать буферизируемые данные или удалить кэшированные данные на устройство либо удалить буферные или кэшированные данные, считанные с устройства.
Например, драйверы класса системной клавиатуры и мыши, которые имеют внутренние кольцевые буферы для входных данных со своих устройств, поддерживают запрос на очистку. Драйверы запоминающих устройств и драйверы, размещенные над ними, также поддерживают этот запрос.
-
Любой драйвер, который, скорее всего, будет вызван до завершения работы системы, должен обрабатывать IRP_MJ_SHUTDOWN. Подпрограмма DispatchShutdown должна выполнять очистку, определяемую драйвером, прежде чем диспетчер питания отправит IRP для установки питания системы для завершения работы системы. Драйвер может вызвать IoRegisterShutdownNotification или IoRegisterLastChanceShutdownNotification для регистрации уведомления о завершении работы.
Драйверы для запоминающих устройств и промежуточные драйверы, наложенные на них, могут полагаться на драйвер файловой системы самого высокого уровня для отправки им irP завершения работы, когда система вот-вот завершит работу. То есть FSD отвечает за то, чтобы все кэшированные данные файлов записывали на периферийные устройства, вызывая базовые драйверы для очистки данных из кэшей устройств или буферов (если таковые есть) и т. д. до завершения работы системы.
Драйвер запоминающего устройства, которое кэширует данные внутри системы, должен предоставлять подпрограммы DispatchShutdown и DispatchFlushBuffers . Если драйвер массового хранилища буферизует данные в памяти, но его устройство не имеет внутреннего кэша, он также должен предоставить подпрограммы DispatchShutdown и DispatchFlushBuffers .
Любой промежуточный драйвер, размещенный над драйвером, который обрабатывает IRP_MJ_FLUSH_BUFFERS и IRP_MJ_SHUTDOWN запросы, также предоставляет подпрограммы DispatchShutdown и DispatchFlushBuffers .