Compartir vía


IRP_MN_QUERY_CAPABILITIES

El administrador de PnP envía este IRP para obtener las funcionalidades de un dispositivo, como si el dispositivo se puede bloquear o expulsar.

Los controladores de función y filtro pueden controlar esta solicitud si modifican las funcionalidades admitidas por el controlador de bus. Los conductores de autobús deben controlar esta solicitud para sus dispositivos secundarios.

Valor

0x09

Código principal

IRP_MJ_PNP

Cuándo se envió

El administrador de PnP envía este IRP al controlador de autobús de un dispositivo inmediatamente después de enumerar el dispositivo. El administrador de PnP envía este IRP de nuevo después de que todos los controladores de un dispositivo hayan iniciado el dispositivo. Un controlador puede enviar este IRP para obtener las funcionalidades de un dispositivo.

El administrador de PnP y los controladores envían este IRP a IRQL PASSIVE_LEVEL en un contexto de subproceso arbitrario.

Parámetros de entrada

El miembro Parameters.DeviceCapabilities.Capabilities de la estructura IO_STACK_LOCATION apunta a una estructura de DEVICE_CAPABILITIES que contiene información sobre las funcionalidades del dispositivo.

Parámetros de salida

Parameters.DeviceCapabilities.Capabilities apunta a la estructura de DEVICE_CAPABILITIES que refleja las modificaciones realizadas por los controladores que controlan el IRP.

Bloque de estado de entrada/salida

Un controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado, como STATUS_UNSUCCESSFUL.

Si una función o un controlador de filtro no controla este IRP, llama a IoSkipCurrentIrpStackLocation y pasa el IRP al siguiente controlador. Este controlador no debe modificar Irp-IoStatus.Status> y no debe completar el IRP.

Un controlador de autobús establece Irp-IoStatus.Status> y completa el IRP.

Operación

Cuando se enumera un dispositivo, pero antes de que la función y los controladores de filtro se carguen para el dispositivo, el administrador de PnP envía una solicitud de IRP_MN_QUERY_CAPABILITIES al controlador de bus primario para el dispositivo. El controlador de autobús debe establecer los valores pertinentes en la estructura de DEVICE_CAPABILITIES y devolverlo al administrador de PnP.

Una vez compilada la pila de dispositivos y los controladores han iniciado el dispositivo, el administrador de PnP envía este IRP de nuevo para que el controlador lo controle primero en la parte superior de la pila del dispositivo y, a continuación, cada controlador inferior de la pila. Los controladores de función y filtro pueden establecer una rutina de IoCompletion y controlar este IRP en su camino de copia de seguridad de la pila del dispositivo.

Los controladores deben agregar funcionalidades antes de pasar el IRP al siguiente controlador inferior.

Los controladores deben quitar funcionalidades después de que todos los controladores inferiores hayan terminado con irP. Normalmente, un controlador no quita las funcionalidades establecidas por otros controladores, pero puede hacerlo si tiene información especial sobre las funcionalidades del dispositivo en una configuración determinada. Consulte Plug and Play para obtener información sobre cómo posponer el procesamiento de IRP hasta que finalicen los controladores inferiores.

Después de enumerar un dispositivo y de cargar sus controladores, sus funcionalidades no deben cambiar. Las funcionalidades de un dispositivo pueden cambiar si el dispositivo se quita y se vuelve a enumerar.

Al controlar un irP de IRP_MN_QUERY_CAPABILITIES , el controlador que es el administrador de directivas de energía para el dispositivo debe establecer una rutina de IoCompletion y copiar las funcionalidades de energía del dispositivo, como las asignaciones de estado de energía S a D, en la forma de hacer una copia de seguridad de la pila del dispositivo. Para determinar las funcionalidades de energía de un dispositivo secundario, el controlador de bus primario crea otro IRP de funcionalidades de consulta y envía el IRP a su controlador primario. Consulte Reporting Device Power Capabilities (Funcionalidades de energía del dispositivo de informes) para obtener más información.

Si un controlador controla este IRP, debe comprobar el valor de DEVICE_CAPABILITIESVersión . Si ese valor no es una versión que admite el controlador, el controlador debe producir un error en el IRP. Si se admite la versión, el controlador debe comprobar el campo Tamaño . Un controlador solo debe establecer los campos que están dentro de los límites de la estructura de funcionalidades que recibió como entrada.

Los controladores que controlan este IRP pueden establecer algunos campos de DEVICE_CAPABILITIES , pero no deben establecer los campos Tamaño y Versión . Estos campos solo se establecen mediante el componente que envió el IRP.

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

Envío de este IRP

Un controlador de bus envía este IRP a la pila de dispositivos principal cuando controla una solicitud de IRP_MN_QUERY_CAPABILITIES para uno de sus dispositivos secundarios. Además, un controlador puede enviar este IRP para obtener las funcionalidades del dispositivo para uno de sus dispositivos. Un único controlador de la pila solo tiene parte de la información de funcionalidades del dispositivo; enviar un IRP a la pila de dispositivos permite recopilar la imagen completa, incluidas las modificaciones de los controladores de filtro, etc.

Consulte Control de IRP para obtener información sobre el envío de IRP. Los pasos siguientes se aplican específicamente a este IRP:

  • Asigne una estructura de DEVICE_CAPABILITIES del grupo paginado e inicialícela a ceros llamando a RtlZeroMemory. Inicialice el tamaño en sizeof(DEVICE_CAPABILITIES), la versión en 1 y address y UINumber en -1.

  • Establezca los valores en la siguiente ubicación de pila de E/S del IRP: establezca MajorFunction en IRP_MJ_PNP, establezca MinorFunction en IRP_MN_QUERY_CAPABILITIES y establezca Parameters.DeviceCapabilities en un puntero a la estructura de DEVICE_CAPABILITIES asignada.

  • Inicialice IoStatus.Status en STATUS_NOT_SUPPORTED.

  • Desasigne el IRP y la estructura de DEVICE_CAPABILITIES cuando ya no sean necesarios.

Requisitos

Encabezado

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

Consulte también

DEVICE_CAPABILITIES