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


Вызов WmiSystemControl для обработки IRP WMI

Подпрограммы библиотекИ WMI упрощают обработку запросов WMI, так как вместо обработки каждого такого запроса драйвер вызывает WmiSystemControl. В вызове WmiSystemControl драйвер передает инициализированную WMILIB_CONTEXT структуру, содержащую точки входа в подпрограммы обратного вызова библиотеки WMI драйвера (подпрограммыDpWmiXxxx ) и сведения о блоках данных и блоках событий драйвера.

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

Для обработки IRPs WMI путем вызова WmiSystemControl драйвер должен реализовать определенные необходимые процедуры обратного вызова DpWmiXxx и может реализовать дополнительные процедуры обратного вызова DpWmiXxx.

Подпрограммы DpWmiXxxx драйвера могут иметь любые имена, выбранные автором драйвера.

Перед вызовом WmiSystemControl драйвер должен инициализировать структуру WMILIB_CONTEXT с точками входа в подпрограммы DpWmiXxx и сведения о его блоках данных и блоках событий.

Когда драйвер получает запрос WMI:

  1. Драйвер вызывает WmiSystemControl с указателем на инициализированную WMILIB_CONTEXT структуру, указатель на объект устройства и указатель на IRP.

  2. WMI проверяет параметры IRP и вызывает подпрограмму DpWmiXxx драйвера, обрабатывающую запрос. Если драйвер не задал точку входа в WMILIB_CONTEXT для необязательной подпрограммы DpWmiXxx, WMI завершает IRP со значениями и статусом по умолчанию.

  3. В своей подпрограмме DpWmiXxx драйвер обрабатывает запрос и записывает все выходные данные в предоставленный вызывающим буфер. Например, подпрограмма DpWmiQueryDataBlock драйвера записывает запрошенные экземпляры указанного блока в буфер.

  4. Во всех подпрограммах DpWmiXxx, кроме DpWmiQueryReginfo, драйвер вызывает WmiCompleteRequest для завершения запроса или возвращает STATUS_PENDING, чтобы отложить завершение, как и для любого IRP.

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