IRP_MN_REGINFO

Драйверы, поддерживающие WMI в Microsoft Windows 98 и Microsoft Windows 2000, должны обрабатывать этот IRP. (Драйверы, поддерживающие Windows XP, также должны обрабатывать IRP_MN_REGINFO_EX IRP.) Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или путем обработки самого IRP, как описано в разделе Обработка запросов WMI.

Основной код

IRP_MJ_SYSTEM_CONTROL

При отправке

В Windows 98 и Windows 2000 WMI отправляет этот IRP для запроса или обновления сведений о регистрации драйвера после вызова драйвера IoWMIRegistrationControl. В Windows XP и более поздних версиях WMI отправляет запрос IRP_MN_REGINFO_EX .

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 для числа экземпляров.

  • Задает для одного из следующих элементов смещение в байтах статических данных имени экземпляра для блока:

    • Если драйвер устанавливает флаги с WMIREG_FLAG_INSTANCE_LIST, он устанавливает для InstanceNameList смещение списка строк статических имен экземпляров. WMI указывает экземпляры в последующих запросах по индексу в этом списке.
    • Если драйвер задает флаги с WMIREG_FLAG_INSTANCE_BASENAME, он устанавливает для BaseNameOffset смещение в строке базового имени. WMI использует эту строку для создания статических имен экземпляров для блока.
    • Если драйвер задает флаги с WMIREG_FLAG_INSTANCE_PDO, он устанавливает для Pdo смещение указателя PDO, переданного в подпрограмму AddDevice драйвера. WMI использует путь к экземпляру устройства PDO для создания статических имен экземпляров для блока.
  • Записывает строки имени экземпляра, строку базового имени или указатель на PDO со смещением, указанным InstanceNameList, BaseName или Pdo соответственно.

Если драйвер обрабатывает регистрацию WMI от имени другого драйвера (например, драйвера miniclass или miniport), он заполняет другую структуру 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.

Операция

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

Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, эта подпрограмма вызывает подпрограмму DpWmiQueryReginfo драйвера.

Если драйвер сам обрабатывает запрос IRP_MN_REGINFO , он должен делать это только в том случае, если 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 после того, как драйвер вызывает IoWMIRegistrationControl с WMIREG_ACTION_DEREGISTER, так как WMI не требует дополнительных сведений от драйвера. Драйвер обычно отменяет регистрацию блоков в ответ на запрос IRP_MN_REMOVE_DEVICE .

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также раздел

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO_EX