Привет всезнающий а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 драйвер требует железки чтобы взлететь? У меня как таковой железки нет, драйвер виртуальный... Как быть здесь?
Заранее благодарен,
Игорь
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 устройствам