Поделиться через


функция обратного вызова WMI_SET_DATABLOCK_CALLBACK (wmilib.h)

Подпрограмма DpWmiSetDataBlock изменяет все элементы данных в одном экземпляре блока данных. Эта подпрограмма является необязательной.

Синтаксис

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
)
{...}

Параметры

[in] DeviceObject

Указатель на структуру WDM драйвера DEVICE_OBJECT .

[in] Irp

Указатель на IRP.

[in] GuidIndex

Указывает блок данных по индексу отсчитываемого от нуля в списке идентификаторов GUID, предоставленных драйвером в структуре WMILIB_CONTEXT , переданной в WmiSystemControl.

[in] InstanceIndex

Если блок, указанный в GuidIndex , содержит несколько экземпляров, InstanceIndex указывает экземпляр .

[in] BufferSize

Задает размер буфера в байтах в буфере.

[in] Buffer

Указатель на буфер, содержащий новые значения для экземпляра .

Возвращаемое значение

DpWmiSetDataBlock возвращает STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:

Если драйвер не может выполнить запрос немедленно, он может вернуть STATUS_PENDING.

Комментарии

WMI вызывает подпрограмму DpWmiSetDataBlock драйвера после того, как драйвер вызывает WmiSystemControl в ответ на запрос IRP_MN_CHANGE_SINGLE_INSTANCE .

Драйвер отвечает за проверку всех входных аргументов. В частности, драйвер должен выполнить следующие действия.

  • Убедитесь, что значение GuidIndex находится в диапазоне от нуля до GuidCount-1 на основе элемента GuidCountструктуры WMILIB_CONTEXT .
  • Убедитесь, что драйвер не помечает указанный блок данных для удаления. Если драйвер недавно указал флаг WMIREG_FLAG_REMOVE_GUID в структуре WMIGUIDREGINFO , которая содержится в структуре WMILIB_CONTEXT , запрос набора может быть доставлен до удаления.
  • Убедитесь, что значение InstanceIndex находится в диапазоне индексов экземпляров, поддерживаемых драйвером для блока данных.
  • Убедитесь, что buffer и BufferSize описывают блок данных допустимого размера, включая все заполнения, которые существуют между элементами данных, и что содержимое буфера является допустимым для блока данных.
  • Убедитесь, что указанный блок данных является блоком данных, для которого драйвер разрешает изменения, инициированные вызывающим объектом. Другими словами, драйвер не должен разрешать изменения блоков данных, которые должны быть доступны только для чтения.
Не предполагайте, что контекст потока является контекстом инициирующего приложения пользовательского режима. Возможно, драйвер более высокого уровня изменил его.

Если драйвер реализует подпрограмму DpWmiSetDataBlock , драйвер должен поместить адрес подпрограммы в элемент SetWmiDataBlockструктуры WMILIB_CONTEXT , который он передает в WmiSystemControl. Если драйвер не реализует подпрограмму DpWmiSetDataBlock , он должен присвоить setWmiDataBlock значение NULL. В последнем случае инструментарий WMI возвращает вызывающей STATUS_READ_ONLY.

Эта подпрограмма может быть страничной.

Дополнительные сведения о реализации этой процедуры см. в разделе Вызов WmiSystemControl для обработки ИРП WMI.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть wmilib.h (включая Wmilib.h)
IRQL Звонил на PASSIVE_LEVEL.

См. также раздел

IRP_MN_CHANGE_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiSystemControl