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
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) |