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

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

Уважаемые Спецы, помогите!

Есть устройство на USB, драйвер к нему почти готов, осталось разобраться с поддержкой драйвером нескольких устройств.
Но проблема - при подключении второго устройства я не получаю вызова AddDevice Не понялНе понял??

Я для проверки запустил Win2000. Первое устройство загружается нормально. В Device manager проблем нет. А вот при подключении второго появляется диалог с надписью типа "Установка новых устройств закончена. Новые парамтеры вступят в силу только после перезагрузки системы", а в Device Manager отображается как "Другие устройства" (т.е. со значком вопроса) с кодом ошибки 14 и предупреждением, что устройство будет работать нормально только после перезагрузки системы

Есть какие-нибудь соображения или предположения на этот счет Не понял?


С уважением, Григорий
Записан
mad
Гость
« Ответ #1 : 16-08-2004 15:55 » 

Мда, сколько уже народа погорело с такими простыми вещами.....
посмотри на трейс вызова iocreatesymboliclink....немного подумай.....и поищи аналогичные ситуации.....И то, что не запускается эдддевайс - вылет с ошибкой из ентри. А то что девайс отображается в другом классе, опять же следствие вылета из энтри. Я например на CyUsb уже после adddevice при mn_start_device перешиваю вендора и девид (а до этого девайс показывается с другим именем), эти все извращения зависят от десигна девайса.
короче, смотри внимательно ентри.
Записан
Григорий
Гость
« Ответ #2 : 16-08-2004 18:04 » 

Если честно, то не понял про что ты пишешь. При чем тут ентри. Загрузка первого устройства проходит успешно и дальнейшая работа с драйвером то же. Во вторых, при подключении второго устройства ентри уже не вызывается. Должен вызываться только AddDevice. В третьих - перешивание идентификаторов - это пордоньте не выход, т.к. создается уже новое устройство.
В четвертых "немного подумай.....и поищи аналогичные ситуации...." - это вообще про что Не понялНе понял

>>А то что девайс отображается в другом классе, опять же следствие вылета из энтри

Это вовсе не следствие вылета из энтри, а может быть результатом неправильной работы внутри функции StartDevice и т.п. и т.д.
Записан
mad
Гость
« Ответ #3 : 17-08-2004 08:33 » 

Цитата

Во вторых, при подключении второго устройства ентри уже не вызывается


ты ошибаешься
Записан
Григорий
Гость
« Ответ #4 : 17-08-2004 08:39 » 

Во-первых, проверь. Во-вторых - читай DDK и Walter Oney.
Записан
mad
Гость
« Ответ #5 : 17-08-2004 08:39 » 

при обнаружении на шине устройства всегда загружается драйвер, ассоциированный и идентификаторами устройства вне зависимости от того представлен ли его образ в памяти. Я тебя опять отсылаю посмотреть ентри.
Записан
Григорий
Гость
« Ответ #6 : 17-08-2004 08:41 » 

Если не хочешь верить, возьми SoftICE и посмотри.
Записан
mad
Гость
« Ответ #7 : 17-08-2004 08:42 » 

=) хех. Спасибо! Обязательно почитаю!!
Записан
mad
Гость
« Ответ #8 : 17-08-2004 08:43 » 

Я делал поддержку клонов для USB и на PCI.
Записан
Григорий
Гость
« Ответ #9 : 17-08-2004 08:45 » 

Только не надо так томно вздыхать. Если у тебя все время вызывается DriverEntry это означает только то, что ты меняешь Vid&Pid устройства, а значит подключаешь к шине уже новое для системы устройство, а не второй экземпляр устройство.
Записан
mad
Гость
« Ответ #10 : 17-08-2004 08:45 » 

А то, что у тебя дествительно энтри не вызавается, это говорит о том, что ты (или кто то там) и инф неправильно накатал.
Записан
mad
Гость
« Ответ #11 : 17-08-2004 08:47 » 

Хорошо, дай реф на они или ддк, где говорится, что должно быть как ты говоришь =)
Записан
mad
Гость
« Ответ #12 : 17-08-2004 08:47 » 

Хех, все у меня работало, не веришь заходи на www.foreview.ru
Записан
mad
Гость
« Ответ #13 : 17-08-2004 08:48 » 

=)
Записан
Григорий
Гость
« Ответ #14 : 17-08-2004 08:54 » 

У тебя что DDK не установлен. Тогда установи. Смотри главу про PnP. Сайт красивый (ничего не могу сказать). Но исходников там нет, посмотреть что у тебя там работает Улыбаюсь. А они могу кинуть на мыло (но он здоровый гад, если с примерами). и еще раз - если driverentry вызывается повторно для второго подключаемого устройства (с одинаковыми id) то значит действительно что не то с inf или еще с чем. И напоследок - почему ты такой злой ??
Записан
mad
Гость
« Ответ #15 : 17-08-2004 08:56 » 

Итересно, как ядро должно узнать об адресе твоей adddevice, адрес которой ты прописываешь в driver_obj в ентри =))))
Записан
mad
Гость
« Ответ #16 : 17-08-2004 08:57 » 

Ладно, надоело, спасибо за советы, обязательно почитаю всю вышеизложенную литературу=)
Записан
Григорий
Гость
« Ответ #17 : 17-08-2004 09:00 » 

Так:

!!!! >>>> DriverObject->DriverExtension->AddDevice = AddDevice;

DriverObject->DriverUnload = DriverUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
.....

ты сам при вызове функции DriverEntry указываешь адрес функции AddDevice, которая как раз и вызывается PnP Manager после подключения к шине нового (такого же) устройства. Более подробно вся эта катавасия с PnP запросами как раз и описана в DDK и у Они.
Записан
Григорий
Гость
« Ответ #18 : 17-08-2004 09:04 » 

Короче. Мы ушли от темы моей проблемы.
Если мне все-таки последовать твоим советам и посмотреть DriverEntry, то он всегда возвращает STATUS_SUCCESS, т.к. в ней практически ничего не делается, кроме указания адресов функций и определения типа операционной системы.
Поэтому DriverEntry из рассмотрения выпадает. Есть еще идеи. Постоянно менять Id я не хочу. Это всего лишь временный выход. Я хочу все таки найти причину отсутсвия вызова AddDevice после подключения второго устройства
Записан
mad
Гость
« Ответ #19 : 17-08-2004 09:06 » 

хех, мне поигать хочется =)

ок, ты можешь представить как будет работать драйвер, например, с одной твоей структурой девайс екстеншн?=))) У тебя есть переменные которые надо где то хранить? Пусть например, ты хранишь их в екстеншн.....=)
Записан
mad
Гость
« Ответ #20 : 17-08-2004 09:07 » 

учитывая, что указатель на екстеншн для одного имиджа один (входит в структ девайс обж кажись)....
Записан
mad
Гость
« Ответ #21 : 17-08-2004 09:09 » 

давай код ентри, действительно, что расуждать то...
Записан
mad
Гость
« Ответ #22 : 17-08-2004 09:10 » 

и попробуй еще переставить девайсы. Если ситуация будет аналогичная (в точности). то еще давай и инф
Записан
Григорий
Гость
« Ответ #23 : 17-08-2004 09:11 » 

Не понял чего тебе хочется Улыбаюсь
Если ты имеешь в виду DriverExtension, то эта структура создается тобой в функции AddDevice и хранится в дальнейшем в fdo твоего устройства. Здесь ты хранишь свои пременные для каждого подключенного устройства Улыбаюсь
Записан
mad
Гость
« Ответ #24 : 17-08-2004 09:12 » 

И еще, у тебя может быть проблемы при MN_START_DEVICE. И возвразаться ошибка оттуда при крейте симлинки
Записан
Григорий
Гость
« Ответ #25 : 17-08-2004 09:19 » 

Со стартом все ок. Для второго устройства до него не доходит.
Девайсы уже переставлял (вначале думал что прошивки разные). Абсолютно без разницы кто будет первым, а кто вторым.
Записан
Григорий
Гость
« Ответ #26 : 17-08-2004 09:21 » 

Я не использую создание символической ссылки. Просто создаю имя, на конце его номер (начиная с 0).
Записан
Григорий
Гость
« Ответ #27 : 17-08-2004 09:23 » 

Код DriverEntry я уже скидывал. Там только еще вывод текстовых строк, что вызвана функци DriverEntry.
Записан
mad
Гость
« Ответ #28 : 17-08-2004 10:24 » 

Я не видел. Если у тебя действительно не вызавается ентри для драйвера и ты мне тут голову не морочишь - давай инф
Записан
Григорий
Гость
« Ответ #29 : 17-08-2004 10:38 » 

DriverEntry смотри выше и внимательнее.
Тебе голову никто не морочит. Вместо прериканий которые ты развел лучше бы подсказал, коль считаешь себы гуру.
Вот инф:

;; UsbCan.inf

;--------- Version Section ---------------------------------------------------

[Version]
Signature="$Chicago$"
Provider=%ProviderName%

; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.

Class=UsbAdapterDeviceClass
ClassGuid={D6252AE0-769E-11d8-9C69-0002B3031235}


;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

; These sections identify source disks and files for installation.  They are
; shown here as an example, but commented out.

[SourceDisksNames]
1 = "Kaskod Ltd (R) USB-CAN Communication Adapter Driver Package Installation Disc",,,
;1 = "Kaskod Ltd (R) USB-CAN Communication Adapter Driver Package Installation Disc",Disk1,,

[SourceDisksFiles]
usbcan.sys = 1
;usbcan.sys = 1,c:\windows\system32\drivers,

;--------- ClassInstall/ClassInstall32 Section -------------------------------

; Not necessary if using a standard class

; 9X Style
[ClassInstall]
Addreg=Class_AddReg

; NT Style
[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-20"

;--------- DestinationDirs Section -------------------------------------------

[DestinationDirs]
UsbCan_Files_Driver = 10,System32\Drivers

;--------- Manufacturer and Models Sections ----------------------------------

[Manufacturer]
%MfgName%=Mfg0

[Mfg0]
%DeviceDesc%=UsbCan_DDI, USB\VID_0700&PID_0001

;---------- DDInstall Sections -----------------------------------------------
; --------- Windows 9X -----------------

; Experimentation has shown that DDInstall root names greater than 19 characters
; cause problems in Windows 98

[UsbCan_DDI]
CopyFiles=UsbCan_Files_Driver
AddReg=UsbCan_9X_AddReg

[UsbCan_9X_AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,UsbCan.sys

; --------- Windows NT -----------------

[UsbCan_DDI.NT]
CopyFiles=UsbCan_Files_Driver

[UsbCan_DDI.NT.Services]
Addservice = UsbCan, 0x00000002, UsbCan_AddService

[UsbCan_AddService]
DisplayName    = %SvcDesc%
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
StartType      = 3                  ; SERVICE_DEMAND_START
ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
ServiceBinary  = %10%\System32\Drivers\UsbCan.sys
LoadOrderGroup = Base


; --------- Files (common) -------------

[UsbCan_Files_Driver]
UsbCan.sys

;--------- Strings Section ---------------------------------------------------

[Strings]
ProviderName="Kaskod Ltd (R)"
MfgName="Kaskod Ltd (R)"
DeviceDesc="Kaskod Ltd (R) USB-CAN communication adapter"
DeviceClassName="USB Peripheral Adapters"
SvcDesc="USB-CAN (USB,WDM)"
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines