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


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

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

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

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

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

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

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

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

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

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

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

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