在过滤体积安装时,问题是微型过滤器

时间:2013-01-28 07:11:32

标签: driver minifilter

[操作系统:VirtualBox上的WinXP,HostOS:win7]

我们正在开发一种迷你滤波器驱动程序,我们正试图根据某些条件阻止USB设备的安装。

迷你过滤器监视IRP_MJ_VOLUME_MOUNT并且每当插入USB驱动器时,在pre-callback中,它会询问用户是否允许使用FltSendMessage安装驱动器。 在用户空间中,在FltGetMessage之后和FltReplyMessage之前,会检查某些条件并将相应的值回复给驱动程序。

这一切都运转正常,但我们遇到了两个问题,或者说不方便。

  1. 条件检查大约需要4-5秒[数据通过网络发送和接收]。在此期间,Windows资源管理器只会挂起。而且,只要调用FltReplyMessage,就会执行导航等操作。如果我点击开始菜单中的任何位置,则在调用FltReplyMessage之前不会发生任何事情。其他应用程序,如VLC正常运行[即,可以访问磁盘]。

  2. 当不允许USB驱动器安装音量时,它会继续尝试多次安装音量!
    我们使用的解决方法是维护最近插入的设备列表,如果列表中存在GUID,则拒绝它们。 我在某处读到可以使用DeleteVolumeMountPoint删除挂载点,如果我们将来需要允许该设备,那么我们需要删除一个reg键,其中包含可以获取的设备的唯一ID发送{{1}到设备。我们尝试实现此目的,但未能成功获取唯一ID。 [我们无法为MOUNTDEV_UNIQUE_ID结构分配足够的内存。尝试MOUNTDEV_UNIQUE_IDnew,然后malloc(enough size)仅返回4,并且调用sizeof(varUniqueID)导致"更多数据可用"错误。我们在用户地区做。应该在内核中完成吗?]

  3. 呼!很长的帖子!
    我们非常感谢能得到的任何帮助!

    干杯!

1 个答案:

答案 0 :(得分:0)

  1. 就您的第一个问题而言,除非有一种方法可以根据卷唯一ID缓存驱动程序中所需的数据,否则您无能为力。 这样每次安装只会有 Flt 调用。 我不确定您的要求,但如果做出决定所需的数据是通过网络进行的,那么您将受到这种或那种方式的延迟。对于驱动程序来说,能够缓存自己的数据,而不必在首次尝试同一设备后调用用户模式,这一点至关重要。
  2. 第二点肯定你可以在用户模式或内核模式下完成。你能提供一个代码片段来检查是否有任何错误吗?
  3. 干杯,
    加布里埃尔