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 de 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ãopagado 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 de 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 que os dados sejam retornados.
Define InstanceCount como o número de instâncias a serem retornadas.
Se o bloco usar nomes de instância dinâmica, definirá OffsetInstanceNameOffsets como o deslocamento em bytes desde o início do WNODE_ALL_DATA até o início de uma matriz de deslocamentos ULONG. 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 dentro do tamanho estabelecido em WNodeHeader.BufferSize.
Se todas as instâncias tiverem o 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 de tamanho:
Limpa WNODE_FLAG_FIXED_INSTANCE_SIZE em WnodeHeader.Flags e grava uma matriz de estruturas OFFSETINSTANCEDATAANDLENGTH de InstanceCount 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 para 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 define Irp-IoStatus.Status> como STATUS_SUCCESS ou como um erro apropriado status 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 de 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 deve encaminhar a solicitação para o driver inferior seguinte.
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 deve 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
parâmetro |
Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h) |
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de