Прочитать на английском

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


Реализация пользовательских блоков WMI

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

Чтобы реализовать пользовательский блок, драйвер:

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

  • Регистрирует блок с WMI вместе с другими стандартными и настраиваемыми блоками, поддерживаемыми драйвером, как описано в разделе Регистрация в качестве поставщика данных WMI.

  • Обрабатывает все запросы WMI, указывающие указатель на объект устройства драйвера в Parameters.WMI.ProviderId и GUID стандартного блока в Parameters.WMI.DataPath, как описано в разделе Обработка запросов WMI.

Драйверы не могут управлять порядком загрузки двоичных MOF-файлов. Единственная гарантия заключается в том, что wmicore.mof загружается перед любым MOF-файлом, зависящим от драйвера. Поэтому пользовательские классы WMI должны наследоваться только от классов в том же MOF-файле или в wmicore.mof.

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

  • Поместите элементы данных, которые оперативно сгруппированы в одном блоке данных.

    Например, контроллер порта i8042 может хранить сведения о состоянии портов клавиатуры и мыши. Вместо одного большого блока данных, содержащего всю информацию о мыши и клавиатуре, драйвер может определить один блок данных для порта мыши и другой блок данных для порта клавиатуры.

  • Поместите часто используемые элементы данных в отдельные блоки данных, особенно если в противном случае они были бы сгруппированы с элементами, которые используются редко.

    Например, драйвер может предоставлять сведения о загрузке ЦП в блоке данных с одним элементом, поэтому клиент WMI может отслеживать использование ЦП без дополнительных затрат на получение дополнительных элементов данных в блоке. Клиент WMI не может запрашивать один элемент данных, поэтому для получения одного элемента необходимо запросить весь экземпляр блока данных.

  • Используйте блоки событий для уведомления клиентов WMI об исключительных событиях, а не в качестве альтернативы ведению журнала ошибок.

    Одновременно можно поместить в очередь только ограниченное количество событий, и если очередь является полной, события будут потеряны. Кроме того, невозможно гарантировать время доставки событий клиентам WMI.

  • Ограничьте блоки событий максимальным размером 1 КБ.

    Элементы событий должны быть определены как небольшие типы данных, так как существует ограничение размера, определенного реестром (изначально, 1K) для всей структуры WNODE_EVENT_ITEM , содержащей созданное событие. Для больших уведомлений драйвер может отправить WNODE_EVENT_REFERENCE структуру, которая указывает один экземпляр блока данных, который затем WMI запрашивает для получения фактического события. Однако это увеличивает задержку между возникновением события и уведомлением.

  • Поместите элементы данных фиксированного размера в начало блока данных, за которыми следуют все элементы данных переменной величины.

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

  • Определите, какие типы пользователей системы вы хотите получить доступ к блокам данных драйвера. Система предоставляет дескриптор безопасности по умолчанию для всех GUID класса WMI. При необходимости можно указать альтернативные дескрипторы безопасности в INF-файле устройства. Дополнительные сведения см. в разделе Создание безопасных установок устройств.

WMI не поддерживает управление версиями, поэтому модуль записи драйверов должен определить новый класс MOF и создать новый GUID для изменения существующего пользовательского блока.