winapi - 通过 Windows 的 API(用户模式)检索 PCI 坐标

标签 winapi windows-xp pci wdk pci-bus

有没有办法通过使用 Windows c/c++ API(例如 PnP 配置管理器 API)来获取设备的 PCI 坐标(总线/插槽/功能编号)?我已经知道如何在内核模式下做到这一点,我需要一个用户模式解决方案。我的目标系统是 Windows XP-32 位。

最佳答案

我最终找到了一个简单的解决方案(这只是深入 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 函数获得,以便动态分配,当然还必须添加错误检查。

关于winapi - 通过 Windows 的 API(用户模式)检索 PCI 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852454/

相关文章:

c++ - WinAPI。如何重绘没有背景的窗口?

c++ - GetProcessAffinityMask 给出了错误的值

winapi - Windows SDK 7.0 的 signtool 中的 signwizard 发生了什么?

wpf - 在 Windows XP 中是否有在 Viewport3D 中强制抗锯齿的 secret 技巧?

windows - Windows 中的 lshw 等价物是什么,它可以像 lshw 在 Linux 上那样给我一个硬件树结构?

c# - 从 Win32 或 C# API 获取窗口安静时间

c++ - 在 C++ for Windows 中如何检测拨号、宽带或无线 Internet 连接?

python - Unicode 无法正确打印到 cp850 (cp437),打牌套装

linux - resourceX linux pci内存mmap接口(interface)是什么字节序?

pci - PCI/PCIe BAR 大小是如何确定的?