WMI_SET_DATABLOCK_CALLBACK función de devolución de llamada (wmilib.h)

La rutina DpWmiSetDataBlock cambia todos los elementos de datos de una sola instancia de un bloque de datos. Esta rutina es opcional.

Sintaxis

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

Puntero a la estructura de DEVICE_OBJECT WDM del controlador.

[in] Irp

Puntero al IRP.

[in] GuidIndex

Especifica el bloque de datos por su índice de base cero en la lista de GUID proporcionados por el controlador en la estructura de WMILIB_CONTEXT que pasó a WmiSystemControl.

[in] InstanceIndex

Si el bloque especificado por GuidIndex tiene varias instancias, InstanceIndex especifica la instancia.

[in] BufferSize

Especifica el tamaño en bytes del búfer en buffer.

[in] Buffer

Puntero a un búfer que contiene nuevos valores para la instancia.

Valor devuelto

DpWmiSetDataBlock devuelve STATUS_SUCCESS o un estado de error adecuado, como el siguiente:

Si el controlador no puede completar la solicitud inmediatamente, puede devolver STATUS_PENDING.

Comentarios

WMI llama a la rutina DpWmiSetDataBlock de un controlador después de que el controlador llame a WmiSystemControl en respuesta a una solicitud de IRP_MN_CHANGE_SINGLE_INSTANCE .

El controlador es responsable de validar todos los argumentos de entrada. En concreto, el controlador debe hacer lo siguiente:

  • Compruebe que el valor guidIndex está entre cero y GuidCount-1, en función del miembro GuidCount de la estructura WMILIB_CONTEXT .
  • Compruebe que el controlador no ha marcado el bloque de datos especificado para su eliminación. Si el controlador especificó recientemente la marca WMIREG_FLAG_REMOVE_GUID en una estructura WMIGUIDREGINFO contenida en una estructura WMILIB_CONTEXT , es posible que llegue una solicitud establecida antes de que se produzca la eliminación.
  • Compruebe que el valor instanceIndex está dentro del intervalo de índices de instancia admitidos por el controlador para el bloque de datos.
  • Compruebe que Buffer y BufferSize describen un bloque de datos de tamaño válido, incluido cualquier relleno que exista entre elementos de datos y que el contenido del búfer sea válido para el bloque de datos.
  • Compruebe que el bloque de datos especificado es uno para el que el controlador permite modificaciones iniciadas por el autor de la llamada. En otras palabras, el controlador no debe permitir modificaciones en bloques de datos destinados a ser de solo lectura.
No asuma que el contexto del subproceso es el de la aplicación en modo de usuario que inicia: es posible que un controlador de nivel superior lo haya cambiado.

Si un controlador implementa una rutina DpWmiSetDataBlock , el controlador debe colocar la dirección de la rutina en el miembro SetWmiDataBlock de la estructura WMILIB_CONTEXT que pasa a WmiSystemControl. Si un controlador no implementa una rutina DpWmiSetDataBlock , debe establecer SetWmiDataBlock en NULL. En este último caso, WMI devuelve STATUS_READ_ONLY al autor de la llamada.

Esta rutina puede ser paginable.

Para obtener más información sobre cómo implementar esta rutina, vea Llamar a WmiSystemControl para controlar irP de WMI.

Requisitos

Requisito Value
Plataforma de destino Escritorio
Encabezado wmilib.h (incluya Wmilib.h)
IRQL Se llama en PASSIVE_LEVEL.

Consulte también

IRP_MN_CHANGE_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiSystemControl