如何在USB过滤器驱动程序中处理IRP_MN_QUERY_DEVICE_RELATIONS



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

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

2-当用户插入某个usb设备时,过滤器驱动程序应该处理IRP_MN_QUERY_DEVICE_RELATIONS,我如何确定Object数组中的哪个设备刚刚插入设备,哪个设备以前插入过,哪个设备标记为非活动?

提前谢谢。费利克斯。

DEVOBJ_EXTENSION中有未记录的成员DeviceNode,因为它不是WDM.h和NTDDK.h的一部分,因此对IO或PnP管理器是私有的。在任何情况下,对于非PDO,它都是NULL,因此"不受支持的方式"是

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

我不想使用它。相反,你可以通过IoGetDeviceObjectPointer或从PDRIVER_OBJECT开始浏览devobj列表来找到实际的设备对象。为了确定devobj是否是PDO,发送QDR/TargetDeviceRelation(完成后在列表中取消引用PDEVICE_OBJECT)。如果成功,那么QDR中产生的devobj将是您的设备的PDO。这里有一个很好的解释。另一种选择是使用DO_BUS_ENUMERATED_DEVICE。还要注意,此标志并不意味着已初始化PDO。它在初始化之前和结构分配时设置。

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

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

最新更新