Запись PCI таблицу и PDO
От: elgrru  
Дата: 23.05.07 13:27
Оценка:
Привет всезнающий аll !!!

Подскажите пожалуйста выход из ситуации. У меня небольшой миссандерстэндинг при переходе с обычного NT драйвера на ВДМ
Предистория. Необходимо заменять некоторые регистры в конфигурационной таблице PCI устройств. Аналогично программе WPCREDIT.
Был написан очень простой драйверок, юзерпрога его динамически грузила в системе и через IOCtrl обнавляла нужные регистры в пси хидере. Драйвер юзал HalGetBusDataByOffset/HalSetBusDataByOffset для энумерации и собственно записи. Все бы было хорошо, но потребовалось изменить регистры PCI-To-PCI Bridge, и не работает! WPCREDIT работает!
Информацию поднял:
A call to HalSetBusData or HalSetBusDataByOffset fails if the target device is a PCI bridge device and the data to be written is within the PCI common configuration space header. This behavior is by-design, because these functions are used only for programming nonbridge devices.

Далее нашел ссылку: How to get the configuration and location information of a PCI device. Сообственно показано как реализовать запрос с помощью функции ReadWriteConfigSpace. Но это все внутри драйвера конкретного PCI устройства. А мне нужно сделать энумерацию, дать список PCI устройств ее верхней софтине, заменить регистр в произвольном PCI устройстве по требованию софтины.
И тут не могу свести 2 плюс 2. Как я должен организовать синхронный вызов к любому PCI устройству внутри драйвера не знаю их PDO,
Т.е. как получить PDEVICE_OBJECT targetObject из примера для всех PCI устройств чтобы отработать по нему?
И еще PnP драйвер требует железки чтобы взлететь? У меня как таковой железки нет, драйвер виртуальный... Как быть здесь?

Заранее благодарен,
Игорь
Re: Запись PCI таблицу и PDO
От: DronG Украина  
Дата: 23.05.07 13:59
Оценка:
1. Для создания PNP устройства не нужна железяка. Для примера можно посмотреть RamDisk идущий в составе DDK (могу прислать)
2. Для получения DEVICE_OBJECT можно сделать следующее: ZwOpenDirectoryObject\ZwQueryDirectoryObject перечислить все элементы в каталоге \\Driver, ObReferenceObjectByName — получаем указатель на DRIVER_OBJECT, pDrv->DeviceObject/pDrv->NextDevice. Таким обазом мы получим указатели на все DEVICE_OBJECT среди которых так же не PNP.

Так же можно использзовать IoGetDeviceProperty (DevicePropertyPhysicalDeviceObjectName) — получать имя PDO и запрашивать ObReferenceObjectByName. В этом случае запрос идет только к PNP устройствам
Re[2]: Запись PCI таблицу и PDO
От: elgrru  
Дата: 23.05.07 14:53
Оценка:
Здравствуйте, DronG, Вы писали:

DG>1. Для создания PNP устройства не нужна железяка. Для примера можно посмотреть RamDisk идущий в составе DDK (могу прислать)

DG>2. Для получения DEVICE_OBJECT можно сделать следующее: ZwOpenDirectoryObject\ZwQueryDirectoryObject перечислить все элементы в каталоге \\Driver, ObReferenceObjectByName — получаем указатель на DRIVER_OBJECT, pDrv->DeviceObject/pDrv->NextDevice. Таким обазом мы получим указатели на все DEVICE_OBJECT среди которых так же не PNP.

DG>Так же можно использзовать IoGetDeviceProperty (DevicePropertyPhysicalDeviceObjectName) — получать имя PDO и запрашивать ObReferenceObjectByName. В этом случае запрос идет только к PNP устройствам


Спасибо огромное за отклик!

Думаю втрой вариант меня устроит!
Если примера мRamDisk в составе DDK я его найду.
Извените за назойливость, а можно получить PDO по известному VendorID и DeviceID? Это я к тому, что нужно будет помянять регистры на конкретном PCI устройстве, как связать VendorID и DeviceID с PDO — только энумерацией (запрашивая данные хидера и сравнивая)?

Спасибо
Игорь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.