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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос к отладке PnP WDM драйвера  (Прочитано 20784 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CrashMaker
Гость
« : 17-07-2003 18:04 » 

Вопрос к отладке PnP WDM драйвера.Что AddDevice не вызывается при динамической загрузке драйвера это извесно, а, => не создются FDO драйвера (эт для тех хто юзает DS, или PnP дрова, создающие FDO, и симв.связи в AddDevice) дрова вылетают с таким трейсом:

::DriverEntry()
::Leave DriverEntry success
::DriverUnload()              

Причем анлоад вызывается вроде бы после попытки запустить дрова. StartService возвращает SERVICE_DISABLED.

причем пох чем грузить шрайберским лоадером, тулзами нумеги, или самому через скам....


.....аааааааааааааааааааааа как говорится, нам нужен...клей Улыбаюсь.............MS и оултер прекрасно описывают рекурсивный процедуру зарузку дров, но вот я не нашел как быть с PnP дровами при отладке, а именно с динамической(и многократной) загрузкой/выгрузкой (Вот сволочи, они как тоже свои NT ребутят после каждого билда?).

так так....хм...о чем это я?....а...

Вопрос тривиален и банален -) Как быть?

Кто знает как получить доступ к обьекту шинного драйвера PCI (? или что там снизу?) (вояю дрова для PCI хардваре) PhysicalDeviceObject, чтоб самому вызывать AddDevice (и проатачить девайс к стеку устройства райт)


NTSTATUS AddDevice (PDRIVER_OBJECT  DriverObject,PDEVICE_OBJECT  PhysicalDeviceObject - че сюда?);

или, лучше здеся, во

PDEVICE_OBJECT IoAttachDeviceToDeviceStack(PDEVICE_OBJECT  SourceDevice,PDEVICE_OBJECT  TargetDevice - что сюда?);

Да, еще сказать надо, что девайс правильно работает и лоадится при перезагрузке. Все ключи в реестре есть...............


Удаляюсь, напевая
>>Breathe with me
>>Breathe the pressure
>>Come play my game I'll test ya
>>Psychosomatic addict insane
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 18-07-2003 06:10 » 

Если выкинуть лирику, которая занимает половину вопроса, и попытаться перевести вопрос на русский язык( тут я мог ошибиться с переводом), то ответы будут такими
 Снгачала повторю то что уже говорил на форуме вот в этой теме

https://forum.shelek.ru/index.php/topic,185.0.html

"В нижеследующем тексте под словом "шина" подразумевается любое устройство, к которому могут быть присоеденены другие устройства- например под это определение попадают шина PCI, USB, IEEE 1394 также под это определение попадают "виртуальные" шины(как пример- toaster в DDK, но обратите внимание- он не соответствует никакому реальному устройству, поэтому количество PDO ему сообщают из приложения, он их и создает).

Последовательность загрузки всех драйверов(начиная с Win2k) такая:
1) Загружают драйвер системной шины. Например PCI.
2) Вызывают DriverEntry а затем AddDevice для драйвера системной шины. В AddDevice создается FDO для драйвера системной шины. Потом посылают IRP_MN_START_DEVICE на созданный FDO.
3) Драйвер шины нумерует устройства на шине. Создает для них PDO-эти PDO управляются драйвером шины на которой они сидят.
4) Драйверу системной шины посылают IRP_MN_QUERY_DEVICE_RELATIONS, в ответ на который он возвращает массив созданных им PDO для устройств на шине.
5) На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на которые драйвер системной шины сообщает ID этих устройств.
6) Получив эти ID система пытается найти и загрузить драйвера устройств. Если устройство само является шиной, то для него повторяется вся последовательность действий.
7) Найдя драйвер для устройства, система отображает его в память вызывает его DriverEntry(если он еще не загружен), потом AddDevice, в этом AddDevice создается FDO для устройства. Если устройств управляемых этим драйвером несколько то AddDevice будет вызвана для каждого устройства. Также смотрят реестр на предмет наличия фильтров для девайса.
8 Потом засылает на созданные FDO запрос IRP_MN_START_DEVICE.

Если железяки в компе нет и эта железяка не найдена драйвером шины то драйвер не грузится. Если это какая-то кривая железяка, для которой драйвер грузится без драйвера шины( просто прописано грузить драйвер и все) то драйвер загрузится независимо от наличия или отсутствия- как он там будет разбираться с системой его личное дело. Например так поступают драйвера на NT4, но там и не WDM драйверы."


Цитата

чтоб самому вызывать AddDevice (и проатачить девайс к стеку устройства райт)


NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject,PDEVICE_OBJECT PhysicalDeviceObject - че сюда?);

или, лучше здеся, во

PDEVICE_OBJECT IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice,PDEVICE_OBJECT TargetDevice - что сюда?);



Соответственно вопрос к тебе- какой PDO ты собираешься создавать сам? Это сделал драйвер шины и PDO уже есть. Вызывать самому AddDevice наверно не надо, так как тебе придется самому создать DEVICE_OBJECT и проинициализировать структуру, число стеков правильно указать и т.д.

Цитата

как получить доступ к обьекту шинного драйвера PCI


 Получить доступ к DRIVER_OBJECT драйвера очень легко, но это тебе ничего не даст, для создания стека устройств нужен DEVICE_OBJECT, управляемый драйвером шины- то есть PDO , именно его и передают в AddDevice. А он будет создан при перечислении устройств на шине в независимости от наличия драйвера для этого устройства.
Есть ф-ция IoInvalidateDeviceRelations для обновления стеков устройств, только будь осторожен- не обнови стек устройств с диском на котором страничный файл и система, то есть для PCI не очень подходит.

Цитата

но вот я не нашел как быть с PnP дровами при отладке, а именно с динамической(и многократной) загрузкой/выгрузкой (Вот сволочи, они как тоже свои NT ребутят после каждого билда?).


У них два компа- на одном пишут на другом проверяют.
Если тебе динамически надо подгружать- сделай драйвер заглушку, которая будет вызывать ф-ции настоящего драйвера, загруженного динамически, как минимум ф-ции ты отладишь- потом собереш все воедино.
Записан
CrashMaker
Гость
« Ответ #2 : 18-07-2003 09:00 » 

Цитата

Если тебе динамически надо подгружать- сделай драйвер заглушку,которая будет вызывать ф-ции настоящего драйвера, загруженного динамически, как минимум ф-ции ты отладишь- потом собереш все воедино.



Сложновато. Это нада постараться что б еще и заглушку не пришлось перегружать (вместе с компом) -))). Я думаю проще подцепить мой FDO к PDO. Если, конечно дело бы ограничелось только этим...и не пришлось еще, к примеру, самому распределять ресурсы железа........


Цитата

Соответственно вопрос к тебе- какой PDO ты собираешься создавать сам? Это сделал драйвер шины и PDO уже есть. Вызывать самому AddDevice наверно не надо, так как тебе придется самому создать DEVICE_OBJECT и проинициализировать структуру, число стеков правильно указать и т.д.

 

Никакого PDO я не хочу создавать. Я хочу получить PPDO шины PCI, что бы присоединить мой FDO с стеку, как делается это при загрузке. Почему я вобще говорю о AddDevice. Мне она нужна только для быстрого перерелизивания проекта. Т.к. я хочу загружать дрова динамически, то, конечно, я буду вызывать AddDevice в DriverEntry. Здесь, как вы сказали - вопрос создания моего DEVICE_OBJECT (моего FDO), а точнее поля myFDO->myPDX->LowerDeviceObject (или как угодно) нижнего DEVICE_OBJECT моего DEVICE_EXTENSION. Мне просто нужно почитать конфигурацию IRP_MN_READ_CONFIG (возможно даже придется и не своиих), а не HalGetBusData, и я хочу делать это райт.

Давайте все таки отвлечемся ои загрузки. Мысль ребутиться каждый раз ужасна. Вот. Все что надо загруженно, дрова которые нужно что бы работали - работают, а мои дрова разбросанны по диску и просят что бы им передали PPDO нижнего уровня. -)))

Цитата

Это сделал драйвер шины и PDO уже есть.

   Как его получить?

Цитата

 А он будет создан при перечислении устройств
 на шине в независимости от наличия драйвера для этого устройства



   Нет ли механизма или функций для перечисления всех PDO?


Цитата

но обратите внимание- он не соответствует никакому реальному устройству, поэтому количество PDO ему сообщают из приложения, он их и создает).

 

Поясните пож эту мыслю...я что то ее не...



>> В лесу раздавался топор дровесека
>> топором дровосек отгонял гомосеков.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 18-07-2003 09:06 » 

Цитата

>> В лесу раздавался топор дровесека
>> топором дровосек отгонял гомосеков.

Извини - но если хочешь иметь подпись и примочки от форума - регистрируйся (сорри за офтоп)
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 18-07-2003 10:47 » 

Ладно- про динамическую загрузку я больше рассказывать не буду, я привел тебе ф-цию с помощью которой можно переинициализировать стеки многих шин(USB, IEEE) Попробуй применить эту ф-цию к PDO для твоего устройства, я такого не делал, поэтому гарантию дать не могу.
 Сделать заглушку- наиболее реально, она загрузится, подцепится к PDO, получит ресурсы, далее через IOCTL ты ею управляешь, загружаешь другой драйвер- и говоришь заглушке использовать ф-ции из этого драйвера. Таким образом ты сможешь отладить любую ф-цию кроме AddDevice, DriverEntry.
 
Цитата

Нет ли механизма или функций для перечисления всех PDO?

 Конечно есть, как минимум два
 1)IRP_MN_QUERY_DEVICE_RELATIONS на FDO драйвера шины. Но лучше этого не делай.
 2)Или самому пройтись по ссылке из DRIVER_OBJECT, указывающей на  DEVICE_OBJECT, а потом из этого DEVICE_OBJECT пройтись по всем девайсам.

 Потом на каждый PDO(у них флаг стоит DO_BUS_ENUMERATED_DEVICE)послать запрос IRP_MN_QUERY_ID, по полученному ID узнать свой девайс.

Цитата

Поясните пож эту мыслю...я что то ее не...


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

И зарегистрируйся наконец. И формулируй четче вопрос а то лирики много, и стихов типа стиха про дровосека больше не надо, это в форумы на других сайтах, у нас тут определенные формы приличия установлены.
Записан
Anonymous
Гость
« Ответ #5 : 18-07-2003 14:44 » 

Цитата

1)IRP_MN_QUERY_DEVICE_RELATIONS на FDO драйвера шины. Но лучше этого не делай.
2)Или самому пройтись по ссылке из DRIVER_OBJECT, указывающей на DEVICE_OBJECT, а потом из этого DEVICE_OBJECT пройтись по всем девайсам.

Потом на каждый PDO(у них флаг стоит DO_BUS_ENUMERATED_DEVICE)послать запрос IRP_MN_QUERY_ID, по полученному ID узнать свой девайс.

 

Это все хорошо, но пусть DevView поработает

Тут нарыл PDO

name "\\Driver\\PCI"
name "\\Driver\\PCI_HAL"

попробую их присобачить (хм...можно ли так вообще) - не получится - сделаю заглушку.


Тостер? -)  не люблю гренок-)

RE:
 Я зареген, могу пароль сказать.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 19-07-2003 18:47 » 

Цитата

Тут нарыл PDO

name "\\Driver\\PCI"
name "\\Driver\\PCI_HAL"

попробую их присобачить (хм...можно ли так вообще) - не получится - сделаю заглушку.

.


Стоп! Не делай этого! Это не PDO- это DRIVER_OBJECT, а PDO это DEVICE_OBJECT.

Мне сейчас некогда, но я тебе накидаю код при помощи которого ты сможешь узнать все PDO, созданные драйвером. Числа 20 я его кину сюда.
А чтобы понять разницу между DEVICE_OBJECT и DRIVER_OBJECT поставь себе утилиту DeviceTree вот отсюда

http://www.osronline.com/section.cfm?id=27

также эта утилита входит в последние DDK.
Запусти ее и посмотри сначала на список драйверов, разверни дерево и посмотри на PDO и FDO, созданные этим драйвером, из каждого PDO растет стек этого устройства. Потом нажми кнопку P и тебе построят дерево устройств, то есть связь между стеками устройств. Лучше всего утилиту запускать на Win2k, на XP она может уронить систему, ну это очень редко бывает, если упадет система, то вырпви из всех портов все девайсы- она обычно на XP падает, если комп очень наворочен, то есть много девайсов в нем.
Записан
maaaaaad
Гость
« Ответ #7 : 21-07-2003 23:50 » 

Спасибо за помощь.....но у меня че то все равно нихрена не выходит-).....как-то все должно быть ..... проще .... даже если приделать PDO. То как получать конфиг INT/DMA/PORTS?.....IRP_MN_START_DEVICE ведь только раз шлется......что ж теперь еще и самому ресурсы извлекать из железа.....
что то странно....такой вопрос насущный....а нигде толком то и не объясняется (OSR/Walter/DDK).....что то слабо верится что разработчики драйверов (например в MS) перегружают компы каждый раз так...

Кстати как посмотреть что выводиться DbgPrint'ом во время загрузки?
Не запустишь ведь DbgView до загрузки дров.....ixhere в айсе?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 28-07-2003 19:24 » 

По поводу первой части вопроса- еще раз скажу- у разработчиков минимум два компа и при отладке ядра не обязательно загружать все драйвера и графическую оболочку, достаточно минимум драйверов для работы и консольный режим. Такое загружается за 10 секунд на быстрой машинке.
Изучи как собирают ядро Linux и все поймешь.

Цитата

Кстати как посмотреть что выводиться DbgPrint'ом во время загрузки?


только подсоединив второй комп и запустив систему в режиме отладки.
Записан
V.L.
Гость
« Ответ #9 : 30-07-2003 03:15 » 

А чем DbgMon от OSR не устраивает?
Записан
maaaaaad
Гость
« Ответ #10 : 31-07-2003 01:27 » 

да, кстати, кто-нибудь нашел 10 отличий дебагмона от дебагвию?

как отслеживать DbgPring при к примеру IRP_MN_START_DEVICE DbgMon ом?
Записан
V.L.
Гость
« Ответ #11 : 31-07-2003 03:09 » 

В DDK есть:

DbgPrint
ULONG
  DbgPrint(
    PCHAR  Format,
    . . . .    [arguments]
    );
The DbgPrint routine causes a string to be printed in the debugger command window. Only kernel-mode drivers can call this routine.
........ много интересного...
See Also
KdPrint

Смотрел всё, что хотел.
Записан
.
Молодой специалист

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

« Ответ #12 : 20-08-2003 13:16 » 

:?: А что такое WDM-драйвер   Вот такой я вот
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 21-08-2003 04:59 » 

Цитата

А что такое WDM-драйвер


Windows Driver Model. Драйвер, отвечающий определенным требованиям- должен обрабатывать определенные запросы от системы, можно считать, что это драйвер с поддержкой PnP. Определение относится к драйверам для операционных систем, начиная с Win2k. Драйвера Win NT 4.0- не WDM, хотя принцип написания nonWDM и WDM драйверов одинаков, просто в WDM кода побольше из-за наличия дополнительных обработчиков.
Записан
.
Молодой специалист

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

« Ответ #14 : 21-08-2003 08:29 » new

Цитата: SlavaI
Цитата

А что такое WDM-драйвер


Windows Driver Model...
Спасибо за  просвящение. Если будет время - изучу вопрос и подключусь к дискуссии
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines