Обработка IRP_MN_REGINFO и IRP_MN_REGINFO_EX в блоки регистрации
В Windows 98 и Windows 2000 система отправляет IRP_MN_REGINFO запрос драйверу, чтобы разрешить драйверу регистрировать свои классы WMI. В Windows XP и более поздних версиях система отправляет запрос IRP_MN_REGINFO_EX . Большинство драйверов могут обрабатывать эти запросы с помощью WmiSystemControl для предоставления процедуры обратного вызова. Дополнительные сведения см . в статье Использование библиотеки WMI для регистрации блоков .
Драйвер должен обрабатывать IRP_MN_REGINFO или IRP_MN_REGINFO_EX запросы на регистрацию блоков, использующих динамические имена экземпляров или использующих список имен статических экземпляров, определенных драйвером; он не может вызывать WmiSystemControl для регистрации таких блоков. При необходимости драйвер может обработать этот запрос для регистрации блоков, использующих статические имена экземпляров на основе PDO или строки базового имени, определенного драйвером.
В этом случае драйвер:
Заполняет структуру WMIREGINFO в parameters.WMI.Buffer , которая указывает:
Количество байтов всех регистрационных данных, предоставленных драйвером, включая данные, предоставленные от имени другого драйвера.
Путь к реестру драйвера.
Имя ресурса MOF драйвера.
Количество регистрирующихся блоков.
Массив структур WMIREGGUID , по одной для каждого блока.
Для каждого блока драйвер заполняет структуру WMIREGGUID , которая указывает:
Идентификатор GUID, представляющий блок.
Флаги, предоставляющие сведения об именах экземпляров и других характеристиках блока, таких как затраты на сбор блока. Дополнительные сведения см. в разделе Флаги регистрации WMI.
Если блок регистрируется со статическими именами экземпляров, драйвер задает один из следующих элементов, чтобы указать статические данные имени экземпляра для блока:
Если драйвер устанавливает флаги с WMIREG_FLAG_INSTANCE_LIST, он устанавливает для InstanceNameList смещение списка строк статических имен экземпляров. WMI указывает экземпляры в последующих запросах по индексу в этом списке.
Если драйвер задает флаги с WMIREG_FLAG_INSTANCE_BASENAME, он устанавливает для BaseNameOffset смещение в строке базового имени. WMI использует эту строку для создания статических имен экземпляров для блока.
Если драйвер устанавливает флаги с WMIREG_FLAG_INSTANCE_PDO, он задает PDO в PDO , переданное в подпрограмму AddDevice драйвера. WMI использует путь к экземпляру устройства PDO для создания статических имен экземпляров для блока. При обработке запроса IRP_MN_REGINFO_EX драйверы должны вызывать подпрограмму ObReferenceObject для объекта физического устройства, переданного в Pdo. (Система автоматически вызывает ObDereferenceObject для разыменования объекта. Драйвер не должен это делать.)
Драйвер записывает строки имени экземпляра или базовую строку имени со смещением, указанным InstanceNameList или BaseName соответственно.
Если драйвер регистрирует блоки от имени другого драйвера (так как драйвер класса может от имени драйвера мини-класса), драйвер заполняет другую структуру WMIREGINFO и список структур WMIREGGUID регистрационными данными для блоков другого драйвера и устанавливает NextWmiRegInfo в первом WMIREGINFO со смещением в байтах от начала первой структуры WMIREGINFO до начала второй структуры WMIREGINFO .