WMI_SET_DATABLOCK_CALLBACK função de retorno de chamada (wmilib.h)

A rotina DpWmiSetDataBlock altera todos os itens de dados em uma única instância de um bloco de dados. Essa rotina é opcional.

Sintaxe

WMI_SET_DATABLOCK_CALLBACK WmiSetDatablockCallback;

NTSTATUS WmiSetDatablockCallback(
  [in] PDEVICE_OBJECT DeviceObject,
  [in] PIRP Irp,
  [in] ULONG GuidIndex,
  [in] ULONG InstanceIndex,
  [in] ULONG BufferSize,
  [in] PUCHAR Buffer
)
{...}

Parâmetros

[in] DeviceObject

Ponteiro para a estrutura de DEVICE_OBJECT do WDM do driver.

[in] Irp

Ponteiro para o IRP.

[in] GuidIndex

Especifica o bloco de dados por seu índice baseado em zero na lista de GUIDs fornecidos pelo driver na estrutura WMILIB_CONTEXT passada para WmiSystemControl.

[in] InstanceIndex

Se o bloco especificado por GuidIndex tiver várias instâncias, InstanceIndex especificará a instância.

[in] BufferSize

Especifica o tamanho em bytes do buffer em Buffer.

[in] Buffer

Ponteiro para um buffer que contém novos valores para a instância.

Retornar valor

DpWmiSetDataBlock retorna STATUS_SUCCESS ou um erro apropriado status como o seguinte:

Se o driver não puder concluir a solicitação imediatamente, ele poderá retornar STATUS_PENDING.

Comentários

O WMI chama a rotina DpWmiSetDataBlock de um driver depois que o driver chama WmiSystemControl em resposta a uma solicitação de IRP_MN_CHANGE_SINGLE_INSTANCE .

O driver é responsável por validar todos os argumentos de entrada. Especificamente, o driver deve fazer o seguinte:

  • Verifique se o valor guidIndex está entre zero e GuidCount-1, com base no membro GuidCount da estrutura WMILIB_CONTEXT .
  • Verifique se o driver não sinalizou o bloco de dados especificado para remoção. Se o driver especificou recentemente o sinalizador WMIREG_FLAG_REMOVE_GUID em uma estrutura WMIGUIDREGINFO contida em uma estrutura WMILIB_CONTEXT , é possível que uma solicitação definida chegue antes da remoção ocorrer.
  • Verifique se o valor InstanceIndex está dentro do intervalo de índices de instância com suporte do driver para o bloco de dados.
  • Verifique se Buffer e BufferSize descrevem um bloco de dados de tamanho válido, incluindo qualquer preenchimento existente entre itens de dados e se o conteúdo do buffer é válido para o bloco de dados.
  • Verifique se o bloco 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 blocos de dados que você pretendia ser somente leitura.
Não suponha que o contexto de thread seja o do aplicativo de modo de usuário iniciador— um driver de nível superior pode tê-lo alterado.

Se um driver implementar uma rotina DpWmiSetDataBlock , o driver deverá colocar o endereço da rotina no membro SetWmiDataBlock da estrutura WMILIB_CONTEXT que ele passa para WmiSystemControl. Se um driver não implementar uma rotina DpWmiSetDataBlock , ele deverá definir SetWmiDataBlock como NULL. No último caso, o WMI retorna STATUS_READ_ONLY ao chamador.

Essa rotina pode ser paginável.

Para obter mais informações sobre como implementar essa rotina, consulte Chamando WmiSystemControl para lidar com IRPs WMI.

Requisitos

Requisito Valor
Plataforma de Destino Área de Trabalho
Cabeçalho wmilib.h (inclua Wmilib.h)
IRQL Chamado em PASSIVE_LEVEL.

Confira também

IRP_MN_CHANGE_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiSystemControl