1

我有一个 kmdf 总线驱动程序 PCI\VEN_XXXX&DEV_XXXX,它创建两个具有序列号的静态枚举 PDO:217 和 218;每个以太网端口一个。PDO 硬件 ID 是 ROOT\MY_NIC_PORT,因此我可以在它们上安装 NDIS Miniport 驱动程序。

总线驱动通过SDV和Verifier;但是,在重新启动时会枚举另外两个 PDO。在下一次重新启动时,我得到一个重复的 pdo 崩溃。

烤面包机示例使用设备类 guid 作为硬件 ID 的一部分。当我尝试我的 NIC 端口不再出现在设备管理器中时。

任何调试建议或解决想法将不胜感激?

pnpCaps.LockSupported = WdfFalse;
pnpCaps.EjectSupported = WdfTrue;
pnpCaps.Removable = WdfTrue;
pnpCaps.DockDevice = WdfFalse;
pnpCaps.UniqueID = WdfTrue;
pnpCaps.SilentInstall = WdfTrue;
pnpCaps.SurpriseRemovalOK = WdfTrue;
pnpCaps.HardwareDisabled = WdfFalse;
pnpCaps.NoDisplayInUI = WdfFalse;
pnpCaps.Address = SerialNo;
pnpCaps.UINumber = SerialNo;

************************************************************
Driver Verifier detected violation:

A driver has enumerated two child PDO's that returned identical Device
ID's.

CulpritAddress = FFFFF8025ED309C4, DeviceObject1 = FFFFE3882FB2F300, 
DeviceObject2 = FFFFE3882EBF88D0.
************************************************************
4

1 回答 1

1

烤面包机总线示例有几个版本——假设您从这个开始,请注意它在注册表中保存了它的子 PDO 列表。我的猜测是您的驱动程序既要从注册表加载 PDO,又要尝试动态创建一些 PDO。

在您的驱动程序版本的 Bus_PlugInDevice 上设置断点,并查看它被调用的频率。确保它永远不会使用相同的实例 ID 被调用 2x。

澄清一点命名问题:设备设置类是一个与其硬件 ID完全无关的 GUID 。对于想要与操作系统的网络堆栈互操作的 NIC,您必须使用 NET 设置类 {4d36e972-e325-11ce-bfc1-08002be10318}。您可以将任何您想要的内容放入您的硬件 ID。我真的不鼓励您将“ROOT\”放在那里,因为这可能会与根枚举设备(您的设备不是)混淆。相反,您可以使用“yourcompany_yourdevice\port1”作为硬件 ID。

在考虑命名时,有一些关于硬件 ID 的注意事项:

  • 一旦您分配了 HWID,就很难在未来的驱动程序更新中更改它,而不会破坏已经安装您设备的客户。所以第一时间就做好。
  • 分配实例 ID 后,请勿在设备的生命周期内更改或重复使用它。否则,您将导致此错误检查,或导致 IP 地址反弹/重置。操作系统最终使用实例 ID 来确定将 IP 地址绑定到哪个 NIC 端口。
  • 想想如果有人将您的 2 个设备插入系统会发生什么。确保您的实例 ID 在所有端口中都是唯一的。您可以通过将 PCI 设备序列号(如果有)编码到 Instance ID 中或通过回退到 PCI bus:device:function 来做到这一点。
  • 不要将不同类型的硬件放在同一个硬件 ID 下。例如,如果您的设备的豪华版支持校验和卸载,但普通版不支持 - 您应该为这两个不同的设备使用 2 个不同的硬件 ID。否则,很难编写一个同时包含两个关键字的 INF。
于 2017-08-23T20:09:59.333 回答