Partilhar via


Processando IRPs WMI numa rotina de DispatchSystemControl

Um driver que manipula IRPs WMI em sua rotinaDispatchSystemControl deve manipular esse IRP somente se o ponteiro do objeto de dispositivo em Parameters.WMI.ProviderId corresponder ao ponteiro passado pelo driver em sua chamada para IoWMIRegistrationControl . Caso contrário, o driver deve encaminhar o IRP para o próximo driver inferior.

Se o motorista assumir o pedido, deve:

Verifique o GUID em Parameters.WMI.DataPath para determinar se representa um bloco de dados suportado pelo driver e, caso contrário, falhar o IRP com STATUS_WMI_GUID_NOT_FOUND.

Um driver deve verificar a estrutura WNODE_XXX em Parameters.WMI.Buffer para o nome da instância ao lidar com qualquer uma das seguintes solicitações:

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD O controlador deve verificar o nome da instância da seguinte maneira:

  • Se WNODE_FLAG_STATIC_INSTANCE_NAMES estiver definido em WnodeHeader.Flags, use InstanceIndex como um índice na lista de nomes de instâncias estáticas do driver para esse bloco.

  • Se WNODE_FLAG_STATIC_INSTANCE_NAMES não estiver definido em WnodeHeader.Flags, use OffsetInstanceName como deslocamento para o nome da instância na estrutura de entrada WNODE_XXX. OffsetInstanceName é o deslocamento em bytes do início da estrutura para um USHORT que indica o comprimento da cadeia de caracteres do nome da instância em bytes (não caracteres), incluindo o terminador NUL, se presente, seguido pela própria cadeia de caracteres em Unicode.

Se o driver não conseguir localizar a instância especificada por InstanceIndex ou OffsetInstanceName, deverá falhar o IRP com STATUS_WMI_INSTANCE_NOT_FOUND.

Para uma solicitação de IRP_MN_EXECUTE_METHOD, verifique MethodID no WNODE_METHOD_ITEM de entrada e, se o método não for válido para esse bloco de dados, falhe o IRP com STATUS_WMI_ITEMID_NOT_FOUND.

Se a solicitação gerar uma saída, um driver deve verificar o tamanho do buffer em Parameters.WMI.BufferSize ao lidar com qualquer uma das seguintes solicitações:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Se o buffer for muito pequeno para receber a saída, mas pelo menos tamanho de(WNODE_TOO_SMALL), o driver deve suceder o IRP e gravar uma estrutura de WNODE_TOO_SMALL no buffer em Parameters.WMI.Buffer. Se o buffer for menor que tamanho de(WNODE_TOO_SMALL), o driver falhará o IRP com um código NTSTATUS de STATUS_BUFFER_TOO_SMALL.

Se a solicitação gerar saída e o tamanho do buffer for adequado, escreva a seguinte saída no buffer em Parameters.WMI.Buffer:

  • Para uma solicitação de IRP_MN_QUERY_ALL_DATA, o driver grava uma estrutura de WNODE_ALL_DATA que contém dados para todas as instâncias do bloco de dados especificado.
  • Para uma solicitação IRP_MN_QUERY_SINGLE_INSTANCE, o driver escreve uma estrutura WNODE_SINGLE_INSTANCE que contém dados relativos à instância especificada de um bloco de dados.
  • Para um IRP_MN_EXECUTE_METHOD, caso o método gere saída, o driver escreve a saída do método no formato determinado pelo driver após o elemento de entrada WNODE_METHOD_ITEM no buffer (substituindo os dados de entrada, se houver).

Defina Irp->IoStatus.Information para o número de bytes gravados no buffer em Parameters.WMI.Buffer e Irp->IoStatus.Status para STATUS_SUCCESS.

Chame IoCompleteRequest para concluir o IRP.

Para obter mais informações, consulte WMI WNODE_XXX Structures.