2012-07-24 140 views
2

我是驱动程序开发的新手。 我开始为Windows7开发USB过滤器驱动程序,以便隐藏用户某些USB设备类型。我将我的驱动程序附加到USB集线器上,并可以拦截IRP_MN_QUERY_DEVICE_RELATIONS。我有几个问题:如何处理USB过滤器驱动程序中的IRP_MN_QUERY_DEVICE_RELATIONS

1 - 在IRP_MN_QUERY_DEVICE_RELATIONSQueryDeviceRelations.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

Felix,你可以发布一些你的源代码,这样我就可以知道你是如何实现你的过滤器驱动程序的?马蒂 – 2012-11-01 20:44:45

回答

2

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

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

我宁愿不使用它。代替它,您可以通过IoGetDeviceObjectPointer或从PDRIVER_OBJECT开始通过devobj列表来查找实际的设备对象。 为了确定devobj是否是PDO发送QDR/TargetDeviceRelation(完成时在列表中未完成)。如果成功,QDR中产生的devobj将成为您设备的PDO。 Here is对此有很好的解释。另一种选择是使用DO_BUS_ENUMERATED_DEVICE。 也考虑到这个标志并不意味着初始化 PDO。它在初始化之前和结构分配之前设置。

0

我从来没有见过FDO到达BusRelations更新,但也许你有另一个过滤器驱动程序?无论如何,坦米尔回答这个问题就好:)

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

相关问题