Compartilhar via


Processando IRPs WMI em uma rotina DispatchSystemControl

Um driver que lida com IRPs WMI em sua rotina DispatchSystemControl deve lidar com esse IRP somente se o ponteiro do objeto do 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 driver manipular a solicitação, ele deverá:

Verifique o GUID em Parameters.WMI.DataPath para determinar se ele representa um bloco de dados compatível com o driver e, caso contrário, falhe no IRP com STATUS_WMI_GUID_NOT_FOUND.

Um driver deve marcar a estrutura de entrada 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 driver deve marcar para o nome da instância da seguinte maneira:

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

  • Se WNODE_FLAG_STATIC_INSTANCE_NAMES estiver claro em WnodeHeader.Flags, use OffsetInstanceName como um deslocamento para a cadeia de caracteres de 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 de 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 puder localizar a instância especificada por InstanceIndex ou OffsetInstanceName, ele deverá falhar no IRP com STATUS_WMI_INSTANCE_NOT_FOUND.

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

Se a solicitação gerar saída, um driver deverá marcar 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 sizeof(WNODE_TOO_SMALL), o driver deverá ter êxito no IRP e gravar uma estrutura WNODE_TOO_SMALL no buffer em Parameters.WMI.Buffer. Se o buffer for menor que sizeof(WNODE_TOO_SMALL), o driver falhará no 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 WNODE_ALL_DATA que contém dados para todas as instâncias do bloco de dados especificado.
  • Para uma solicitação de IRP_MN_QUERY_SINGLE_INSTANCE , o driver grava uma estrutura WNODE_SINGLE_INSTANCE que contém dados para a instância especificada de um bloco de dados.
  • Para um IRP_MN_EXECUTE_METHOD se o método gerar saída, o driver gravará a saída do método no formato determinado pelo driver após a entrada WNODE_METHOD_ITEM no buffer (substituindo dados de entrada, se houver).

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

Chame IoCompleteRequest para concluir o IRP.

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