Compartilhar via


IRP_MN_QUERY_CAPABILITIES

O gerenciador PnP envia esse IRP para obter os recursos de um dispositivo, como se o dispositivo pode ser bloqueado ou ejetado.

Os drivers de função e filtro poderão lidar com essa solicitação se alterarem os recursos compatíveis com o motorista do barramento. Os motoristas de ônibus devem lidar com essa solicitação para seus dispositivos filho.

Valor

0x09

Código principal

IRP_MJ_PNP

Quando enviado

O gerenciador PnP envia esse IRP para o driver de barramento de um dispositivo imediatamente após o dispositivo ser enumerado. O gerenciador PnP envia esse IRP novamente depois que todos os drivers de um dispositivo iniciaram o dispositivo. Um driver pode enviar esse IRP para obter os recursos de um dispositivo.

O gerenciador de PnP e os drivers enviam esse IRP no IRQL PASSIVE_LEVEL em um contexto de thread arbitrário.

Parâmetros de Entrada

O membro Parameters.DeviceCapabilities.Capabilities da estrutura IO_STACK_LOCATION aponta para uma estrutura DEVICE_CAPABILITIES que contém informações sobre os recursos do dispositivo.

Parâmetros de saída

Parameters.DeviceCapabilities.Capabilities aponta para a estrutura DEVICE_CAPABILITIES que reflete as modificações feitas pelos drivers que lidam com o IRP.

Bloco de Status de E/S

Um driver define Irp-IoStatus.Status> como STATUS_SUCCESS ou para um status de erro apropriado, como STATUS_UNSUCCESSFUL.

Se um driver de função ou filtro não manipular esse IRP, ele chamará IoSkipCurrentIrpStackLocation e passará o IRP para o próximo driver. Esse driver não deve modificar Irp-IoStatus.Status> e não deve concluir o IRP.

Um motorista de ônibus define Irp-IoStatus.Status> e conclui o IRP.

Operação

Quando um dispositivo é enumerado, mas antes que os drivers de função e filtro sejam carregados para o dispositivo, o gerenciador PnP envia uma solicitação de IRP_MN_QUERY_CAPABILITIES ao driver de barramento pai para o dispositivo. O driver de barramento deve definir quaisquer valores relevantes na estrutura DEVICE_CAPABILITIES e retorná-lo ao gerenciador PnP.

Depois que a pilha do dispositivo é criada e os drivers iniciam o dispositivo, o gerenciador de PnP envia esse IRP novamente para ser manipulado primeiro pelo driver na parte superior da pilha do dispositivo e, em seguida, por cada driver inferior na pilha. Os drivers de função e filtro podem definir uma rotina IoCompletion e lidar com esse IRP no caminho de backup da pilha do dispositivo.

Os drivers devem adicionar funcionalidades antes de passar o IRP para o próximo driver inferior.

Os drivers devem remover funcionalidades depois que todos os drivers inferiores tiverem terminado com o IRP. Um driver normalmente não remove recursos que foram definidos por outros drivers, mas pode fazer isso se tiver informações especiais sobre os recursos do dispositivo em uma determinada configuração. Consulte Plug and Play para obter informações sobre como adiar o processamento de IRP até que os drivers inferiores sejam concluídos.

Depois que um dispositivo é enumerado e seus drivers são carregados, seus recursos não devem ser alterados. Os recursos de um dispositivo poderão ser alterados se o dispositivo for removido e renumerado.

Ao lidar com um IRP IRP_MN_QUERY_CAPABILITIES , o driver que é o gerenciador de políticas de energia do dispositivo deve definir uma rotina IoCompletion e copiar os recursos de energia do dispositivo, como os mapeamentos de estado de energia S-to-D, no caminho de backup do IRP na pilha do dispositivo. Para determinar os recursos de energia de um dispositivo filho, o driver de barramento pai cria outro IRP de recursos de consulta e envia o IRP para seu driver pai. Consulte Reporting Device Power Capabilities para obter mais informações.

Se um driver manipular esse IRP, ele deverá marcar o valor de Versãodo DEVICE_CAPABILITIES. Se esse valor não for uma versão compatível com o driver, o driver deverá falhar no IRP. Se houver suporte para a versão, o driver deverá marcar o campo Tamanho. Um driver deve definir apenas os campos que estão dentro dos limites da estrutura de recursos que recebeu como entrada.

Os drivers que lidam com esse IRP podem definir alguns campos DEVICE_CAPABILITIES , mas não devem definir os campos Tamanho e Versão . Esses campos são definidos apenas pelo componente que enviou o IRP.

Consulte Plug and Play para obter as regras gerais para lidar com Plug and Play IRPs menores.

Enviando este IRP

Um driver de barramento envia esse IRP para a pilha de dispositivos pai quando lida com uma solicitação de IRP_MN_QUERY_CAPABILITIES para um de seus dispositivos filho. Além disso, um driver pode enviar esse IRP para obter os recursos do dispositivo para um de seus dispositivos. Um único driver na pilha tem apenas parte das informações de funcionalidades do dispositivo; o envio de um IRP para a pilha de dispositivos permite que ele colete a imagem completa, incluindo modificações por quaisquer drivers de filtro e assim por diante.

Consulte Manipulando IRPs para obter informações sobre como enviar IRPs. As seguintes etapas se aplicam especificamente a este IRP:

  • Aloque uma estrutura de DEVICE_CAPABILITIES do pool paginado e inicialize-a para zeros chamando RtlZeroMemory. Inicialize Size tosizeof(DEVICE_CAPABILITIES), Version to 1 e Address e UINumber como -1.

  • Defina os valores no próximo local da pilha de E/S do IRP: defina MajorFunctioncomo IRP_MJ_PNP, defina MinorFunctioncomo IRP_MN_QUERY_CAPABILITIES e defina Parameters.DeviceCapabilities como um ponteiro para a estrutura de DEVICE_CAPABILITIES alocada.

  • Inicialize IoStatus.Status para STATUS_NOT_SUPPORTED.

  • Desaloque o IRP e a estrutura DEVICE_CAPABILITIES quando eles não forem mais necessários.

Requisitos

parâmetro

Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h)

Confira também

DEVICE_CAPABILITIES