Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Device Instance ID  (Прочитано 18510 раз)
0 Пользователей и 1 Гость смотрят эту тему.
WWX
Участник

ru
Offline Offline

« Ответ #30 : 17-12-2019 11:33 » 

Спасибо.
Буду пробовать...
Записан
WWX
Участник

ru
Offline Offline

« Ответ #31 : 19-12-2019 11:45 » 

Получилось всё в точности, как и было описано выше - возвращается только последняя часть Instance ID (или это и есть сам Instance ID, а перед ним что-то вставляется?).

Получить полный можно с помощью IoGetDevicePropertyData (с параметром PropertyKey=&DEVPKEY_Device_InstanceId).
Но этот способ не работает на Windows 7 (работает на Windows 10).

В связи с этим вопрос:
Можно ли считать этот "обрубленный" Instance ID уникальным среди всех одинаковых плат (с одинаковыми VEN ID и DEV ID)?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 20-12-2019 23:30 » 

не совсем понял вам надо в API получить или все таки в ядре?

вот тут человек втыкал две клавиатуры, и вроде как пишет что в одном порту их винда ID не различала, а в разных - давала разный ID.
Цитата
Additional tests
I tested the aforementioned Netgear USB WiFi card, and it has the same Device Instance ID, even when plugged in different ports, and even when plugged in different machines.
I tested a generic USB key which provides a USB Serial number, and its behavior was the same as the USB WiFi card.
In these cases, the Device Instance ID will be something like:

USB\VID_1221&PID_3234\00004700356
I tested two identical generic USB keyboards, and I plugged them (one at a time) in the same USB hub port. The Device Instance ID remained the same (and additionally, Windows didn't show the "Installing hardware" popup when I plugged in the second keyboard. The Device Instance ID was:

USB\VID_1C4F&PID_0002\7&15cdfaa&0&3
Then, I plugged one of the keyboards on a different USB port, and the Device Instance ID changed to:

USB\VID_1C4F&PID_0002\5&2eab04ab&0&1

и я уже подзабывать начал... мысль пришла - а этот ID не сам драйвер устройства формирует в ответ на IRP_MN_QUERY_ID?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Участник

ru
Offline Offline

« Ответ #33 : 23-12-2019 09:21 » 

Цитата
не совсем понял вам надо в API получить или все таки в ядре?

Всё это нужно для однозначной идентификации среди одинаковых PCIe плат (т. е. получить нужно и там и там).

Проблема в том, что в user mode возвращается длинная строка, что-то вроде:

PCI\VEN_xxxx&DEV_xxxx&SUBSYS_0000xxxx&REV_00\4&25438C51&0&0008

, т. е. в точности то же, что и в диспетчере устройств.

В драйвере в ответ на запрос IRP_MN_QUERY_ID с:
Код:
stack->Parameters.QueryId.IdType = BusQueryInstanceID;
мне возвращается только хвост: "0008".
А хотелось бы целиком всю строку: "4&25438C51&0&0008", которая судя по документации Microsoft однозначно идентифицирует одну плату (из всех одинаковых).
Или хотя бы уверенность, что возвращаемого хвоста достаточно для такой идентификации.

Из документаций Microsoft
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/device-instance-ids
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/irp-mn-query-id
и т. п. не совсем понятно, что в моём примере является "instance ID".

Цитата
вот тут человек втыкал две клавиатуры, и вроде как пишет что в одном порту их винда ID не различала, а в разных - давала разный ID.

Целиком вся эта строка (с VEN ID и DEV ID), насколько я понял, называется "Device Instance ID" и однозначно определяет устройство в системе.
Первая её половина называется "device-ID".
Вторая (после последнего слеша) называется то ли "instance ID" то ли хрен знает как, нося при этом гордый статус "opaque", т. е. её нельзя пытаться парсить.

Цитата
а этот ID не сам драйвер устройства формирует в ответ на IRP_MN_QUERY_ID?

Судя по второй ссылке этот запрос должен обрабатывать драйвер шины.

----------

Замечено, что подобные строки ("4&25438C51&0&0008") располагаются в реестре в разделе оборудования (экземпляра)
(HKLM\SYSTEM\CurrentControlSet\Enum)
, и похоже что являются названиями подразделов конкретных устройств.

Но, драйверу чуть ли не запрещено рыскать по реестру в поисках подобных имён.

----------

Моя же конкретная задача (раз уж речь пошла про реестр), возможно, решается проще без всяких ID.
Драйвер сам формирует уникальный номер платы и записывает его в разделе оборудования (экземпляра) реестра.
Приложение при перечислении устройств (функционал SetupApi) будет читать этот раздел и сравнивать считанный номер с нужным.

Возможно придётся так делать, если с этими ID всё так запутано...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 23-12-2019 22:21 » 

а вот это не поможет? https://ios.developreference.com/article/13847581/How+to+get+Device+Instance+Path+from+Windows+kernel+driver%3f
Цитата
Device Instance id is autoincrement sequence.
You can find HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum in registry;
Rules:NextPareneID.XXXXXXXX.N
XXXXXX use UUID Calculation crc32 values(test ok)
N is 1~9
Device Instance id format is N&PareneID&random's number&index
enter image description here
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Участник

ru
Offline Offline

« Ответ #35 : 26-12-2019 07:20 » 

IoGetDevicePropertyData у меня отработал только на Windows 10, а нужно было, чтоб работало и на Windows 7.
Последний способ (если это способ) мне не совсем понятен, больше похоже на описание, из чего эта строка состоит. Но всё равно на это описание нельзя полагаться, т. к. в будущих версиях всё может поменяться.
Полностью согласен с:
Цитата
MSDN doc seems really vague on this!

Свою же подзадачу я решил так, как описал в своём предыдущем сообщении.

В любом случае: спасибо за помощь.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #36 : 26-12-2019 08:36 » new

да, похоже на формат строки, но я не проверял насколько он верен.
удачи)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines