IRP_MN_DEVICE_USAGE_NOTIFICATION

Los componentes del sistema envían este IRP para pedir a los controladores un dispositivo si el dispositivo puede admitir un archivo especial. Los archivos especiales incluyen archivos de paginación, archivos de volcado de memoria y archivos de hibernación. Si todos los controladores del dispositivo son correctos, el sistema crea el archivo especial. El sistema también envía este IRP para informar a los controladores de que se ha quitado un archivo especial del dispositivo.

Los controladores de función deben controlar este IRP si su dispositivo puede contener un archivo de paginación, un archivo de volcado o un archivo de hibernación. Los controladores de filtro deben controlar este IRP si el controlador de función que están filtrando controla el IRP. Los controladores de autobús deben controlar este IRP para su adaptador o controlador (FDO de bus) y para sus dispositivos secundarios (PDO secundarios).

Value

0x16

Código principal

IRP_MJ_PNP

Cuándo se envió

El sistema envía este IRP cuando crea o elimina un archivo de paginación, un archivo de volcado o un archivo de hibernación. Si un dispositivo tiene una relación de administración de energía que se encuentra fuera de la relación principal-secundaria convencional, el controlador puede enviar este IRP para propagar la información de uso del dispositivo a otra pila de dispositivos. Para obtener más información, consulte la descripción de la solicitud PowerRelations en IRP_MN_QUERY_DEVICE_RELATIONS.

Los componentes y controladores del sistema envían este IRP en IRQL PASSIVE_LEVEL en un contexto de subproceso arbitrario.

Parámetros de entrada

El miembro Parameters.UsageNotification.InPath de la estructura IO_STACK_LOCATION es un valor BOOLEAN. Cuando este parámetro es TRUE, el sistema crea un archivo de paginación, volcado de memoria o hibernación en el dispositivo. Cuando InPath es FALSE, este archivo se ha quitado del dispositivo.

Parameters.UsageNotification.Type es una enumeración que indica el tipo de archivo. Este parámetro tiene uno de los siguientes valores: DeviceUsageTypePaging, DeviceUsageTypeDumpFile o DeviceUsageTypeHibernation.

Parámetros de salida

None

Bloque de estado de entrada/salida

Los controladores establecen Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado.

Los controladores no modifican el campo Irp-IoStatus.Information>; permanece en cero, tal y como establece el componente que envía el IRP.

Operación

Un controlador controla este IRP en el camino hacia abajo de la pila de dispositivos y en el camino de la copia de seguridad de IRP de la pila.

Un controlador responde a este IRP con un procedimiento similar al siguiente:

  • Si Parameters.UsageNotification.InPath es TRUE, determine si el dispositivo admite el archivo especial.

    Un controlador debe probar para los parámetros.UsageNotification.Type(s) específicos que el controlador puede admitir. Es posible que se agreguen tipos de notificación adicionales en el futuro.

    Vea más información a continuación que describe las acciones necesarias para admitir cada tipo de notificación.

    Si Parameters.UsageNotification.InPath es TRUE y el controlador no puede admitir el archivo especial en el dispositivo, el controlador debe completar el IRP con un estado de error.

  • Si el dispositivo admite el archivo especial:

    1. Realice las acciones adecuadas para reflejar que el dispositivo ahora contiene, o ya no contiene, un archivo especial.

      Normalmente, un controlador incrementa o disminuye un contador. Por ejemplo, si Parameters.UsageNotification.Type es DeviceUsageTypePaging y Parameters.UsageNotification.InPath es TRUE, incremente un recuento del número de archivos de paginación en el dispositivo. Ciertas rutinas de distribución del controlador deben comprobar los contadores.

      No se debe deshabilitar un dispositivo que contenga un archivo especial. Un controlador puede llamar a IoInvalidateDeviceState, solicitando al administrador de PnP que vuelva a consultar la información de estado del dispositivo PnP del dispositivo. En respuesta al IRP de IRP_MN_QUERY_PNP_DEVICE_STATE resultante, el controlador debe establecer la marca PNP_DEVICE_NOT_DISABLEABLE.

      Si InPath es FALSE, un controlador establece el bit DO_POWER_PAGABLE en su objeto de dispositivo para el dispositivo.

    2. Propaga la información de uso del dispositivo a cualquier dispositivo relacionado que requiera la información.

      Como parte de su control de un IRP de IRP_MN_DEVICE_USAGE_NOTIFICATION , es posible que se requiera un controlador para pasar la información a una o varias pilas de dispositivos. Este controlador crea una nueva IRP_MN_DEVICE_USAGE_NOTIFICATION IRP (o IRP) y las envía a la pila de dispositivos adecuada (o pilas). El controlador debe esperar a que finalice cualquier IRP de notificación de uso de dispositivo que envíe antes de que el controlador termine de procesar el IRP de uso del dispositivo que recibió.

      Cómo identificar los dispositivos relacionados es específico del dispositivo y del controlador. Normalmente, un controlador envía el IRP a otros controladores a los que enviaría solicitudes de E/S para el archivo. Cuando un controlador de bus controla esta solicitud para un dispositivo secundario, debe enviar un IRP de notificación de uso a la pila de dispositivos para el elemento primario del dispositivo.

      Por ejemplo, cuando ftdisk ejecuta un conjunto de franjas de cinco discos, propaga las notificaciones de paginación a cada uno de estos cinco discos, ya que cada uno de estos dispositivos puede ser necesario para controlar las operaciones de archivo de paginación.

    3. En una función o un controlador de filtro, establezca una rutina de IoCompletion .

    4. En un controlador de función o filtro, establezca Irp-IoStatus.Status> en STATUS_SUCCESS, configure la siguiente ubicación de pila y pase el IRP al siguiente controlador inferior con IoCallDriver. No complete el IRP.

      En un controlador de bus que controla el IRP de un PDO secundario: establezca Irp-IoStatus.Status> y complete el IRP (IoCompleteRequest).

    5. Durante el procesamiento de finalización de IRP:

      Si una rutina de IoCompletion detecta que un controlador inferior ha producido un error en el IRP, la función o el controlador de filtro deben deshacer las operaciones realizadas en respuesta al IRP y propagar el error. Si la función o el controlador de filtro propagaron la información de uso a cualquier otra pila de dispositivos, el controlador debe enviar otro IRP de uso a esas pilas para notificarles el error.

      Si el estado es STATUS_SUCCESS y InPath es TRUE, borre el bit de DO_POWER_PAGABLE.

Consulte Plug and Play para conocer las reglas generales para controlar Plug and Play IRP menores.

Compatibilidad con la paginación, el volcado de memoria y los archivos de hibernación en un dispositivo

Cuando cualquiera de los recuentos de archivos especiales de un controlador es distinto de cero, el controlador debe admitir la presencia de los archivos especiales en su dispositivo (o un dispositivo descendiente).

Para un archivo DeviceUsageTypePaging creado en su dispositivo, un controlador debe hacer lo siguiente:

  • Bloquee el código en memoria para sus rutinas DispatchRead, DispatchWrite, DispatchDeviceControl y DispatchPower .

  • Borre el bit de DO_POWER_PAGABLE en su objeto de dispositivo para el dispositivo (en la pila del dispositivo IRP).

  • Error IRP_MN_QUERY_STOP_DEVICE y solicitudes de IRP_MN_QUERY_REMOVE_DEVICE para el dispositivo.

Para un archivo DeviceUsageTypeDumpFile en su dispositivo, un controlador debe hacer lo siguiente:

  • Bloquee el código en memoria para sus rutinas DispatchRead, DispatchWrite, DispatchDeviceControl y DispatchPower .

  • No saque el dispositivo del estado D0.

    No registre el dispositivo para la detección de inactividad (PoRegisterDeviceForIdleDetection). Si el dispositivo ya está registrado, cancele el registro. Si el controlador realiza su propia detección de inactividad para el dispositivo, suspenda dicha detección.

  • Borre el bit de DO_POWER_PAGABLE en su objeto de dispositivo para el dispositivo (en la pila del dispositivo IRP).

  • Error IRP_MN_QUERY_STOP_DEVICE y solicitudes de IRP_MN_QUERY_REMOVE_DEVICE para el dispositivo.

Para un archivo DeviceUsageTypeHibernation en su dispositivo, un controlador debe hacer lo siguiente:

  • Bloquee el código en memoria para sus rutinas DispatchRead, DispatchWrite, DispatchDeviceControl y DispatchPower .

  • Asegúrese de que el dispositivo está en estado D0 cuando el controlador recibe un IRP de alimentación del sistema S4 que indica que el sistema está a punto de hibernar.

  • No apague el dispositivo en respuesta a un IRP de configuración D3 que forme parte de una acción de hibernación S4. Consulte Acciones de energía del sistema para obtener más información.

    Tras la recepción de este TIPO de IRP de potencia establecida D3, realice todas las tareas necesarias para colocar el dispositivo en el estado D3, excepto para apagar el dispositivo y notificar al administrador de energía (PoSetPowerState). El dispositivo debe conservar la energía hasta que se haya escrito el archivo de hibernación.

  • Borre el bit de DO_POWER_PAGABLE en su objeto de dispositivo para el dispositivo (en la pila del dispositivo IRP).

  • Error IRP_MN_QUERY_STOP_DEVICE y solicitudes de IRP_MN_QUERY_REMOVE_DEVICE para el dispositivo.

Consulte Administración de energía para obtener más información sobre los estados de energía del dispositivo, los IRP de energía y la compatibilidad con la administración de energía en los controladores.

Envío de este IRP

Un controlador puede enviar una IRP_MN_DEVICE_USAGE_INFORMATION IRP, pero solo para propagar la información de uso del dispositivo a otra pila de dispositivos. Un controlador nunca es el origen inicial de la información de uso del dispositivo.

Requisitos

Encabezado

Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h)

Consulte también

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