Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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) |