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