2

我是驱动程序开发的新手。我开始为 Windows7 开发 USB 过滤器驱动程序,以便向用户隐藏一些 USB 设备类型。我将驱动程序连接到 USB 集线器上,并且可以拦截 IRP_MN_QUERY_DEVICE_RELATIONS。我有几个问题:

1 - On IRP_MN_QUERY_DEVICE_RELATIONSQueryDeviceRelations.Type是 BusRelations)我收到一个指向 .As 的指针DEVICE_RELATIONS struct。据我所知,结构中的 Objects 数组应该包含指向 PDO 的指针。但是,当我测试DO_BUS_ENUMERATED_DEVICE标志时(来自 msdn:操作系统在每个物理设备对象(PDO)中设置了这个标志。驱动程序不能修改这个标志。)有时我看到这个标志被打开,有时这个标志被关闭. 这是否意味着有时我会看到 PDO,有时会看到 FDO?或者这个问题的另一种解释?当我得到一些时PDEVICE_OBJECT,我怎么知道它是 PDO 还是 FDO?

2 - 当用户插入一些 USB 设备,并且过滤器驱动程序应该处理IRP_MN_QUERY_DEVICE_RELATIONS时,我如何确定对象数组中的哪个设备刚刚插入设备,哪个设备之前插入,哪个被标记为非活动?

提前致谢。费利克斯。

4

2 回答 2

1

有无证成员DeviceNodeDEVOBJ_EXTENSION因为它不是 WDM.h 和 NTDDK.h 的一部分,因此对 IO 或 PnP 管理器来说是私有的。在任何情况下,对于非 PDO 来说它都是 NULL,所以“不受支持的方式”是

if (DeviceObject->DeviceObjectExtension->DeviceNode) {
        // PDO!
    } else {
        // non-PDO!
    }

我宁愿不使用它。取而代之的是,您可以IoGetDeviceObjectPointer通过 devobj 列表或从PDRIVER_OBJECT. 为了确定 devobj 是否为 PDO,请发送 QDR/TargetDeviceRelation(完成后PDEVICE_OBJECT在列表中取消引用)。如果成功,QDR 中生成的 devobj 将成为您设备的 PDO。这是一个很好的解释。另一种选择是使用DO_BUS_ENUMERATED_DEVICE. 还要考虑到这个标志并不意味着初始化的 PDO。它在初始化之前和结构分配时设置。

于 2012-07-25T07:26:51.147 回答
0

我从未见过 FDO 在 BusRelations 更新中到达,但也许您还有另一个过滤器驱动程序在路上?无论如何,塔米尔很好地回答了这个问题:)

关于您的第二个问题,我知道的唯一方法是保留先前收到的 Objects 数组的副本并进行比较。不要试图依赖任何特定的设备顺序,因为它可以在版本之间更改。

于 2012-12-09T11:46:06.680 回答