我是驱动程序开发的新手。 我开始为Windows7开发usb过滤器驱动程序,以便向用户隐藏一些usb设备类型。我将驱动程序连接到USB集线器,可以拦截IRP_MN_QUERY_DEVICE_RELATIONS。我有几个问题:
1 - 在IRP_MN_QUERY_DEVICE_RELATIONS
上(QueryDeviceRelations.Type
是BusRelations)我收到一个指向DEVICE_RELATIONS struct
的指针。据我所知,struct中的Objects数组应保存指向PDO的指针。但是,当我测试DO_BUS_ENUMERATED_DEVICE
标志时(来自msdn:操作系统在每个物理设备对象(PDO)中设置此标志。驱动程序不能修改此标志。)有时我看到这个标志打开,有时标志关闭。这是否意味着有时我看到PDO,有时我看到FDO?还是对这个问题的另一种解释?当我得到一些PDEVICE_OBJECT
时,我怎么知道它是PDO还是FDO?
2 - 当用户插入某个USB设备,并且过滤器驱动程序应该处理IRP_MN_QUERY_DEVICE_RELATIONS
时,如何确定对象阵列中的哪个设备刚刚插入设备以及之前插入了哪个设备,并且哪一个被标记为无效?
提前致谢。 菲利克斯。
答案 0 :(得分:2)
DeviceNode
中有未记录的成员DEVOBJ_EXTENSION
,因为它不是WDM.h和NTDDK.h的一部分,因此对IO或PnP管理员来说是私有的。在任何情况下,对于非PDO都是NULL,因此“不支持的方式”是
if (DeviceObject->DeviceObjectExtension->DeviceNode) {
// PDO!
} else {
// non-PDO!
}
我不想使用它。您可以通过IoGetDeviceObjectPointer
或从PDRIVER_OBJECT
开始遍历devobj列表来查找实际的设备对象,而不是它。
为了确定devobj是否是PDO,在完成后发送QDR / TargetDeviceRelation(列表中的unref PDEVICE_OBJECT
)。如果成功,QDR中产生的devobj将成为您设备的PDO。 Here is对此有一个很好的解释。另一种选择是使用DO_BUS_ENUMERATED_DEVICE
。
还要考虑到这个标志并不意味着初始化 PDO。它在初始化之前和结构分配时设置。
答案 1 :(得分:0)
我从未见过FDO到达BusRelations更新,但是你可能还有另一个过滤器驱动程序?无论如何,Tamir回答这个问题很好:)
关于你的第二个问题,我知道的唯一方法是保留先前收到的Objects数组的副本并进行比较。不要试图依赖任何特定的设备排序,因为它可以在不同版本之间进行更改。