我正在用 C# 编写一个程序来在许多 Windows XP 工作站上执行硬件审核。
我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 - 而不是也使用 PCI 总线(内置于主板中)的板载设备。
我可以使用各种 WMI 类成功列出使用所有 PCI 总线的所有设备,但没有一个设备提供任何板载设备与通过插槽连接的设备的指示。
我并不挑剔信息的检索方式或来源(例如 Pinvoke、WMI、注册表等),只要它可靠即可。
谢谢你!
经过几个小时后,我想出了一个“相当”可靠的方法。
该逻辑从根本上假设开槽 PCI 设备总线 ID 是唯一的,并且与所有其他(板载)PCI 总线 ID 分开。到目前为止,我的测试表明情况确实如此;不管怎样这仍然是一个假设。
我的代码相当长,我确信它可以改进,所以我将用伪代码解释该过程:
-
确定有多少个插槽正在使用(并且仅当至少有一个插槽实际在使用时才继续):
“从以下位置选择插槽指定Win32_系统槽其中当前使用情况 = 4"
-
存储属于 PCI 总线的所有设备 ID:
“从以下位置选择设备IDWin32_总线其中总线类型 = 5"
-
捕获所有系统和逻辑设备关联:
“选择 * 从Win32_设备总线"
搜索所有系统和逻辑设备关联(先行属性)并在每次出现每个 deviceID 时进行计数。
现在,您可以通过查找出现次数与系统插槽中找到的设备数量相同的 DeviceID 来确定插槽 PCI 设备所在的 DeviceID。
对于每个包含 DeviceID(在先行属性中)的 Win32_DeviceBus 结果,依赖属性将引用另一个用于 Win32_PnPEntity 类的 DeviceID。
-
使用新捕获的 DeviceID 查询 Win32_PnPEntity,您现在拥有所有设备信息(或者更确切地说,Win32_PnPEntity 提供的所有信息)!
“选择 * 从Win32_PnPEntityWHERE 设备ID = '" + 设备ID + "'"
不幸的是,除了“使用中”查询返回的结果计数之外,我找不到任何方法来利用 Win32_SystemSlot 类返回的严格有限的信息(这会使生活变得太容易!)。
请注意,可能会遇到多个 PCI 总线,其设备数量与正在使用的插槽数相同。如果出现这种情况(我还没有遇到过),那么建议引发异常而不是继续assuming您正在查询正确的 PCI 总线。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)