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 envía

El administrador de PnP envía este IRP al controlador de bus para 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 en 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 DEVICE_CAPABILITIES que refleja las modificaciones realizadas por los controladores que controlan el IRP.

Bloque de estado de E/S

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

Si una función o 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 primario de bus para el dispositivo. El controlador de bus debe establecer los valores pertinentes en la estructura DEVICE_CAPABILITIES y devolverlo al administrador de PnP.

Una vez creada la pila de dispositivos y los controladores han iniciado el dispositivo, el administrador de PnP vuelve a enviar este IRP para que lo controle primero el controlador en la parte superior de la pila de dispositivos 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 de dispositivos.

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

Los controladores deben quitar las funcionalidades después de que todos los controladores inferiores hayan terminado con el 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 hayan finalizado los controladores más bajos.

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 realizar una copia de seguridad de la pila del dispositivo. Para determinar las funcionalidades de potencia 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 generación de informes de energía del dispositivo) para obtener más información.

Si un controlador controla este IRP, debe comprobar el valor de DEVICE_CAPABILITIES Versión. Si ese valor no es una versión que admite el controlador, el controlador debe producir un error en irP. Si se admite la versión, el controlador debe comprobar el campo Tamaño . Un controlador debe establecer solo 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 los IRP menores de Plug and Play.

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 podría 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 DEVICE_CAPABILITIES del grupo paginado e inicialícela a ceros llamando a RtlZeroMemory. Inicialice el tamaño para sizeof(DEVICE_CAPABILITIES), la versión en 1 y Address y UINumber en -1.

  • Establezca los valores de 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