[操作系统:VirtualBox 上的 WinXP,HostOS:win7]
我们正在开发一个微型过滤器驱动程序,并且我们正在尝试根据某些条件阻止安装 USB 设备。
微型过滤器监视IRP_MJ_VOLUME_MOUNT
并且每当插入 USB 驱动器时pre-callback
,它会询问用户空间是否允许使用 FltSendMessage 挂载驱动器。在用户区, afterFltGetMessage
和 before FltReplyMessage
,检查某些条件并将相应的值回复给驱动程序。
这一切都很好,但我们遇到了两个问题,或者说不便。
条件检查大约需要 4-5 秒 [通过网络发送和接收数据]。在此期间,Windows 资源管理器只是挂起。并且无论什么动作,例如导航,一旦
FltReplyMessage
被调用就会被执行。如果我单击开始菜单等任何位置,FltReplyMessage
则在调用之前不会发生任何事情。其他应用程序如 VLC 功能正常[即磁盘可以访问]。当U盘不允许挂载卷时,继续尝试挂载卷几次!
我们使用的解决方法是维护最近插入设备的列表,如果 GUID 存在于列表中,则拒绝它们。我在某处读到可以使用删除挂载点DeleteVolumeMountPoint
,如果我们将来需要允许该设备,那么我们需要删除一个注册密钥,其中包含设备的唯一 ID,可以将其发送MOUNTDEV_UNIQUE_ID
到设备。我们试图实现这一点,但未能正确获取唯一 ID。[我们无法为MOUNTDEV_UNIQUE_ID
结构分配足够的内存。试过new
,malloc(enough size)
但后来sizeof(varUniqueID)
只返回了 4,然后打电话DeviceIoControl
这导致“更多数据可用”错误。我们在用户区做。这应该在内核中完成吗?]
哇!很长的帖子!
我们非常感谢我们能得到的任何帮助!
干杯!