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

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

ru
Offline Offline

« : 29-07-2009 21:28 » 

Добрый день!

Мой драйвер не является WDM. Я с помощью перебора PDO в каталоге \Devices нахожу нужный и присоединяюсь к его стеку. Мое устройство в этот момент в стеке одно, сверху нет никаких драйверов и фильтров. То есть чистое PDO созданное драйвером PCI. Присоединившись к нему я пытаюсь послать запрос IRP_MN_READ_CONFIG для получения конфигурации от драйвера PCI в структуру PCI_COMMON_INFO. запрос выполняется, но код приходит STATUS_INVALID_DEVICE_REQUEST и конфигурация разумеется не возвращается( Подскажите в чем может быть дело и может ли быть так что если PDO чистый, из него нельзя получить информацию о ресурсах подобным образом ? С помощью утилиты DeviceTree проверил - мое FDO, созданное драйвером стало на стек в нужное место... У себя в драйвере определил функцию для IRP_MJ_PNP и транслирую в ней все приходящие IRP пакеты вниз.
Заранее признателен!
Записан
Ochkarik
Модератор

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

« Ответ #1 : 30-07-2009 07:56 » 

получаете так как написано тут - http://msdn.microsoft.com/en-us/library/ms795302.aspx ?

проблема возможно в "Мой драйвер не является WDM"? вы не обрабатываете IRP_MJ_PNP?

та же проблема решалась в http://www.winvistatips.com/irp_mn_read_config-irp_mn_query_interface-all-return-0xc0000010-t182423.html
так что попробуйте читать конфигурацию через IRP_MN_QUERY_INTERFACE и GetBusData...
Записан

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

ru
Offline Offline

« Ответ #2 : 30-07-2009 18:56 » 

Благодарю вас! я посмотрел статью где решалась подобная проблема. Дело в том что я предусмотрел этот вариант заранее и все PNP запросы адресую нижележащему драйверу. И отладочное сообщение показывает что вызов проходит через мою процедуру. Делал даже такой трюк. Запускал DeviceTree и смотрел адрес PDO моего устройства в текущем сеансе работы системы. Брал и подставлял его числом в вызов IoCallDriver. Загружал драйвер и получал тот же статус возврата но уже не входя в собственную процедуру обработки PNP запросов. Попутно натолкнулся вот еще на какой важный момент. Может быть подскажете сразу в чем я не доработал? Я все делаю в процедуре DriverEntry (всю инициализацию), то есть нахожу PDO делаю attach и все стандартные процедуры по созданию fdo и symbolic link. Регистрирую заглушки для процедур IRP_MJ_CREATE ...CLOSE DriverUnload. Затем, когда драйвер загрузился и в DeviceTree убеждаюсь что он встал на вершину нужного стека, пробую открывать на него хендл из пользовательской программы. Получаю ошибку файл не найден (GetLastError возвращает значение 2). Если не делать AttachDeviceToDeviceStack открыть устройство из пользовательского приложения получается. Покопавшись с тем что делает AttachDeviceToDeviceStack выяснил что она меняет флаги в структуре DEV_OBJECT_EXTENSION->ExtendedFlags (прошу прощения если попутал имя этой структуры думаю что по сути понятно что происходит, просто я пишу драйвер на Masme32 с помощью KmdKit). Я принудительно после Attach....  стал возвращать флаги в прежнее значение и ссылка на устройство снова стала получаться в пользовательской программе. У меня возникло ощущение что AttachDEvice..... специально ставить такие флаги расчитывая видимо на дальнейшую инициализацию устройства с помощью посылки IRP_MJ_PNP кодов? Я правильно думаю ? И может быть в свете этого можно каким то пакетом посланным менеджеру PNP заставить его далее следовать по стандартной процедуре инициализации устройств для драйверов WDM?
Я даже бегло видел где то код который позволяте драйверу на лету попросить PNP менеджер дать заново ему конфигурацию. или я что то напутал?
Прошу прощения за длинный пост. Хотел выразить все )
Записан
Ochkarik
Модератор

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

« Ответ #3 : 30-07-2009 20:23 » 

насчет ссылки. я имел в виду использовать для получения конфигурации и не запрос IRP_MN_READ_CONFIG  а запрос IRP_MN_QUERY_INTERFACE. По крайней мере в обсуждении по ссылке, дело кончается тем, что получается именно второй способ получения конфигурации устройства через структуру BUS_INTERFACE_STANDARD.

по поводу ошибок открытия по ссылке и  IoAttachDeviceToDeviceStack - честно говоря не знаю, первый раз  с таким сталкиваюсь. код обработки IRP_MJ_CREATE стандартный?
ссылки только для  IoRegisterDeviceInterface до IRP_MJ_PNP автоматом вроде блокируются. для IoCreateSymbolicLink не должны вроде.
Записан

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

ru
Offline Offline

« Ответ #4 : 31-07-2009 10:51 » 

Понимаете, пнп запрос вообще не отправляется моему драйверу если этот флажок не сбросить после IoAttachDeviceToDeviceStack. код обработки IRP_MJ_PNP совершенно стандартный. Хуже того, попытался реализовать через интерфейс шины способ. В ответ пришел статус с00000bb (могу ошибиться в количестве нулей)) что означает INTERFACE NOT SUPPORTED. Я начинаю подозревать что при таком "ручном" способе подключения к стеку устройств нужно какую то дополнительную работу делать или с моим fdo или какие то флаги у подключенного мне PDO ставить или сбрасывать. Более того я почитал в ддк что вызов IoInvalidateDeviceConfig сообщает PNP менеджеру что устройство необходимо получить новую конфигурацию и он по идее должен отправить PNP запрос код не помню сейчас. Ничего подобного не происходит с моим драйвером. Если я инициализировал PNP обработчик то по идее PNP Manager может только в одном случае считать что моему драйверу ничего не нужно отправлять, если не стоят какие то флаги в описателе устройства. (разве что он еще и реестр все время смотрит и не видит там привязки загруженного драйвера моего к данному устройству)
Записан
SergeiS
Участник

ru
Offline Offline

« Ответ #5 : 31-07-2009 11:04 » 

вопрос весь в том, чем отличается PDO к которому подключен драйвер стандартным способом, то есть через загрузку с помощью установки и inf файла. И PDO, для которого в процессе загрузки не был найден драйвер, а потом к нему подсоединяюсь я с помощью поиска по каталогу и IoAttachDeviceToDeviceStack в DriverEntry? Флаг DO_INITIALIZE_DEVICE снимается после выхода из DriverEntry может быть его снять раньше перед попыткой прочитать конфигурацию ?
Записан
SergeiS
Участник

ru
Offline Offline

« Ответ #6 : 31-07-2009 18:45 » 

С запросом интерфейса шины разобрался. Привык в пользовательском режиме с COM DCOM работать)) Когда частенько память выделяется на стороне сервера) Интерфейс получается. Но вот вопрос с тем почему PNP менеджер в ответ на запрос IoInvalidateDeviceState не вызывает мою процедуру PNP в драйвере не дает покоя. Либо же я что то совсем не так понял.
Записан
Ochkarik
Модератор

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

« Ответ #7 : 01-08-2009 14:06 » 

попробуйте действительно DO_INITIALIZE_DEVICE снять после IoAttachDeviceToDeviceStack но до запроса... потому что обычно его снимают перед выходом из AddDevice, дабы информировать систему что можно слать IRP...
или второй вариант - попробуйте IoInvalidateDeviceState делать после выхода из DriverEntry. по какому нибудь IOCTL например...
Записан

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

ru
Offline Offline

« Ответ #8 : 01-08-2009 18:49 » new

Спасибо Вам! Увы, я уже пробовал давать эту команду в хендлере IRP_MJ_CREATE там по идее флаги должны быть уже нормальными( Но никакой реакции(( Так что буду искать дальше... По идее ведь если я обрабатываю IRP_MJ_PNP и нахожусь в стеке устройств в на вершине я должен получить назад IRP_MN_QUERY_DEVICE_RESOURCES? Видимо что то еще есть... )
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines