Получение координат PCI с помощью Windows API (пользовательский режим)

Есть ли способ получить координаты PCI (номера шины/слота/функции) устройств с помощью Windows c/c++ API (например, API PnP Configuration Manager)? Я уже знаю, как это сделать в режиме ядра, мне нужно решение для пользовательского режима. Моя целевая система - Windows XP-32 бит.


person Giuseppe Guerrini    schedule 18.02.2014    source источник
comment
Я не использовал его сам (поэтому комментарий, а не ответ), но вы можете взглянуть на Function Discovery API. Это позволяет вам обнаруживать устройства PnP и так далее. Ах, подождите, только что прочитал, что вы ищете WinXP... Функция Discovery есть только в Vista+.   -  person icabod    schedule 18.02.2014
comment
Верный. Также в Vista расширен набор функций SetupAPI. На самом деле существует версия SetupDiGetDeviceRegistryProperty, не основанная на реестре, которая извлекает свойства непосредственно из базы данных ядра. Но, к счастью, для моих целей достаточно версии XP, основанной на реестре.   -  person Giuseppe Guerrini    schedule 20.02.2014


Ответы (1)


В конце концов я нашел простое решение (это было просто вопросом копания в MSDN).

Этот минимальный код находит координаты PCI устройства с точки зрения шины/слота/функции:

DWORD bus, addr, slot, func;
HDEVINFO h; // Obtained by SetupDiGetClassDevs
SP_DEVINFO_DATA d; // Filled by SetupDiGetDeviceInterfaceDetail

SetupDiGetDeviceRegistryProperty(h,&d,SPDRP_BUSNUMBER,NULL,&bus,sizeof(bus),NULL);
SetupDiGetDeviceRegistryProperty(h,&d,SPDRP_ADDRESS,NULL,&addr,sizeof(addr),NULL);
slot = (addr >> 16) & 0xFFFF;
func = addr & 0xFFFF;

Примечание: для реального производства размер выходного буфера должен быть получен с помощью предыдущего вызова функции API, чтобы выделить его динамически, и, конечно же, должны быть добавлены проверки ошибок.

person Giuseppe Guerrini    schedule 20.02.2014