代码之家  ›  专栏  ›  技术社区  ›  Dan

驱动程序已枚举返回相同设备ID的两个子PDO

  •  1
  • Dan  · 技术社区  · 8 年前

    如果您有任何调试建议或解决方案,我们将不胜感激?

    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.
    ************************************************************
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Jeffrey Tippet    8 年前

    有几个版本的toaster总线示例——假设您从 this one ,然后注意,它将其子PDO列表保存在注册表中。我猜想您的驱动程序正在从注册表加载PDO,并尝试动态创建一些PDO。

    为了澄清一些命名问题:一个设备 设置类 是与其完全无关的GUID 硬件ID

    在考虑命名时,需要注意硬件ID的几点:

    • 一旦您分配了一个硬件标识,在未来的驱动程序更新中很难更改它,而不破坏已经安装了您的设备的客户。所以第一次就要做好。
    • 想想如果有人将你的设备的2个插头插入系统会发生什么。确保实例ID在所有端口上都是唯一的。您可以通过将PCI设备序列号(如果有)编码到实例ID中,或返回到PCI总线:设备:函数来实现这一点。
    • 例如,如果设备的高级版本支持校验和卸载,但常规版本不支持,那么您应该为这两个不同的设备使用两个不同的硬件ID。否则,很难编写一个同时包含两个关键字的INF。