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


Поддержка блоков данных и событий WMI в драйвере

[Относится только к KMDF]

Драйверы на основе платформы поддерживают блоки данных WMI, предоставляя функции обратного вызова событий. Драйверы поддерживают события WMI путем вызова объектного метода, который отправляет событие клиентам WMI.

Поддержка блоков данных WMI для чтения и записи

Если сведения в блоке данных WMI доступны для чтения и записи клиентами WMI, драйвер должен предоставить функцию обратного вызова EvtWmiInstanceQueryInstance , которая обслуживает клиентские запросы на чтение, а также функции обратного вызова EvtWmiInstanceSetInstance или EvtWmiInstanceSetItem , которые обслуживают запросы на запись клиента.

Если блок данных содержит методы, которые драйвер выполняет по запросу клиента, драйвер должен также предоставить функцию обратного вызова EvtWmiInstanceExecuteMethod .

Если блок данных WMI доступен только для записи (то есть клиенты WMI могут записывать сведения в блок данных, но не могут считать блок данных), драйвер не предоставляет функцию обратного вызова EvtWmiInstanceQueryInstance .

Поддержка Read-Only блоков данных WMI

Если клиент WMI не может изменить сведения в блоке данных WMI, драйвер не предоставляет функции обратного вызова EvtWmiInstanceSetInstance или EvtWmiInstanceSetItem . Для поддержки запросов к сведениям блока данных от клиентов WMI драйвер может выполнить одно из следующих действий:

  • Предоставьте функцию обратного вызова EvtWmiInstanceQueryInstance для копирования данных, предоставленных драйвером, в буфер, предоставленный WMI.

  • Сохраните сведения блока данных в контекстном пространстве объекта экземпляра WMI и задайте для элемента UseContextForQuery структуры WDF_WMI_INSTANCE_CONFIG экземпляра значение TRUE.

Если драйвер задает для UseContextForQuery значение TRUE, платформа копирует контекстное пространство объекта экземпляра в буфер, предоставленный WMI, когда клиент WMI запрашивает сведения об экземпляре. Обратные вызовы EvtWmiInstanceXxx не требуются, если драйвер имеет только один экземпляр WMI, предоставляющий данные фиксированной длины только для чтения из области контекста объекта.

Если блок данных только для чтения содержит методы, которые драйвер выполняет по запросу клиента, драйвер также может предоставить функцию обратного вызова EvtWmiInstanceExecuteMethod .

Поддержка дорогостоящих блоков данных WMI

Если драйвер собирает относительно большие объемы динамических данных для поддержки одного из блоков данных WMI, драйвер должен сделать следующее:

  • Объявите блок данных как "дорогостоящий", установив флаг WdfWmiProviderExpensive в элементе Flags структуры WDF_WMI_PROVIDER_CONFIG объекта поставщика WMI.

  • Предоставьте функцию обратного вызова EvtWmiProviderFunctionControl , которая включает и отключает сбор данных для блока данных, или вызовите WdfWmiProviderIsEnabled , чтобы определить, следует ли драйверу включать или отключать сбор данных.

Если драйвер устанавливает флаг WdfWmiProviderExpensive , платформа вызывает функцию обратного вызова EvtWmiProviderFunctionControl , когда клиент WMI регистрируется для доступа к блоку данных. Функция обратного вызова должна предоставить драйверу возможность собирать данные. Если все клиенты WMI удаляют свои регистрации для блока данных, платформа снова вызывает функцию обратного вызова EvtWmiProviderFunctionControl , чтобы драйвер смог остановить сбор данных.

Поддержка событий WMI

Драйвер может использовать события WMI для уведомления клиентов WMI об исключительных условиях. (Не следует использовать события WMI в качестве альтернативы ошибкам ведения журнала.) Как и элементы данных, события WMI определяются в блоках данных WMI в файлах формата управляемых объектов (MOF).

Клиенты WMI регистрируются для уведомления о событиях WMI. Чтобы отправить событие зарегистрированным клиентам WMI, драйвер вызывает метод WdfWmiInstanceFireEvent . Этот метод позволяет драйверу при необходимости отправлять данные, относящиеся к событиям, клиентам.

Если блок данных WMI, определяющий событие, также содержит элементы данных WMI или элементы методов, драйвер предоставляет соответствующие функции обратного вызова WMI. Если блок данных определяет событие, но не содержит элементов данных или методов, драйвер должен установить флаг WdfWmiProviderEventOnly в элементе Flags структуры WDF_WMI_PROVIDER_CONFIG объекта поставщика WMI.

Драйвер должен вызывать WdfWmiInstanceFireEvent , только если клиент WMI зарегистрирован для уведомления о событии. Драйвер может определить, следует ли вызывать WdfWmiInstanceFireEvent , предоставив функцию обратного вызова EvtWmiProviderFunctionControl или вызвав WdfWmiProviderIsEnabled.

Поддержка трассировки событий WMI

События трассировки определяются в MOF-файлах так же, как и другие события WMI. Когда драйвер создает объект поставщика WMI для события трассировки, он должен установить флаг WdfWmiProviderTracing в элементе Flags структуры WDF_WMI_PROVIDER_CONFIG объекта поставщика.

После регистрации экземпляра поставщика драйвер может вызвать WdfWmiProviderGetTracingHandle , чтобы получить дескриптор трассировки. Драйвер может использовать дескриптор трассировки в качестве входных данных для процедуры WmiTraceMessage .

Дополнительные сведения о трассировке событий см. в разделе: