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 IRP em si, conforme descrito em Tratamento de Solicitações WMI.
Se um driver chamar WmiSystemControl para lidar com uma solicitação de IRP_MN_CHANGE_SINGLE_ITEM , a WMI, por sua vez, chamará a rotina DpWmiSetDataItem desse driver.
Código principal
Quando enviado
O WMI envia esse IRP para alterar um único item de dados em uma única instância de um 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 aponta para o objeto de dispositivo do driver que deve responder à solicitação. Esse ponteiro está localizado no local da pilha de E/S do driver no IRP.
Parameters.WMI.DataPath aponta para um GUID que identifica o bloco de dados a ser definido.
Parameters.WMI.BufferSize indica o tamanho do buffer nãopagado em Parameters.WMI.Buffer.
Parameters.WMI.Buffer aponta para uma estrutura WNODE_SINGLE_ITEM que identifica a instância do bloco de dados, a ID do item a ser definido e um novo valor de dados.
Parâmetros de saída
Nenhum.
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 E/S status.
Caso contrário, o driver define Irp-IoStatus.Status> como STATUS_SUCCESS ou para um erro apropriado status como o seguinte:
STATUS_WMI_INSTANCE_NOT_FOUND
STATUS_WMI_ITEMID_NOT_FOUND
STATUS_WMI_GUID_NOT_FOUND
STATUS_WMI_READ_ONLY
STATUS_WMI_SET_FAILURE
Com êxito, um driver define Irp-IoStatus.Information> como zero.
Operação
Se um driver manipular IRPs WMI chamando WmiSystemControl, essa rotina chamará a rotina DpWmiSetDataItem do driver ou retornará STATUS_WMI_READ_ONLY se o driver não definir a rotina.
Se um driver manipular IRP_MN_CHANGE_SINGLE_ITEM solicitações propriamente ditas, ele deverá fazê-lo somente se Parameters.WMI.ProviderId apontar para o mesmo objeto de dispositivo que o ponteiro que o driver passou para IoWMIRegistrationControl. Caso contrário, o driver deve encaminhar a solicitação para o driver mais baixo.
Não implemente suporte para IRP_MN_CHANGE_SINGLE_ITEM a menos que você tenha certeza de que um componente de modo de usuário fornecido pelo sistema requer essa funcionalidade.
Antes de lidar com uma solicitação, o driver deve determinar se Parameters.WMI.DataPath aponta para um GUID compatível com o driver. Se isso não acontecer, o driver deverá falhar no IRP e retornar STATUS_WMI_GUID_NOT_FOUND.
Se o driver der suporte ao bloco de dados, ele deverá marcar a estrutura de WNODE_SINGLE_ITEM de entrada para a qual Parameters.WMI.Buffer aponta para o nome da instância, da seguinte maneira:
Se WNODE_FLAG_STATIC_INSTANCE_NAMES for definido em WnodeHeader.Flags, o driver usará InstanceIndex como um índice na lista de nomes de instância estática do driver para esse bloco. O WMI obtém o índice dos dados de registro fornecidos pelo driver quando ele registrou o bloco.
Se WNODE_FLAG_STATIC_INSTANCE_NAMES estiver claro em WnodeHeader.Flags, o driver usará o deslocamento em OffsetInstanceName para localizar a cadeia de caracteres de nome da instância na estrutura de WNODE_SINGLE_ITEM de entrada. OffsetInstanceName é o deslocamento em bytes do início da estrutura para um comprimento do tamanho de USHORT da cadeia de caracteres de nome da instância em bytes (não caracteres). Esse comprimento inclui o terminador NULL, se presente, seguido pela cadeia de caracteres de nome da instância em Unicode.
O driver é responsável por validar todos os valores de entrada. Especificamente, o driver deverá fazer o seguinte se manipular a solicitação IRP em si:
Para nomes estáticos, verifique se o membro InstanceIndex da estrutura WNODE_SINGLE_ITEM está dentro do intervalo de índices de instância com suporte do driver para o bloco de dados.
Para nomes dinâmicos, verifique se a cadeia de caracteres de nome da instância identifica uma instância de bloco de dados compatível com o driver.
Verifique se o membro ItemId da estrutura WNODE_SINGLE_ITEM está dentro do intervalo de identificadores de item com suporte do driver para o bloco de dados.
Verifique se os membros DataBlockOffset e SizeDataItem da estrutura WNODE_SINGLE_ITEM descrevem um bloco de dados de tamanho válido e se o conteúdo do buffer é válido para o item de dados.
Verifique se o item de dados especificado é aquele para o qual o driver permite modificações iniciadas pelo chamador. Em outras palavras, o driver não deve permitir modificações em itens de dados que você pretendia ser somente leitura.
Não suponha que o contexto do thread seja o do aplicativo de modo de usuário iniciado — um driver de nível superior pode tê-lo alterado.
Se o driver não puder localizar a instância especificada, ele deverá falhar no IRP e retornar STATUS_WMI_INSTANCE_NOT_FOUND. Para uma instância com um nome de instância dinâmica, esse status indica que o driver não dá suporte à instância. Portanto, o WMI pode continuar consultando outros provedores de dados e retornar um erro apropriado ao consumidor de dados se outro provedor encontrar a instância, mas não puder lidar com a solicitação por algum outro motivo.
Se o driver localizar a instância e puder lidar com a solicitação, ele definirá o item de dados na instância como o valor no WNODE_SINGLE_ITEM. Se o item de dados for somente leitura, o driver deixará o item inalterado, falhará no IRP e retornará STATUS_WMI_READ_ONLY.
Se a instância for válida, mas o driver não puder lidar com a solicitação, ele poderá retornar qualquer erro apropriado status.
Requisitos
parâmetro |
Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h) |