c# - 确定哪些(如果有的话)PCI 设备插入了主板 PCI(e) 插槽

标签 c# wmi pci pci-e pci-bus

我正在用 C# 编写一个程序来对许多 Windows XP 工作站执行硬件审核。

我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 - 而不是也使用 PCI 总线(内置于主板中)的板载设备。

我可以使用各种 WMI 类成功地列出使用所有 PCI 总线的所有设备,但没有一个提供任何关于板载设备与通过插槽连接的设备的指示。

只要信息可靠,我对信息的检索方式或来源(例如 Pinvoke、WMI、注册表等)并不挑剔。

谢谢!

最佳答案

几个小时后,我想出了一个“合理”可靠的方法。

此逻辑从根本上假设插槽 PCI 设备总线 ID 是唯一的,并且与所有其他(板载)PCI 总线 ID 分开。到目前为止,我的测试表明情况确实如此;不管怎样,这仍然是一个假设。

我的代码很长,我相信它可以改进,所以我将用伪代码解释这个过程:

  1. 确定有多少插槽正在使用(并且只有在至少有一个插槽实际正在使用时才继续):

    "SELECT SlotDesignation FROM Win32_SystemSlot WHERE CurrentUsage = 4"

  2. 存储属于 PCI 总线的所有设备 ID:

    "SELECT DeviceID FROM Win32_Bus where BusType = 5"

  3. 捕获所有系统和逻辑设备关联:

    "SELECT * FROM Win32_DeviceBus"

  4. 搜索所有系统和逻辑设备关联(前提属性)并计算每个 deviceID 出现的次数。

  5. 现在,您可以通过查找出现次数与在系统插槽中找到的设备数量相同的 DeviceID 来确定插槽中 PCI 设备所在的设备 ID。

  6. 对于每个包含 DeviceID(在先行属性中)的 Win32_DeviceBus 结果,从属属性将引用另一个要用于 Win32_PnPEntity 类的 DeviceID。

  7. 使用新捕获的 DeviceID 查询 Win32_PnPEntity,您现在拥有所有设备信息(或者更确切地说,Win32_PnPEntity 提供的所有信息)!

    "SELECT * FROM Win32_PnPEntity WHERE DeviceID = '" + deviceID + "'"

不幸的是,我找不到任何方法来利用 Win32_SystemSlot 类返回的极其有限的信息(这会让生活变得太轻松了!),除了“使用中”查询返回的结果计数。

请注意,可能会遇到多个 PCI 总线,其设备数量与正在使用的插槽数量相同。如果出现这种情况(我还没有遇到过),那么它会建议引发异常而不是继续并假设您正在查询正确的 PCI 总线。

关于c# - 确定哪些(如果有的话)PCI 设备插入了主板 PCI(e) 插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814492/

相关文章:

c# - 如何为 System.Core 创建外部别名?

c# - 如何确定 Console.Out 是否已重定向到文件?

c - 使用 IOCTL_STORAGE_QUERY_PROPERTY 获取序列号

linux - 从 SMBIOS 了解段组、总线、设备和功能编号

c# - 使用 Ninject 解决对先前绑定(bind)的依赖

c# - 基于 XAML 中的值显示图像

powershell - 在Powershell中拆分WMI对象

c# - WMI - 直接访问 Win32_OperatingSystem 的单例实例

c - PCI 输入/输出控制编程

linux - 如何将网络数据包发送到特定的 pci 地址?