确定哪些(如果有)PCI设备插入主板PCI(e)插槽

时间:2013-05-29 12:54:55

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

我正在用C#编写一个程序,以便在许多Windows XP工作站上执行硬件审计。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

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

      

    “SELECT SlotDesignation FROM Win32_SystemSlot WHERE CurrentUsage = 4”

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

      

    “选择DeviceID FROM Win32_Bus,其中BusType = 5”

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

      

    “SELECT * FROM Win32_DeviceBus

  4. 搜索所有系统和逻辑设备关联(前提属性),并在每次发生每个deviceID时进行计数。

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

  6. 对于包含DeviceID的每个Win32_DeviceBus结果(在前提属性中),依赖属性将引用另一个用于Win32_PnPEntity类的DeviceID。

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

      

    “SELECT * FROM Win32_PnPEntity WHERE DeviceID ='”+ deviceID +“'”

  8. 不幸的是,我找不到任何方法来利用Win32_SystemSlot类返回的严重受限的信息(这会使生活太简单了!),而不是“使用中”查询返回的结果数。

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