文件过滤驱动打开
① 什么是过滤驱动
过滤驱动就是挂载在其他驱动上,对某设备的irp进行拦截过滤作用,可以对设备进行功能版扩展,或是数据加权密等的驱动程序。
比如:
1. 可以对写入硬盘的数据做加密,然后读取的时候解密,这样对于用户来说,根本不知道有加密解密的过程,然后存在硬盘上的数据是加密的。
2. 可以对已有驱动做一些扩展,或者改变已有驱动的功能。比如已有驱动一次只能写1024字节的数据,那么过滤驱动可以扩展到任何长度,然后分段调用已有驱动就是了。
过滤驱动可以在功能型驱动的上面,称之为上层过滤驱动,或者高层,反正就这个意思。过滤驱动在功能型驱动下面,称之为下层过滤驱动。看示意图:
② 文件过滤驱动和磁盘过滤驱动有什么区别
神马狗屁老师教的啊
③ linux怎样加载文件过滤驱动
文件系统过滤驱动是一种可选的,为文件系统提供具有附加值功能的驱动程序。文件系统过滤驱动是一种核心模式组件,它作为Windows NT执行体的一部分运行。
文件系统过滤驱动可以过滤一个或多个文件系统或文件系统卷的I/O操作。按不同的种类划分,文件系统过滤驱动可以分成日志记录、系统监测、数据修改或事件预防几类。通常,以文件系统过滤驱动为核心的应用程序有防毒软件、加密程序、分级存储管理系统等。
二、文件系统过滤驱动并不是设备驱动
设备驱动是用来控制特定硬件I/O设备的软件组件。例如:DVD存储设备驱动是一个DVD驱动。
相反,文件系统过滤驱动与一个或多个文件系统协同工作来处理文件I/O操作。这些操作包括:创建、打开、关闭、枚举文件和目录;获取和设置文件、目录、卷的相关信息;向文件中读取或写入数据。另外,文件系统过滤驱动必须支持文件系统特定的功能,例如缓存、锁定、稀疏文件、磁盘配额、压缩、安全、可恢复性、还原点和卷装载等。
下面两部分详细的阐述了文件系统过滤驱动和设备驱动之间的相似点与不同点。
三、安装文件系统过滤驱动
对于Windows XP和后续操作系统来说,可以通过INI文件或安装应用程序来安装文件系统过滤驱动(对于Windows 2000和更早的操作系统,过滤驱动通常通过服务控制管理器Service Control Manager来进行安装)。
四、初始化文件系统过滤驱动
与设备驱动类似,文件系统过滤驱动也使用DriverEntry例程进行初始化工作。在驱动程序加载后,加载驱动相同的组件将通过调用驱动程序的 DriverEntry例程来对驱动程序进行初始化工作。对于文件系统过滤驱动来说,加载和初始化过滤驱动的系统组件为I/O管理器。
DriverEntry例程运行于系统线程上下文中,其IRQL = PASSIVE_LEVEL。本例程可分页,详细信息参见MmLockPagableCodeSection。
DriverEntry例程定义如下:
NTSTATUS
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
本例程有两个输入参数。第一个参数,DriverObject为系统在文件系统过滤驱动加载时所创建的驱动对象;第二个参数,RegistryPath为包含驱动程序注册键路径的Unicode字符串。
文件系统过滤驱动按如下顺序执行DriverEntry例程:
01、创建控制设备对象:
文件系统过滤驱动的DriverEntry例程通常以创建控制设备对象作为该例程的起始。创建控制设备对象的目的在于允许应用程序即使在过滤驱动加载到文件系统或卷设备对象之前也能够直接与过滤驱动进行通信。
注意:文件系统也会创建控制设备对象。当文件系统过滤驱动将其自身附加到文件系统之上时(而不是附加到某一特定文件系统卷),过滤驱动同样将其自身附加到文件系统的控制设备对象之上。
在FileSpy驱动范例中,控制设备对象按如下方式创建:
RtlInitUnicodeString(&nameString, FILESPY_FULLDEVICE_NAME);
status = IoCreateDevice(
DriverObject, //DriverObject
0, //DeviceExtensionSize
&nameString, //DeviceName
FILE_DEVICE_DISK_FILE_SYSTEM, //DeviceType
FILE_DEVICE_SECURE_OPEN, //DeviceCharacteristics
FALSE, //Exclusive
&gControlDeviceObject); //DeviceObject
RtlInitUnicodeString(&linkString, FILESPY_DOSDEVICE_NAME);
status = IoCreateSymbolicLink(&linkString, &nameString);
与文件系统不同,文件系统过滤驱动并不是一定要为其控制设备对象命名。如果传递给DeviceName参数一个非空(Non-NULL)值,该值将作为控制设备对象的名称。接下来,在前面的代码范例中DriverEntry可以调用IoCreateSymbolicLink例程来将该对象的核心模式名称与应用程序可见的用户模式名称关联到一起(同样可以通过调用IoRegisterDeviceInterface来使设备对象对应用程序可见)。
注意:由于控制设备对象是唯一不会附加到设备堆栈中的设备对象,因此控制设备对象是唯一的可安全命名的设备对象。由此,是否为文件系统过滤驱动的控制设备对象是否命名是可选的。
注意:文件系统的控制设备对象必须命名。过滤设备对象从不命名。
④ 如何设计单机版的文件过滤驱动
透明指的是用户在操作的时候,虽然后台在自动的进行加解密,但是用户根本就不知道加密内的存在,就像中间容隔了一层透明的玻璃一样。透明的好处在于不改变用户的操作,一切都和加密之前一样,甚至在有些企业安装加密后都无需通知所有的员工,就像加密并不存在一样,只是加密文件到了企业安全环境的外部才会发现文件无法打开。透明的程度也是加密软件一个很重要的方面,例如:正在编辑一个Word文件时,能否拷贝或者使用其他程序来读取这个文件,如果不能那么这里就不够透明,在一些PDM的文档管理软件中就是文件在一个应用程序打开状态时另一个应用程序进行检入。透明的程度越高,用户使用时就越是和未加密时一样,透明程序越低用户就会发现有越多的操作受到限制,和加密前有较大的差异。
⑤ 文件过滤驱动下,为什么读文件的时候总是读很多遍,OnSfilterIrpPost中if (irpsp
不应该在这个地方调用清缓存函数,在这里调用的话在IRP发送的时候都会去清除缓存,读文件的时候发现要读取的文件不存在就会再去读了,浪费文件读取时间。
⑥ 文件过滤驱动程序中volume和磁盘是什么关系
DB库、dat、cfg……多了,只需要研发者自行设置一种就可以。关键是你要做什么?要解密?
⑦ 台式电脑开机后显示"打开usb过滤驱动失败,请查看设备管理器中,通用
这是装了抄usb密码保护软件,却没袭有有效的装载或设置完善,开机时那个设置过密码的usb接口中的u盘不见了,造成查找提示。。
卸载软件,重启。
如果还恢复不了就是流氓软件,如果想干干净净,只有重装系统。。或者临时使用360启动管理,关闭启动项中这个软件的启动运行及服务运行。
⑧ 过滤驱动中打开文件时如何避免重入
在处理IRP_MJ_CREATE请求时,过滤驱动可能会使用不同的属性/权限等打开这个文件。这种情况经常发生在第二次调用ZwCreatefile时。这会导致生成一个对FSD 过滤驱动的回调(就是重入了).因而,正常的过滤驱动就要有能力检测这种重入的问题。
There are several ways of dealing with reentrancy ring an IRP_MJ_CREATE operation, and the appropriate solution for your particular driver will depend upon the circumstances. In addition, there are a number of techniques that might work for a single file system filter driver, but that fail when used in a multi-filter environment.
在处理IRP_MJ_CREATE操作过程中,有几种方法可以处理重入,处理你的驱动(中的重入)的适当方法取决于你的环境。另外,有许多种技术可以在单个文件系统过滤驱动上工作,但在多层过滤的环境下可能会失效。
For Windows XP and newer versions of Windows, the best mechanism for opening a file within the filter is to use . A filter driver can call this function and specify a given device object. The IRP_MJ_CREATE that is built will be passed to the specified device object. This technique avo
ids reentrancy issues and is the best mechanism available for a filter to open a file.
对Windows xp或者更新版的Windows来说,在过滤驱动中打开一个文件的最好方法是使用.文件过滤驱动可以调用这个函数并且指定一个给定的设备对象。
For versions of Windows prior to Windows XP, this mechanism is not available. The best mechanism in this environment is to implement your own functional equivalent of . This can be done by creating a second device object for each device you are filtering.
对Windows xp以前的Windows操作系统,这种方法无效。在这种环境下最好的方法是实现你自己的与等价的功能。这可以通过给你要过滤的设备创建第二个设备对象来实现。
For example, suppose you decide to filter some given file system device object, FSDVolumeDeviceObject. You then create a device object MyFilterDeviceObject and attach it using IoAttachDeviceToDeviceStack (of course, in Windows XP you would use instead). In addition, you create a second device object MyFilterShadowDeviceObject. This device object must be assigned a name ("DeviceMyFilterDevice27", for example). The name can be anything, but it must obviously be unique. In your device extension for your two device objects, you need to track this name, and you need to maintain pointers to the respective device objects (that is, the device extension for MyFilterShadowDeviceObject should point to MyFilterDeviceObject and the device object extension for MyFilterDeviceObject should point to yFilterShadowDeviceObject). Don't forget to set the StackSize field of the device object correctly!)
例如,假设你要过滤某个特定的文件系统设备对象,FSDVolumeDeviceObject(文件系统卷设备对象).这时你要创建一个设备对象MyFilterDeviceObject 并且使用IoAttachDeviceToDeviceStack 函数(在windows xp下使用 )来挂接它。另外,你还要创建第二个设备对象yFilterShadowDeviceObject.这个设备对象必须被指定一个名字(例如"DeviceMyFilterDevice27",注: 这里指的第二个设备对象,即Shadow device object )。名字可以是任意的,但必须唯一的。在这两个设备的设备扩展结构中,你需要跟踪这个名字
(注,其实就是做标志,你要知道你当前是处在哪个设备中,是第一个设备对象还是Shadow object )你需要维护一些指向相应的设备对象的指针(也就是说,MyFilterShadowDeviceObject的设备扩展要指向MyFilterDeviceObject,MyFilterDeviceObject的设备扩展对象要指向MyFilterShadowDeviceObject.不要忘了正确设置设备对象的StackSize成员变量。
Now, an IRP_MJ_CREATE request arrives in your filter, specifying MyFilterDeviceObject. To open the file without experiencing reentrancy problems, you call IoCreateFile (or ZwCreateFile). Since you must pass the name of the file being opened, you construct that by using both the name you gave MyFilterShadowDeviceObject and the name that is in the FileObject of the I/O stack Location (IoGetCurrentIr
pStackLocation(Irp)->FileObject).
现在,当IRP_MJ_CREATE 请求到达你的过滤驱动时,指定了 MyFilterDeviceObject.你调用IoCreateFile(或ZwCreateFile) 打开文件就没有重入的问题了.以后,你必须传递这个打开的文件的名字,这个名字是用你设置在MyFilterShadowDeviceObject中的名字和从I/O 堆栈区域中得到的文件对象中的名字一起构造的。
Since you are passing a name in that points to your second device object, the I/O Manager will build the IRP_MJ_CREATE and pass the resulting I/O request packet to your driver, but specifying MyFilterShadowDeviceObject.
当你传递一个指向你的第二个设备对象的名字,I/O管理器会构建IRP_MJ_CREATE 并且传递I/O请求的结果到你的驱动,但指定了MyFilterShadowDeviceObject.
In your IRP_MJ_CREATE dispatch handler you must detect that this is a "shadow" device object, rather than a typical filter device object. In this case, you should send the IRP_MJ_CREATE operation down to the device being filtered by MyFilterDeviceObject. Indeed, since you should not need to do any further processing, you can use IoSkipCurrentIrpStackLocation (rather than ).
在你的IRP_MJ_CREATE 分发例程处理函数中,你必须检测它是一个"Sahdow"设备对象而不是是一个典型的过滤设备对象。在这种情况下,你必须将IRP_MJ_CREATE操作下传到已经被 MyFilterDeviceObject过滤了的设备中。确实,此后你不需要作进一步的处理,你可以用IoSkipCurrentIrpStackLocation函数(不是).
⑨ 怎么用代码实现WDM文件过滤驱动安装
为了让这个驱动被系统加载,必须创建一个inf文件。由于是使用现成的例子,因此这一步也可以省下来。直接右键点击例子中的inf文件,在弹出的菜单中选择“安装”即可。
这里要注意的是,inf中的StartType参数,它可以控制驱动被加载的方式:
SERVICE_AUTO_START (2) 安全模式下不会自动加载 SERVICE_BOOT_START (0) 在系统安全模式下启动时 驱动也会自动加载
SERVICE_DEMAND_START(3) 则驱动不会自动加载
因为是测试,我使用SERVICE_DEMAND_START,即由手动加载驱动。例子是miniFilter驱动,因此可以在命令提示行中用“fltmc load 驱动名称”来加载,相应的卸载是“fltmc unload”。如果是其它驱动,则用"net start 驱动名称"来加载,相应的卸载是"net stop 驱动名称"。注意驱动名称不是文件名,而是inf中[Settings]的ServiceName值。驱动要发布时,也可以通过CreateService & StartService API来动态安装。
Inf文件的写法,可以参考例子,或者拿现成的改一改。下面的是摘自驱动开发网的
XiangXiangRen整理的Inf文件,改起来比较方便,谢谢XiangXiangRen
⑩ 打开usb过滤驱动失败,请查看设备管理器中,通用串行总线控制器 是否存在
这是装了usb密码保护复软件制,却没有有效的装载或设置完善,开机时那个设置过密码的usb接口中的u盘不见了,造成查找提示。。
卸载软件,重启。
如果还恢复不了就是流氓软件,如果想干干净净,只有重装系统。。或者临时使用360启动管理,关闭启动项中这个软件的启动运行及服务运行。