IRP_MN_REGINFO_EX
WMI отправляет этот IRP для запроса или обновления сведений о регистрации драйвера после того, как драйвер вызовет IoWMIRegistrationControl. Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или обработки самого IRP, как описано в разделе Обработка запросов WMI.
Если драйвер вызывает WmiSystemControl для обработки запроса IRP_MN_REGINFO_EX , WMI, в свою очередь, вызывает подпрограмму DpWmiQueryReginfo этого драйвера.
В Операционных системах Microsoft Windows XP и более поздних версий драйверы, поддерживающие WMI, должны обрабатывать этот IRP. Драйверы, поддерживающие Microsoft Windows 98 и Windows 2000, также должны обрабатывать IRP_MN_REGINFO.
Основной код
При отправке
В Windows XP и более поздних версиях WMI отправляет этот IRP для запроса или обновления сведений о регистрации драйвера после вызова драйвером IoWMIRegistrationControl. В Windows 98 и Windows 2000 WMI отправляет запрос IRP_MN_REGINFO .
WMI отправляет этот IRP по irQL = PASSIVE_LEVEL в контексте системного потока.
Входные параметры
Parameters.WMI.ProviderId указывает на объект устройства драйвера, который должен отвечать на запрос. Этот указатель находится в расположении стека ввода-вывода драйвера в IRP.
Параметр Parameters.WMI.DataPath имеет значение WMIREGISTER для запроса сведений о регистрации или WMIUPDATE для их обновления.
Parameters.WMI.BufferSize указывает максимальный размер непагрегированного буфера в параметре Parameters.WMI.Buffer. Размер должен быть больше или равен общему количеству (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)), где GuidCount — это количество блоков данных и блоков событий, зарегистрированных драйвером, а также пространство для имен статических экземпляров, если таковые есть.
Выходные параметры
Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, WMI получает сведения о регистрации блоков данных драйвера, вызывая подпрограмму DpWmiQueryReginfo .
В противном случае драйвер заполняет структуру WMIREGINFO в Parameters.WMI.Buffer следующим образом:
Задает bufferSize для размера структуры WMIREGINFO в байтах, а также связанных регистрационных данных.
Если драйвер обрабатывает запросы WMI от имени другого драйвера, устанавливает для NextWmiRegInfo смещение в байтах от начала этого WMIREGINFO до начала другой структуры WMIREGINFO , содержащей сведения о регистрации от другого драйвера.
Задает Для RegistryPath путь к реестру, который был передан в подпрограмму DriverEntry драйвера.
Если параметр Parameters.WMI.Datapath имеет значение WMIREGISTER, присваивает MofResourceName смещению от начала этого WMIREGINFO к подсчитываемой строке Юникода, содержащей имя ресурса MOF драйвера в файле изображения.
Задает guidCount для количества блоков данных и блоков событий для регистрации или обновления.
Записывает массив структур WMIREGGUID , по одному для каждого блока данных или блока событий, предоставляемого драйвером, в WmiRegGuid.
Драйвер заполняет каждую структуру WMIREGGUID следующим образом:
Задает guid для GUID, который идентифицирует блок.
Задает флаги для предоставления сведений об именах экземпляров и других характеристиках блока. Например, если блок регистрируется со статическими именами экземпляров, драйвер устанавливает флаги с соответствующим флагом WMIREG_FLAG_INSTANCE_XXX .
Если блок регистрируется со статическими именами экземпляров, драйвер:
Задает значение InstanceCount для числа экземпляров.
Задает для одного из следующих элементов смещение в байтах для статических данных имени экземпляра для блока:
Если драйвер задает flags с WMIREG_FLAG_INSTANCE_LIST, он задает для InstanceNameList смещение списка строк статических имен экземпляров. WMI указывает экземпляры в последующих запросах по индексу в этом списке.
Если драйвер задает flags с WMIREG_FLAG_INSTANCE_BASENAME, он присваивает baseNameOffset смещение строке базового имени. WMI использует эту строку для создания статических имен экземпляров для блока.
Если драйвер задает флаги с WMIREG_FLAG_INSTANCE_PDO, он задает для Pdo смещение указателя PDO, переданного в подпрограмму AddDevice драйвера. WMI использует путь к экземпляру устройства PDO для создания статических имен экземпляров для блока. Драйверы должны вызывать ObReferenceObject для физического объекта устройства, переданного в Pdo. Система будет автоматически вызывать ObDereferenceObject для разыменования объекта; драйвер не должен этого делать. (Драйверам, которые используют WmiSystemControl для обработки irP, не нужно вызывать ObReferenceObject. WMI автоматически делает это перед вызовом процедуры DpWmiQueryReginfo драйвера.)
Записывает строки имени экземпляра, строку базового имени или указатель на PDO со смещением, указанным InstanceNameList, BaseName или Pdo соответственно.
Если драйвер обрабатывает регистрацию WMI от имени другого драйвера (например, драйвера мини-класса или мини-порта), он заполняет другую структуру WMIREGINFO регистрационными данными другого драйвера и записывает их в NextWmiRegInfo в предыдущей структуре.
Если буфер в Parameters.WMI.Buffer слишком мал для получения всех данных, драйвер записывает необходимый размер в байтах в качестве ULONG в Parameters.WMI.Buffer и завершает ошибку IRP и возвращает STATUS_BUFFER_TOO_SMALL.
Блок состояния ввода-вывода
Если драйвер обрабатывает IRP путем вызова WmiSystemControl, WMI задает Irp-IoStatus.Status и Irp-IoStatus.Information в блоке состояния ввода-вывода>>.
В противном случае драйвер задает Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:
STATUS_BUFFER_TOO_SMALL
При успешном выполнении драйвер задает Irp-IoStatus.Information> число байтов, записанных в буфер в разделе Parameters.WMI.Buffer.
Операция
Если драйвер обрабатывает запрос IRP_MN_REGINFO_EX сам, он должен делать это только в том случае, если Parameters.WMI.ProviderId указывает на тот же объект устройства, что и указатель, переданный драйвером в IoWMIRegistrationControl. В противном случае драйвер должен переслать запрос следующему драйверу.
Перед обработкой запроса драйвер должен проверка Parameters.WMI.DataPath, чтобы определить, запрашивает ли WMI сведения о регистрации (WMIREGISTER) или запрашивает обновление (WMIUPDATE).
WMI отправляет этот IRP с помощью WMIREGISTER после того, как драйвер вызывает IoWMIRegistrationControl с WMIREG_ACTION_REGISTER или WMIREG_ACTION_REREGISTER. В ответ драйвер должен заполнить буфер в Parameters.WMI.Buffer следующим образом:
Структура WMIREGINFO , которая указывает путь к реестру драйвера, имя его ресурса MOF и количество регистрирующихся блоков.
Одна структураWMIREGGUID для каждого блока для регистрации. Если блок должен быть зарегистрирован со статическими именами экземпляров, драйвер устанавливает соответствующий флаг WMIREG_FLAG_INSTANCE_XXX в структуре WMIREGGUID для этого блока.
Любые строки WMI должны создавать статические имена экземпляров.
WMI отправляет этот IRP с WMIUPDATE после того, как драйвер вызывает IoWmiRegistrationControl с WMIREG_ACTION_UPDATE_GUIDS. В ответ драйвер должен заполнить буфер в Parameters.WMI.Buffer структурой WMIREGINFO следующим образом:
Чтобы удалить блок, драйвер задает WMIREG_FLAG_REMOVE_GUID в своей структуре WMIREGGUID .
Чтобы добавить или обновить блок (например, изменить его статические имена экземпляров), драйвер очищает WMIREG_FLAG_REMOVE_GUID и предоставляет новые или обновленные регистрационные значения для блока.
Чтобы зарегистрировать новый или существующий блок со статическими именами экземпляров, драйвер задает соответствующий WMIREG_FLAG_INSTANCE_XXX и предоставляет все строки, необходимые WMI для создания статических имен экземпляров.
Драйвер может использовать те же структуры WMIREGINFO для удаления, добавления или обновления блоков, которые изначально использовались для регистрации всех блоков, изменяя только флаги и данные для обновляемых блоков. Если WMIREGGUID в такой структуре WMIREGINFO точно соответствует WMIREGGUID , переданной драйвером при первой регистрации этого блока, WMI пропускает обработку, связанную с обновлением блока.
WMI не отправляет запрос IRP_MN_REGINFO_EX после вызова драйвером IoWMIRegistrationControl с WMIREG_ACTION_DEREGISTER, так как WMI не требует дополнительных сведений от драйвера. Как правило, драйвер отменяет регистрацию своих блоков в ответ на запрос IRP_MN_REMOVE_DEVICE .
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |