2

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

我们正在开发一个微型过滤器驱动程序,并且我们正在尝试根据某些条件阻止安装 USB 设备。

微型过滤器监视IRP_MJ_VOLUME_MOUNT并且每当插入 USB 驱动器时pre-callback,它会询问用户空间是否允许使用 FltSendMessage 挂载驱动器。在用户区, afterFltGetMessage和 before FltReplyMessage,检查某些条件并将相应的值回复给驱动程序。

这一切都很好,但我们遇到了两个问题,或者说不便。

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

  2. 当U盘不允许挂载卷时,继续尝试挂载卷几次!
    我们使用的解决方法是维护最近插入设备的列表,如果 GUID 存在于列表中,则拒绝它们。我在某处读到可以使用删除挂载点DeleteVolumeMountPoint,如果我们将来需要允许该设备,那么我们需要删除一个注册密钥,其中包含设备的唯一 ID,可以将其发送MOUNTDEV_UNIQUE_ID到设备。我们试图实现这一点,但未能正确获取唯一 ID。[我们无法为MOUNTDEV_UNIQUE_ID结构分配足够的内存。试过newmalloc(enough size)但后来sizeof(varUniqueID)只返回了 4,然后打电话DeviceIoControl这导致“更多数据可用”错误。我们在用户区做。这应该在内核中完成吗?]

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

干杯!

4

1 回答 1

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

干杯,
加布里埃尔

于 2018-01-28T12:23:25.347 回答