Определение имен экземпляров WMI
Экземпляр блока WMI содержит данные, предоставляемые определенным физическим устройством или программным компонентом. Точно так же, как GUID блока однозначно идентифицирует блок, имя экземпляра однозначно идентифицирует этот экземпляр блока. Клиентские приложения WMI используют имена экземпляров для связывания сведений, возвращаемых в блоке данных, с устройством или компонентом, предоставляющим данные. WMI использует имена экземпляров, чтобы определить, на какое устройство следует отправить запрос. Настоятельно рекомендуется, чтобы драйверы использовали свои PDO при определении имен экземпляров.
Драйвер может определить имена экземпляров для блока двумя способами:
При регистрации блока драйвер передает список статических имен экземпляров в WMI.
После регистрации блока драйвер и WMI указывают имя экземпляра по индексу в этом списке. Статические имена экземпляров могут основываться на идентификаторе экземпляра устройства PDO драйвера или базовом имени, определяемом драйвером; или драйвер может определить список строк имен экземпляров. Статические имена экземпляров сохраняются до тех пор, пока драйвер явно не изменит их путем повторной регистрации блока.
Драйвер создает динамические имена экземпляров по мере создания экземпляров.
Драйвер указывает, что он будет создавать динамические имена экземпляров для блока при регистрации блока. После регистрации блока драйвер и WMI передают имена динамических экземпляров в виде строк в буфер в разделе Parameters.WMI.Buffer.
Драйвер должен создавать динамические имена экземпляров, только если количество экземпляров или имен экземпляров блока данных часто изменяется во время выполнения. Например, драйвер может использовать идентификаторы процессов или IP-адреса подключений TCP/IP в качестве имен экземпляров. Такие имена экземпляров должны быть динамическими; Если бы они были статическими, драйвер понесет значительные издержки, так как ему придется вызывать IoWMIRegistrationControl для обновления количества и имен экземпляров при каждом изменении.
В большинстве случаев статические имена экземпляров предпочтительнее имен динамических экземпляров по следующим причинам:
Статические имена экземпляров повышают производительность драйвера, так как драйверу не нужно возвращать строки имен экземпляров в ответ на запросы WMI, как это необходимо для имен динамических экземпляров.
WMI может обнаруживать конфликты статических имен экземпляров при регистрации и при необходимости автоматически изменять имена экземпляров, чтобы все имена экземпляров были уникальными для данного блока независимо от того, сколько драйверов регистрируют блок.
WMI не может обнаруживать конфликты имен экземпляров для динамических имен экземпляров, поэтому драйвер отвечает за создание уникальных имен с помощью IoWMIAllocateInstanceIds.
Драйвер может использовать подпрограммы библиотеки WMI для обработки IRP для блока, использующего статические имена экземпляров, при условии, что имена основаны на PDO драйвера или базовом имени, определяемом драйвером.
Драйвер не может использовать подпрограммы библиотеки WMI для обработки IRP для блока данных, использующего динамические имена экземпляров.
Драйвер указывает, использует ли блок статические или динамические имена экземпляров, а также тип статических имен экземпляров, задавая или очищая WMIREG_FLAG_XXX в структуре WMIREGGUID или WMIGUIDREGINFO , которую он передает в WMI при регистрации блока. Дополнительные сведения см. в разделе Регистрация в качестве поставщика данных WMI.