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

C# 确定哪些(如果有的话)PCI设备插入主板PCI(e)插槽,c#,wmi,pci,pci-e,pci-bus,C#,Wmi,Pci,Pci E,Pci Bus,我正在用C编写一个程序,在许多Windows XP工作站上执行硬件审计 我需要确定哪些PCI设备是通过主板插槽连接的实际卡,而不是使用主板内置PCI总线的板载设备 我可以成功列出使用各种WMI类的所有PCI总线的所有设备,但没有任何设备提供板载设备与通过插槽连接的设备的任何指示 只要信息可靠,我对信息的检索方式或来源(如Pinvoke、WMI、注册表等)并不挑剔 谢谢大家! 几个小时后,我想出了一个“合理”可靠的方法 该逻辑基本上假定时隙PCI设备总线ID是唯一的,并且与所有其他板载PCI总线I

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

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

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

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


谢谢大家!

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

该逻辑基本上假定时隙PCI设备总线ID是唯一的,并且与所有其他板载PCI总线ID分离。到目前为止,我的测试已经证明了这一点;无论如何,这仍然是一个假设

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

确定有多少插槽正在使用,并且仅当至少有一个插槽正在实际使用时才继续:

从CurrentUsage=4的位置选择SlotDesignation

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

从BusType=5的位置选择DeviceID

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

从中选择*

搜索所有系统和逻辑设备关联先行属性,并在每次出现每个deviceID时计数

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

对于antecedent属性中包含DeviceID的每个Win32_DeviceBus结果,dependent属性将引用另一个用于Win32_pPentity类的DeviceID

使用新捕获的设备ID查询Win32_pPentity,您现在拥有了所有设备信息,或者更确切地说,是Win32_pPentity提供的所有信息

从其中选择*设备ID='+DeviceID+'

不幸的是,我找不到任何方法来利用Win32_SystemSlot类返回的极其有限的信息,这会让生活变得太简单!“正在使用”查询返回的结果计数除外


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

是否检查了Win32_OnBoardDevice类?是,但它任意返回视频和网络设备,我知道这些设备是内置在主板上的,而不是连接的硬件。如果Win32_OnBoardDevice返回一致的信息,例如返回所有内置或非内置设备,则可能会有所帮助,但情况似乎并非如此。我想知道这种方法在具有嵌套PCI总线(即PCI到PCI桥接器)的系统中的效果如何。