Вызов 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 :
DpWmiQueryReginfo — (обязательно) Предоставляет сведения о данных и блоках событий, зарегистрированных драйвером. WMI вызывает подпрограмму DpWmiQueryReginfo драйвера для обработки запроса IRP_MN_REGINFO или IRP_MN_REGINFO_EX . Дополнительные сведения см. в статье Использование библиотеки WMI для регистрации блоков.
DpWmiQueryDataBlock (обязательно) Возвращает один экземпляр или все экземпляры блока данных. WMI вызывает подпрограмму DpWmiQueryDataBlock драйвера для обработки запроса IRP_MN_QUERY_SINGLE_INSTANCE или IRP_MN_QUERY_ALL_DATA .
DpWmiSetDataBlock — (необязательно) Изменяет все элементы данных в одном экземпляре блока данных. WMI вызывает подпрограмму DpWmiSetDataBlock драйвера для обработки запроса IRP_MN_CHANGE_SINGLE_INSTANCE .
DpWmiSetDataItem — (необязательно) Изменяет один элемент данных в экземпляре блока данных. WMI вызывает подпрограмму DpWmiSetDataItem драйвера для обработки запроса IRP_MN_CHANGE_SINGLE_ITEM .
DpWmiFunctionControl (необязательно) включает и отключает уведомления о событиях и сбор данных для блоков, зарегистрированных как ресурсоемкие для сбора. WMI вызывает подпрограмму DpWmiFunctionControl драйвера для обработки запроса IRP_MN_ENABLE_COLLECTION, IRP_MN_DISABLE_COLLECTION, IRP_MN_ENABLE_EVENTS или IRP_MN_DISABLE_EVENTS .
DpWmiExecuteMethod (необязательно) выполняет метод, связанный с блоком данных. WMI вызывает подпрограмму DpWmiExecuteMethod драйвера для обработки запроса IRP_MN_EXECUTE_METHOD .
Процедуры DpWmiXxxx драйвера могут иметь любые имена, выбранные модулем записи драйвера.
Перед вызовом WmiSystemControl драйвер должен инициализировать структуру WMILIB_CONTEXT с точками входа в подпрограммы DpWmiXxx и сведениями о блоках данных и блоках событий.
Когда драйвер получает запрос WMI:
Драйвер вызывает WmiSystemControl с указателем на инициализированную структуру WMILIB_CONTEXT , указатель на объект устройства и указатель на IRP.
WMI проверяет параметры IRP и вызывает подпрограмму DpWmiXxxx драйвера , которая обрабатывает запрос. Если драйвер не задал точку входа в WMILIB_CONTEXT для необязательной подпрограммы DpWmiXxx, WMI завершает IRP со значениями по умолчанию и состоянием.
В своей подпрограмме DpWmiXxx драйвер обрабатывает запрос и записывает все выходные данные в буфер, предоставленный вызывающим объектом. Например, подпрограмма DpWmiQueryDataBlock драйвера записывает запрошенные экземпляры указанного блока в буфер.
Во всех подпрограммах DpWmiXxx, кроме DpWmiQueryReginfo, драйвер вызывает WmiCompleteRequest для выполнения запроса или возвращает STATUS_PENDING для отсрочки завершения, как и для любого IRP.
WMI выполняет необходимую постобработку, упаковает все выходные данные в соответствующую структуру WNODE_XXX и передает выходные данные и состояние потребителю данных.