Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 1301 - Не поддерживается получение списка USB-устройств   Make a simular bug
Summary: Не поддерживается получение списка USB-устройств
Status: CLOSED WONTFIX
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Общее (show other bugs)
Version: unspecified
Hardware: PC Linux
: P5 normal
Target Milestone: ---
Assignee: Александр Морозов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 775 2000
  Show dependency treegraph
 
In work:
Reported: 2008-03-06 13:23 MSK by Александр Морозов
Modified: 2016-08-23 14:46 MSK (History)
2 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments
Программа, выводящая список USB-устройств (2.50 KB, application/x-gzip)
2010-11-18 03:58 MSK, Александр Морозов
Details
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{f18a0e88-c30c-11d0-8815-00a0c906bed8} (5.16 KB, application/octet-stream)
2010-11-18 03:58 MSK, Александр Морозов
Details
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed} (11.00 KB, application/octet-stream)
2010-11-18 03:58 MSK, Александр Морозов
Details
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB (5.29 KB, application/octet-stream)
2010-11-18 03:58 MSK, Александр Морозов
Details
Патч частично решает проблему с выводом лишних имён файлов USB-устройств (1.58 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч к devinst.c (1.81 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч, решающий проблему падения программы (2.41 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч, решающий проблему создания ненужного ключа в реестре (2.57 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\ROOT_HUB20 (1.18 KB, text/plain)
2010-11-18 03:58 MSK, Александр Морозов
Details
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB (42.42 KB, text/plain)
2010-11-18 03:58 MSK, Александр Морозов
Details
Патч к devinst.c (включает предыдущие патчи) (4.40 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч к Makefile.in для линковки libusb (58 bytes, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч к dlls/setupapi/devinst.c (включает предыдущие патчи) (22.31 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Тест, выполняющийся на Windows, но не работающий на Wine (4.72 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч к devinst.c (2.97 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч, решающий проблему падения теста под Wine (1.21 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч из приложения 354, из которого удалены ненужные TRACE (2.56 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Тест, выполняющийся на Windows, но не работающий на Wine (4.67 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Улучшение патча из приложения 356 (3.65 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
Патч к devinst.c, обеспечивающий работу теста testRegisterAndGetDetail (5.00 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff
testRegisterAndGetDetail (4.45 KB, patch)
2010-11-18 03:58 MSK, Александр Морозов
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Александр Морозов 2008-03-06 13:23:08 MSK
Created attachment 286 [details]
Программа, выводящая список USB-устройств

В приложении тестовая программа, которая получает список USB-устройств под Windows XP.
Comment 1 Александр Морозов 2008-03-06 13:42:07 MSK
В Windows XP информация об USB-устройствах берётся из реестра. Используются как минимум следующие ветки реестра: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\GUID_класса, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\ROOT_HUB для хабов и по-видимому похожая ветка для USB-устройств.

Если добавить в реестр Wine из Windows XP ветки HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed}, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{f18a0e88-c30c-11d0-8815-00a0c906bed8}, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\ROOT_HUB, то при выполнении тестовой программы наблюдаются следующие проблемы:
1) программа падает;
2) выводятся лишние имена файлов устройств;
3) выводятся сообщения "SetupDiGetDeviceRegistryPropertyA: error 0x103" (0x103 - ошибка ERROR_NO_MORE_ITEMS);
4) в реестре появляется ключ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{f18a0e88-c30c-11d0-8815-00a0c906bed8}\#
Comment 2 Александр Морозов 2008-03-06 13:47:06 MSK
Created attachment 287 [details]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{f18a0e88-c30c-11d0-8815-00a0c906bed8}
Comment 3 Александр Морозов 2008-03-06 13:48:16 MSK
Created attachment 288 [details]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed}
Comment 4 Александр Морозов 2008-03-06 13:49:04 MSK
Created attachment 289 [details]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB
Comment 5 Александр Морозов 2008-03-06 14:02:22 MSK
Created attachment 290 [details]
Патч частично решает проблему с выводом лишних имён файлов USB-устройств

Патч к файлу devinst.c
Comment 6 Александр Морозов 2008-03-07 12:39:41 MSK
Created attachment 294 [details]
Патч к devinst.c

При работе программы происходит повреждение флага phantom в структуре DeviceInfo. В результате его значение меняется с 0 на произвольное, что приводит к изменению поведения при освобождении памяти и падению программы.

Данный патч полностью не решает проблему повреждения памяти, а только лишь обходит её, предотвращая падение программы.
Comment 7 Александр Морозов 2008-03-12 14:51:06 MSK
Created attachment 305 [details]
Патч, решающий проблему падения программы

Патч к оригинальному devinst.c
Comment 8 Александр Морозов 2008-03-12 18:21:33 MSK
Created attachment 306 [details]
Патч, решающий проблему создания ненужного ключа в реестре

Патч к оригинальному devinst.c (включает в себя предыдущие патчи)

Патч решает проблему создания в реестре ключа
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{f18a0e88-c30c-11d0-8815-00a0c906bed8}\#
Comment 9 Александр Морозов 2008-03-12 18:55:48 MSK
Created attachment 307 [details]
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\ROOT_HUB20

Ветка реестра, необходимая для отображения информации об одном из хабов
Comment 10 Александр Морозов 2008-03-14 16:56:03 MSK
Created attachment 317 [details]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
Comment 11 Александр Морозов 2008-03-14 20:32:10 MSK
Created attachment 318 [details]
Патч к devinst.c (включает предыдущие патчи)

Исправлены функции SetupDiGetDeviceRegistryPropertyA и SetupDiGetDeviceRegistryPropertyW. Теперь тестовая программа работает нормально за исключением того, что она выводит все устройства, записи о которых имеются в реестре, а не только те, которые в данный момент установлены в системе.
Comment 12 Александр Морозов 2008-03-17 16:48:30 MSK
Не совсем ясно, куда вставить код, отвечающий за создание в реестре списка USB-устройств, чтобы он выполнялся при запуске wine. Можно обновлять список USB-устройств при вызове SetupDiGetClassDevsExW или какой-нибудь другой функции, имеющей отношение к получению списка устройств.

В рассылке wine-devel есть патч к programs/explorer/hal.c для получения списка USB-устройств (тема письма "Adding devices to registry with the help of hal"), но он, судя по всему, в данном случае не поможет, так как при запуске тестовой программы explorer не запускается.
Comment 13 Александр Морозов 2008-03-18 16:25:43 MSK
При получении списка USB-устройств под Wine почему-то меняются значения параметров
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\ROOT_HUB\устройство\ClassGUID
Comment 14 Александр Морозов 2008-03-19 13:25:14 MSK
Проблема наблюдается только при использовании сторонней rpcrt4.dll
Comment 15 Александр Морозов 2008-03-19 20:18:20 MSK
Реализовано занесение в реестр информации об имеющихся USB-устройствах. Начата реализация функций, отвечающих за удаление записей, соответствующих уже отсутствующим в системе устройствам, информация о которых была записана ранее.

В Windows XP в ключе HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed} находятся подключи с именами вида ##?#USB#Vid_0529&Pid_0001#what#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, где what может выглядеть, например, так: 5&6d75465&0&2, TQ42Y8VA, 00071212BA8C83C417C3, 359672004624568_0. По-видимому, what используется для того, чтобы различать устройства с одинаковыми Vid и Pid.

В Wine вместо what я использовал строку, полученную конкатенацией dev->bus->dirname и dev->filename, где dev - структура usb_device из usb.h.
Comment 16 Александр Морозов 2008-03-20 11:55:39 MSK
Не совсем понятно, что делать с хабами, которые не являются корневыми. Сейчас они добавляются в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB. Как делается в Windows, я не знаю, так как у меня нет хаба, чтобы проверить.
Comment 17 Александр Морозов 2008-03-20 12:55:22 MSK
Теперь в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB добавляются только хабы, у которых vid и pid равны 0.
Comment 18 Александр Морозов 2008-03-20 14:27:13 MSK
Created attachment 332 [details]
Патч к Makefile.in для линковки libusb
Comment 19 Александр Морозов 2008-03-20 14:32:26 MSK
Created attachment 333 [details]
Патч к dlls/setupapi/devinst.c (включает предыдущие патчи)

Перечисление USB-устройств с использованием libusb
Comment 20 Александр Морозов 2008-03-24 20:21:56 MSK
Для включения патчей в основную ветвь разработки wine необходимо написать тесты, выявляющие проблемы, которые решают патчи. При написании патчей использовалась перечисляющая устройства программа и ветви реестра из WinXP. В тесте надо создать в реестре аналогичные структуры средствами setupapi.dll из wine. Пока это сделать не получилось и даже не ясно, возможно ли это в принципе.

Кроме того, оказалось, что многие тесты из setupapi_crosstest.exe (тесты к setupapi/devinst.c) работают под Wine, но не работают на Windows XP Pro SP2, установленной в VMware. А для принятия патчей в оригинальный wine надо написать тесты, работающие под Windows.
Comment 21 Александр Морозов 2008-03-25 12:06:26 MSK
> Кроме того, оказалось, что многие тесты из
> setupapi_crosstest.exe (тесты к setupapi/devinst.c) работают
> под Wine, но не работают на Windows XP Pro SP2,
> установленной в VMware.

Тесты работают только один раз. Они создают записи в реестре. Если их удалить, то тесты снова смогут работать.
Comment 22 Александр Морозов 2008-03-26 14:35:54 MSK
Created attachment 353 [details]
Тест, выполняющийся на Windows, но не работающий на Wine
Comment 23 Александр Морозов 2008-03-26 14:40:15 MSK
Created attachment 354 [details]
Патч к devinst.c

Тест testRegisterAndGetDetail не работает, так как в реестре Wine неправильно создаются записи об интерфейсах устройств. Патч решает эту проблему. В результате тест под Wine падает, выявляя ранее обнаруженную ошибку в SETUPDI_AddDeviceToSet.
Comment 24 Александр Морозов 2008-03-26 14:44:43 MSK
Created attachment 355 [details]
Патч, решающий проблему падения теста под Wine

Это часть ранее выложенного патча к devinst.c (devinst.patch_3)
Comment 25 Александр Морозов 2008-03-26 14:47:37 MSK
Тест testRegisterAndGetDetail выполняется под Wine с предыдущими 2-мя патчами, но создающиеся при этом записи в реестре отличаются от тех, что создаются в Windows. Основное отличие: под Wine создаются лишние записи об интерфейсах устройств.
Comment 26 Александр Морозов 2008-03-26 17:51:49 MSK
Created attachment 356 [details]
Патч из приложения 354, из которого удалены ненужные TRACE
Comment 27 Александр Морозов 2008-03-27 11:26:22 MSK
Created attachment 357 [details]
Тест, выполняющийся на Windows, но не
работающий на Wine

Удалён ненужный RegCloseKey(key)
Comment 28 Александр Морозов 2008-03-27 13:32:21 MSK
Created attachment 358 [details]
Улучшение патча из приложения 356

Создаваемые в реестре записи больше похожи на те, что создаются в Windows.
Comment 29 Александр Морозов 2008-03-27 17:21:16 MSK
Created attachment 359 [details]
Патч к devinst.c, обеспечивающий работу теста testRegisterAndGetDetail

Внесены исправления согласно указаниям, данным в wine-devel
Comment 30 Александр Морозов 2008-03-27 17:46:22 MSK
Created attachment 360 [details]
testRegisterAndGetDetail

Тест, исправленный согласно указаниям, данным в wine-devel
Comment 31 Александр Морозов 2008-03-28 20:53:14 MSK
Написаны тесты для SetupDiGetDeviceRegistryProperty и SetupDiSetDeviceRegistryProperty. Патч, исправляющий некоторые мешающие ошибки в этих функциях, был написан ранее.
Comment 32 Александр Морозов 2008-04-03 11:28:27 MSD
В патче, отвечающем за перечисление USB-устройств, есть ошибка, которая может привести к тому, что одно устройство будет добавлено в реестр несколько раз.

Правильно должно быть, например, так:
    for (bus = usb_busses; bus; bus = bus->next)
        if (bus->root_dev)
            print_dev(bus->root_dev);
        else
            for (dev = bus->devices; dev; dev = dev->next)
                print_dev(dev);
Comment 33 Александр Морозов 2010-10-22 00:52:38 MSD
Думаю, этот баг не актуален, так как это не нужно никому из клиентов