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

Posted

技术标签:

【中文标题】通过 Windows 的 API 检索 PCI 坐标(用户模式)【英文标题】:Retrieving PCI coordinates by Windows' API (user mode) 【发布时间】:2014-03-18 03:05:23 【问题描述】:

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

【问题讨论】:

我自己没有使用过它(因此是评论而不是答案),但您可以查看Function Discovery API。它允许您发现 PnP 设备等。啊等等,刚刚读到你正在寻找 WinXP... 功能发现只是 Vista+。 正确。此外,Vista 扩展了 SetupAPI 函数集。事实上,有一个非基于注册表的“SetupDiGetDeviceRegistryProperty”版本,可以直接从内核数据库中检索属性。但幸运的是,对于我而言,XP 的基于注册表的版本就足够了。 【参考方案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 函数来获得,以便动态分配,当然还必须添加错误检查。

【讨论】:

以上是关于通过 Windows 的 API 检索 PCI 坐标(用户模式)的主要内容,如果未能解决你的问题,请参考以下文章

通过百度API获取城市公交线路坐标点及站点信息

详细的PCI-E信息,Windows

C++ Windows API - 如何检索字体缩放百分比

带有 AngularJS 的 Windows Phone 8.1 上的 Phonegap 无法从我的 API 中检索 JSONP

推出虚拟卡的客户需要遵循哪些 PCI 准则?

调用百度地图API怎么获取坐标点的地理位置