IRP_MN_QUERY_ALL_DATA

Todos os drivers que dão suporte ao WMI devem lidar com esse IRP. Um driver pode lidar com IRPs WMI chamando WmiSystemControl ou manipulando o próprio IRP, conforme descrito em Manipulando solicitações WMI.

Se um driver chamar WmiSystemControl para lidar com uma solicitação IRP_MN_QUERY_ALL_DATA, o WMI, por sua vez, chamará a rotina DpWmiQueryDataBlock desse driver.

Código Principal

IRP_MJ_SYSTEM_CONTROL

Quando é enviado

O WMI envia esse IRP para consultar todas as instâncias de um determinado bloco de dados.

O WMI envia esse IRP em IRQL = PASSIVE_LEVEL em um contexto de thread arbitrário.

Parâmetros de Entrada

Parameters.WMI.ProviderId no local da pilha de E/S do driver no IRP aponta para o objeto de dispositivo do driver que deve responder à solicitação.

Parameters.WMI.DataPath aponta para um GUID que identifica o bloco de dados.

Parameters.WMI.BufferSize indica o tamanho máximo do buffer não paginado em Parameters.WMI.Buffer, que recebe dados de saída da solicitação. O tamanho do buffer deve ser maior ou igual a sizeof(WNODE_ALL_DATA) mais os tamanhos dos nomes de instância e dados para todas as instâncias a serem retornadas.

Parâmetros de saída

Se o driver manipular IRPs WMI chamando WmiSystemControl, o WMI preencherá um WNODE_ALL_DATA chamando a rotina DpWmiQueryDataBlock do driver uma vez para cada bloco registrado pelo driver.

Caso contrário, o driver preencherá uma estrutura WNODE_ALL_DATA em Parameters.WMI.Buffer da seguinte maneira:

  • Define WnodeHeader.BufferSize como o número de bytes de todo o WNODE_ALL_DATA a ser retornado, define WnodeHeader.Timestamp como o valor retornado por KeQuerySystemTime e define WnodeHeader.Flags conforme apropriado para os dados a serem retornados.

  • Define InstanceCount como o número de instâncias a serem retornadas.

  • Se o bloco usar nomes de instância dinâmicos, definirá OffsetInstanceNameOffsets para o deslocamento em bytes desde o início do WNODE_ALL_DATA até onde uma matriz de deslocamentos ULONG começa. Cada elemento nessa matriz é o deslocamento do WNODE_ALL_DATA para onde cada nome de instância dinâmica é armazenado. Cada nome de instância dinâmica é armazenado como uma cadeia de caracteres Unicode contada, em que a contagem é um USHORT seguido pela cadeia de caracteres Unicode. A contagem não inclui nenhum caractere nulo de terminação que possa fazer parte da cadeia de caracteres Unicode. Se a cadeia de caracteres Unicode incluir um caractere nulo de terminação, esse caractere nulo ainda deverá caber no tamanho estabelecido em WNodeHeader.BufferSize.

  • Se todas as instâncias forem do mesmo tamanho:

    • Define WNODE_FLAG_FIXED_INSTANCE_SIZE em WnodeHeader.Flags e define FixedInstanceSize para esse tamanho, em bytes.
    • Grava dados de instância começando em DataBlockOffset, com preenchimento para que cada instância seja alinhada a um limite de 8 bytes. Por exemplo, se FixedInstanceSize for 6, o driver adicionará 2 bytes de preenchimento entre instâncias.
  • Se as instâncias variarem em tamanho:

    • Limpa WNODE_FLAG_FIXED_INSTANCE_SIZE em WnodeHeader.Flags e grava uma matriz de estruturas InstanceCount OFFSETINSTANCEDATAANDLENGTH começando em OffsetInstanceDataAndLength. Cada estrutura OFFSETINSTANCEDATAANDLENGTH especifica o deslocamento em bytes desde o início da estrutura WNODE_ALL_DATA até o início dos dados de cada instância e o comprimento dos dados. DataBlockOffset não é usado.

    • Grava dados de instância após o último elemento da matriz OffsetInstanceDataAndLength , além de preenchimento para que cada instância seja alinhada a um limite de 8 bytes.

Se o buffer em Parameters.WMI.Buffer for muito pequeno para receber todos os dados, um driver preencherá o tamanho necessário em uma estrutura WNODE_TOO_SMALL em Parameters.WMI.Buffer. Se o buffer for menor que sizeof(WNODE_TOO_SMALL), o driver falhará no IRP e retornará STATUS_BUFFER_TOO_SMALL.

Bloco de status de E/S

Se o driver manipular o IRP chamando WmiSystemControl, o WMI definirá Irp-IoStatus.Status> e Irp-IoStatus.Information no bloco de> status de E/S.

Caso contrário, o driver definirá Irp-IoStatus.Status> como STATUS_SUCCESS ou como um status de erro apropriado, como o seguinte:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

Em caso de êxito, um driver define Irp-IoStatus.Information> como o número de bytes gravados no buffer em Parameters.WMI.Buffer.

Operação

Um driver pode lidar com IRPs WMI chamando WmiSystemControl ou manipulando o próprio IRP, conforme descrito em Manipulando solicitações WMI.

Se um driver manipular IRPs WMI chamando WmiSystemControl, essa rotina chamará a rotina DpWmiQueryDataBlock do driver.

Se um driver manipular uma solicitação IRP_MN_QUERY_ALL_DATA , ele deverá fazer isso somente se Parameters.WMI.ProviderId apontar para o mesmo objeto de dispositivo que o driver passou para IoWMIRegistrationControl. Caso contrário, o driver deverá encaminhar a solicitação para o driver mais baixo.

Antes de lidar com a solicitação, o driver deve determinar se Parameters.WMI.DataPath aponta para um GUID compatível com o driver. Caso contrário, o driver deverá falhar no IRP e retornar STATUS_WMI_GUID_NOT_FOUND.

Se o driver der suporte ao bloco de dados, ele deverá fazer o seguinte:

  • Verifique se Parameters.WMI.BufferSize especifica um buffer grande o suficiente para receber todos os dados que o driver retornará.

  • Preencha uma estrutura WNODE_ALL_DATA em Parameters.WMI.Buffer com dados para todas as instâncias desse bloco de dados.

Requisitos

Cabeçalho

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

Confira também

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

Controle do Sistema Wmi

WNODE_ALL_DATA