Если выкинуть лирику, которая занимает половину вопроса, и попытаться перевести вопрос на русский язык( тут я мог ошибиться с переводом), то ответы будут такими
Снгачала повторю то что уже говорил на форуме вот в этой теме
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 ребутят после каждого билда?).
У них два компа- на одном пишут на другом проверяют.
Если тебе динамически надо подгружать- сделай драйвер заглушку, которая будет вызывать ф-ции настоящего драйвера, загруженного динамически, как минимум ф-ции ты отладишь- потом собереш все воедино.