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


IRP_MN_DEVICE_USAGE_NOTIFICATION

Системные компоненты отправляют этот IRP, чтобы запросить у драйверов устройства, может ли устройство поддерживать специальный файл. К специальным файлам относятся файлы подкачки, файлы дампа и файлы гибернации. Если все драйверы устройства успешно используют IRP, система создает специальный файл. Система также отправляет этот IRP для информирования драйверов о том, что с устройства был удален специальный файл.

Драйверы функций должны обрабатывать этот IRP, если их устройство может содержать файл подкачки, файл дампа или файл гибернации. Драйверы фильтров должны обрабатывать этот IRP, если драйвер функции, который они фильтруют, обрабатывает IRP. Водители автобусов должны обрабатывать этот IRP для адаптера или контроллера (FDO шины) и для своих дочерних устройств (дочерних PPO).

Значение

0x16

Основной код

IRP_MJ_PNP

При отправке

Система отправляет этот IRP при создании или удалении файла подкачки, файла дампа или файла гибернации. Если устройство имеет отношение управления питанием, которое выходит за рамки обычного отношения "родители-потомки", драйвер может отправить этот IRP для распространения сведений об использовании устройства в другой стек устройств. Дополнительные сведения см. в описании запроса PowerRelations в IRP_MN_QUERY_DEVICE_RELATIONS.

Системные компоненты и драйверы отправляют этот IRP в IRQL PASSIVE_LEVEL в произвольном контексте потока.

Входные параметры

Элемент Parameters.UsageNotification.InPath структуры IO_STACK_LOCATION является BOOLEAN. Если этот параметр имеет значение TRUE, система создает файл подкачки, аварийный дамп или файл гибернации на устройстве. Если inPath имеет значение FALSE, такой файл был удален с устройства.

Parameters.UsageNotification.Type — это перечисление, указывающее тип файла. Этот параметр имеет одно из следующих значений: DeviceUsageTypePaging, DeviceUsageTypeDumpFile или DeviceUsageTypeHibernation.

Выходные параметры

Нет

Блок состояния ввода-вывода

Драйверы устанавливают для Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки.

Драйверы не изменяют поле Irp-IoStatus.Information>; оно остается равным нулю, как задано компонентом, отправляя IRP.

Операция

Драйвер обрабатывает эту IRP на пути IRP вниз по стеку устройств и на пути обратного копирования IRP вверх по стеку.

Драйвер отвечает на этот IRP процедурой, как показано ниже:

  • Если параметр Parameters.UsageNotification.InPath имеет значение TRUE, определите, поддерживает ли устройство специальный файл.

    Драйвер должен проверить наличие определенных parameters.UsageNotification.Type(ов), которые может поддерживать драйвер. В будущем могут быть добавлены дополнительные типы уведомлений.

    См. дополнительные сведения ниже, описывающие действия, необходимые для поддержки каждого типа уведомлений.

    Если параметр Parameters.UsageNotification.InPath имеет значение TRUE и драйвер не может поддерживать специальный файл на устройстве, драйвер должен завершить IRP с состоянием сбоя.

  • Если устройство поддерживает специальный файл:

    1. Примите соответствующие меры, чтобы отразить, что устройство теперь содержит или больше не содержит специальный файл.

      Драйвер обычно увеличивает или уменьшает счетчик. Например, если параметр Parameters.UsageNotification.Type имеет значение DeviceUsageTypePaging , а Parameters.UsageNotification.InPath имеет значение TRUE, увеличьте количество файлов подкачки на устройстве. Некоторые процедуры диспетчеризации драйвера должны проверка счетчиков.

      Устройство, содержащее специальный файл, не должно быть отключено. Драйвер может вызвать IoInvalidateDeviceState, запрашивая диспетчер PnP для повторного запроса сведений о состоянии устройства PnP. В ответ на результирующий IRP_MN_QUERY_PNP_DEVICE_STATE IRP драйвер должен установить флаг PNP_DEVICE_NOT_DISABLEABLE.

      Если inPath имеет значение FALSE, драйвер задает бит DO_POWER_PAGABLE в объекте устройства для устройства.

    2. Распространение сведений об использовании устройства на все связанные устройства, которым требуется эта информация.

      В рамках обработки IRP_MN_DEVICE_USAGE_NOTIFICATION IRP драйверу может потребоваться передать информацию в один или несколько других стеков устройств. Такой драйвер создает новый IRP_MN_DEVICE_USAGE_NOTIFICATION IRP (или IRP) и отправляет их в соответствующий стек устройств (или стеки). Драйвер должен дождаться завершения всех IRP-notification-notification-notification, которые он отправляет, прежде чем драйвер завершит обработку полученного IRP использования устройства.

      Определение связанных устройств зависит от устройства и драйвера. Как правило, драйвер отправляет IRP другим драйверам, которым он будет отправлять запросы ввода-вывода для файла. Когда водитель шины обрабатывает этот запрос для дочернего устройства, он должен отправить уведомление об использовании IRP в стек устройств для родительского устройства.

      Например, если ftdisk выполняет набор чередующихся пяти дисков, он распространяет уведомления о разбиении по страницам на каждый из этих пяти дисков, так как каждое из этих устройств может потребоваться для обработки операций с файлами подкачки.

    3. В драйвере функции или фильтра задайте подпрограмму IoCompletion .

    4. В драйвере функции или фильтра задайте для параметра Irp-IoStatus.Status> значение STATUS_SUCCESS, настройте следующее расположение стека и передайте IRP следующему более низкому драйверу с помощью IoCallDriver. Не завершайте IRP.

      В драйвере шины, который обрабатывает IRP для дочернего PDO: задайте Irp-IoStatus.Status> и завершите IRP (IoCompleteRequest).

    5. Во время обработки завершения IRP:

      Если подпрограмма IoCompletion обнаруживает, что более низкий драйвер не выполнил IRP, драйвер функции или фильтра должен отменить все операции, выполненные в ответ на IRP, и распространить ошибку. Если драйвер функции или фильтра распространил сведения об использовании на любые другие стеки устройств, драйвер должен отправить другой IRP использования в эти стеки, чтобы уведомить их о сбое.

      Если состояние — STATUS_SUCCESS, а InPathTRUE, очистите бит DO_POWER_PAGABLE.

Общие правила обработки Plug and Play незначительных irp см. в Plug and Play.

Поддержка файлов подкачки, аварийного дампа и гибернации на устройстве

Если какое-либо из специальных файлов драйвера не равно нулю, драйвер должен поддерживать наличие специальных файлов на своем устройстве (или на потомковом устройстве).

Для файла DeviceUsageTypePaging , созданного на устройстве, драйвер должен сделать следующее:

  • Заблокируйте код в памяти для его подпрограмм DispatchRead, DispatchWrite, DispatchDeviceControl и DispatchPower .

  • Очистите бит DO_POWER_PAGABLE в объекте устройства для устройства (на пути IRP вверх по стеку устройств).

  • Не IRP_MN_QUERY_STOP_DEVICE и IRP_MN_QUERY_REMOVE_DEVICE запросы для устройства.

Для файла DeviceUsageTypeDumpFile на устройстве драйвер должен выполнить следующие действия:

  • Заблокируйте код в памяти для его подпрограмм DispatchRead, DispatchWrite, DispatchDeviceControl и DispatchPower .

  • Не выведите устройство из состояния D0.

    Не регистрируйте устройство для обнаружения бездействия (PoRegisterDeviceForIdleDetection). Если устройство уже зарегистрировано, отмените регистрацию. Если драйвер выполняет собственное обнаружение бездействия для устройства, приостановите такое обнаружение.

  • Очистите бит DO_POWER_PAGABLE в объекте устройства для устройства (на пути IRP вверх по стеку устройств).

  • Не IRP_MN_QUERY_STOP_DEVICE и IRP_MN_QUERY_REMOVE_DEVICE запросы для устройства.

Для файла DeviceUsageTypeHibernation на устройстве драйвер должен выполнить следующие действия:

  • Заблокируйте код в памяти для его подпрограмм DispatchRead, DispatchWrite, DispatchDeviceControl и DispatchPower .

  • Убедитесь, что устройство находится в состоянии D0, когда драйвер получает IRP питания системы S4, указывающий, что система находится в режиме гибернации.

  • Не выключайте устройство в ответ на IRP С установленным питанием D3, который является частью действия гибернации S4. Дополнительные сведения см. в разделе System Power Actions .

    После получения такого IRP D3 set-power, выполните все задачи, необходимые для перевод устройства в состояние D3, за исключением выключения устройства и уведомления диспетчера питания (PoSetPowerState). Устройство должно сохранять питание до тех пор, пока не будет записан файл гибернации.

  • Очистите бит DO_POWER_PAGABLE в объекте устройства для устройства (на пути IRP вверх по стеку устройств).

  • Не IRP_MN_QUERY_STOP_DEVICE и IRP_MN_QUERY_REMOVE_DEVICE запросы для устройства.

Дополнительные сведения о состояниях питания устройств, irp питания и поддержке управления питанием в драйверах см. в разделе Управление питанием.

Отправка этого IRP

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

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также раздел

DispatchDeviceControl

DispatchPower

DispatchRead

DispatchWrite

IoAdjustPagingPathCount

IoCallDriver

IoCompleteRequest

IO_STACK_LOCATION

IRP_MJ_PNP

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_PNP_DEVICE_STATE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_QUERY_STOP_DEVICE

PoRegisterDeviceForIdleDetection

PoSetPowerState