导航:首页 > 净水问答 > 文件过滤驱动双缓冲

文件过滤驱动双缓冲

发布时间:2022-11-06 03:20:28

㈠ 在不压缩时如何把文件加密

一. HS-Key技术特色

从我们对产品的构思设计和开发,以及国内大企业用户的评测验证和认可度上,巨石企业文件加密系统HS-Key,无论从底层技术的运用上,还是软件的扩展性和柔韧性上,都已经走在了中国企业文件加密软件的最前面。并在对中国企业管理的符合度上,优于国外同类产品。与国内同类产品相比,HS-Key具有以下明显的特色和优势:

1. 基于底层驱动的双缓冲加解密技术

国内目前应用最广的是基于应用程序二次开发加密以及基于驱动的单机加密系统,但这两种加密系统都存在着明显的缺陷和安全漏洞。

基于应用程序二次开发的加密软件,只能针对少数几种应用程序进行加密控制,而不能适应种类繁多的应用程序的加密控制,因此受到很大应用局限性。

基于驱动的单机加密系统,虽然可以加密监控本地计算机所有的应用程序,但是由于不支持网络文件系统,打开本机加密文件另存至未受控的计算机时会自动解密,从而导致加密文件的安全泄漏。

而HS-Key则在底层技术上采用了以下技术:

(1) 采用双缓冲底层驱动文件过滤技术进行文件加密。

双缓冲技术,即在windows自有的缓冲区之外,另建了一个存储结构相同的缓冲区,这个缓冲区由HS-Key单独管理和控制。在读取密文的时候,在windows缓存中保存密文,而在自建的缓冲区中保存明文信息,当进行写操作时,如果需要写入明文,则从自建的缓冲区中直接写入硬盘,如果需要写入密文,则将windows缓冲区的密文内容写入硬盘。这样做的优势就在于:

直接在缓存中进行加解密,写硬盘的速度更快,加解密效率更高。

在windows缓存中保存的是密文,可以防止别有用心的人从windows缓冲中窃取明文数据,导致泄密。

不但可以实现强制加密功能,而且可以轻松的实现强制解密功能,更加符合企业的实际加密管理需求。

(2) 全面支持网络文件系统。

同时监控本地硬盘和网络驱动器的读写加密。对任何应用程序生成的任何文件进行加密控制。同时,透明加解密的过程中,不产生临时文件,

2. 高安全性算法和加解密效率并重

加密强度和加解密速度是双面刃。加密强度越高,加解密速度越慢,而且文件越大,时间上的延迟越明显。加密强度太低,则很容易被破解。为了同时保证文件安全和加密效率,HS-Key采用了160位的IBM公司的SEAL加密算法,同时采用双缓冲技术,对加解密速度进行了优化。实际测试结果证明,使用HS-Key透明打开大于100M的文件,也不会有明显的时间延迟。

3. 切合企业实际的安全管理

国内的很多加密软件在关注文件加解密的同时,忽略了将加解密管理融入到企业的管理体系当中,为了加密而加密,不但改变了企业原有的工作习惯,而且导致工作效率因此而大幅度降低。HS-Key则在产品的构架上充分考虑了企业的实际需求,因此在实施时能够很好的融合到企业的整体安全管理体系中。

(1) 实名制身份认证

国内绝大多数加密软件简单地采用硬件绑定的方式进行加密管理,这种方式的缺点就在于:

a. 无法判断客户端的登录用户到底是谁;

b. 不能够进行分组管理和授权;

c. 将客户端与计算机硬件进行了绑定。一旦计算机硬件配置发生变化,则无法再进行管理。高加密权限的用户也无法操作普通用户的计算机。

d. 单个用户只能有单一的权限。

针对这些问题,HS-Key独创的采用实名制方式进行身份认证管理,即每个用户都拥有一个安全权限,根据用户名+密码登录+硬件码的方式进行管理,而不是简单地和机器的硬件(MAC地址)进行绑定。这种管理方式的优势在于:

a. 可以直观的看到安全组以及其用户的设置情况;

b. 可以直观了解,哪些用户没有登录或者未受到加密监控;

c. 高级权限的用户无论在任何一台机器上登录都拥有相同的权限;

d. 在同一台机器上可以进行多用户的切换,加解密权限也随之变化;

e. 也可以根据需要将用户名和硬件绑定,限定该用户只能在本机登录。

f. 不需要专门的解密工具,拥有解密权限的用户可以登录到任何一台计算机进行解密。

(2) 允许多重权限的组合

特殊的权限可以授权给某个安全组,也可以授权给某个用户,如果这个用户属于多个安全组,HS-Key将进行智能累加,使多重身份,多重权限成为可能。

(3) 允许特权用户的存在

公司领导往往是特权拥有者,HS-Key充分考虑到这一点,允许在权限设置时,放宽对该部分群体的加密限制。比如允许关闭加密监控、允许拷屏操作等。

(4) 允许合法的脱机工作

HS-Key不但允许合法用户脱机进行加密文件的阅读,同时还允许动态的延长授权时间和授权策略。

(5) 多种明文出口

加密软件对企业工作习惯影响最大的,还是对外交流。HS-Key除了提供方便的手工解密方式外,还提供多种自动解密渠道供企业选择,满足安全性和灵活性的要求:

邮件发送自动解密、即时通讯软件(如QQ、MSN等)发送自动解密等;

存储到移动磁盘(U盘、移动硬盘等)时自动解密;

刻录到光盘时自动解密;

保存到网络磁盘(网上邻居的共享目录)时自动解密;

保存到指定目录自动解密等等。

保存某种指定文件格式时强制解密(如保存为txt文件格式时自动解密)等等。

(6) 灵活的策略自定义

HS-Key提供开放的策略自定义功能,用户可以通过策略的自行配置,满足各种复杂的安全需求。如:

本地打印机的控制

禁止指定的应用程序运行

禁止未授权的应用程序访问加密文件

与PDM、OA、ERP系统的集成等等。

4. 多操作系统的加解密管理

国内的加密软件大多只支持常用的windows2000和XP操作系统,而HS-Key则可以支持最广泛的操作系统平台,不但支持常用的windows操作系统,还支持早期的windows 98系统。与此同时,为了满足与UNIX、Linux等多操作系统文件共享的问题,还提供了专门的加解密策略方案。

5. 开发中的HS-Key高级企业版

巨石公司的HS-Key高级企业版已经规划完毕,编码工作已经开始。在我们的规划中,高级企业版将在标准企业版的基础上,增加分组、分级授权,功能更加强大,能满足集团化企业和动态企业联盟的复杂的文件安全需求。目前国内尚未有此类产品上市。HS-Key高级企业版的将在技术和功能上与国外的同类产品分庭抗礼,并在某些方面超过

㈡ 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来使设备对象对应用程序可见)。
注意:由于控制设备对象是唯一不会附加到设备堆栈中的设备对象,因此控制设备对象是唯一的可安全命名的设备对象。由此,是否为文件系统过滤驱动的控制设备对象是否命名是可选的。
注意:文件系统的控制设备对象必须命名。过滤设备对象从不命名。

㈢ 数据防泄露的技术变革

透明加密技术是近年来针对企业数据保密需求应运而生的一种数据加密技术。所谓透明,是指对使用者来说是透明的,感觉不到加密存在,当使用者在打开或编辑指定文件时,系统将自动对加密的数据进行解密,让使用者看到的是明文。保存数据的时候,系统自动对数据进行加密,保存的是密文。而没有权限的人,无法读取保密数据,从而达到数据保密的效果。

自WindowsNT问世以来,微软提出的分层的概念,使透明加密有了实现的可能。自上而下,

应用软件,应用层APIhook(俗称钩子), 文件过滤驱动,卷过滤驱动,磁盘过滤驱动,另外还有网络过滤驱动,各种设备过滤驱动。其中应用软件和应用层apihook在应用层(R3), 从文件过滤驱动开始,属于内核层(R0).

数据透明加密技术,目前为止,发展了3代,分别为

第一代APIHOOK应用层透明加密技术;

第二代文件过滤驱动层(内核)加密技术;

第三代内核级纵深加密技术

第一代:APIHOOK应用层透明加密技术

应用层透明加密技术俗称钩子透明加密技术。这种技术起源于win98时代,后来随着windows2000而流行起来。就是将上述两种技术(应用层API和Hook)组合而成的。通过windows的钩子技术,监控应用程序对文件的打开和保存,当打开文件时,先将密文转换后再让程序读入内存,保证程序读到的是明文,而在保存时,又将内存中的明文加密后再写入到磁盘中。应用层APIHOOK加密技术,特点是实现简单,缺点是可靠性差,速度超级慢,因为需要临时文件,也容易破解。但由于直接对文件加密直观感觉非常好,对于当初空白的市场来讲,这一旗号确实打动了不少企业。

第二代:文件过滤驱动加密技术

驱动加密技术是基于windows的文件系统(过滤)驱动技术,起源于WindowsNT发布之后,其工作在windows的内核层,处于应用层APIHook的下面,卷过滤和磁盘过滤的上面。设计思想是建立当应用程序(进程)和文件格式(后缀名)进行关联,当用户操作某种后缀文件时对该文件进行加密解密操作,从而达到加密的效果。

内核层文件过滤驱动技术,分IFS和Minifilter2类。IFS出现较早,Minfilter出现在xp以后。两者的区别可以理解为VC++和MFC的区别,IFS很多事情需要自己处理,而Minifilter是微软提供了很多成熟库,直接用。由于windows文件保存的时候,存在缓存,并不是立即写入文件,所以根据是否处理了双缓bug,后来做了些细分,但本质还是一样,都是问题的修正版本而已。但由于工作在受windows保护的内核层,运行速度比APIHOOK加密速度快,解决了很多问题和风险。

文件过滤驱动技术实现相对简单,但稳定性一直不太理想。

第三代:内核级纵深沙盒加密技术

之所以叫内核级纵深沙盒加密技术,主要原因是使用了磁盘过滤驱动技术,卷过滤驱动技术,文件过滤驱动技术,网络过滤驱动(NDIS/TDI)技术等一系列内核级驱动技术,从上到下,纵深防御加密。该技术也起源于WindowsNT之后,但由于技术复杂,开发要求高,公开资料少,而发展较慢。但随着微软公布了部分Windows源代码之后,此技术开始逐渐成熟。内核级沙盒加密,是当使用者操作涉密数据的时候,对其存储过程进行控制,对其结果进行加密保存,每个模块只做自己最擅长的那块,所以非常稳定。加密的沙盒是个容器,把涉密软件,文件扔到容器中加密。而这个容器是透明的,使用者感觉不到它的存在。,

第三代透明加密技术的特点是,涉密数据使用前,先初始化涉密沙盒,沙盒加密一旦成功,之后所有的数据都是数据实体,不针对文件个体,所以无数据破损等问题。特点是速度快,稳定。

第一代,第二代本质都是采用的针对单个文件实体进行加密,如a.txt内容为1234, 加密后变成@#$%% +标记。@#$%%是把原文1234进行加密之后的密文。而标记的用途是用来区分一个a.txt文件是否是已经被加密。当系统遇到一个文件的时候,首先判断这个标记是否存在,如果存在,表明是被系统加密过的,则走解密读取流程,如果不是加密的,就无需解密,直接显示给使用者,只是当保存的时候,再进行加密,使其成文密文+标记。

这就带来一个巨大的风险 :如果是一个较大文件,加密过程中发生异常,标记没加上,那么下次读这个文件的时候,因为没有读到表记,而采用原文读取,然后再加密,那么这个文件就彻底毁坏了。这个现象在第一代APIHOOK透明加密技术的产品中特别明显,在第二代文件过滤驱动产品中,因为速度变快了,使文件破损发生概率减低了很多,但并没有本质解决这个问题。

另外, 由于是进程和文件后缀名进行关联,也造成了一个缺陷 :很多编程类软件,复杂制图软件的编译,晒图等操作,都是很多进程同时操作某个文件,这个时候进行进程和文件关联显然太牵强了,因为进程太多了。即使进行关联,多个进程交替访问文件,加密解密混在一起,极容易造成异常。所以才会出现VC等环境下如不能编译,调试等。

其他方面,版本管理无法对比,服务器上存放的是密文(服务器存密文,是个极大的风险,目前没有哪家大企业敢这么做,毕竟太依赖加密软件,持续性没有了),大文件速度慢等,一系列问题,无法解决。

而第三代内核纵深加密技术是在前者2个基础之上发展而来的,每个过滤层都只做自己最擅长的事情,所以特别稳定,速度快,性能可靠,不存在第一代和第二代的问题。由于内核级纵深透明加密技术要求高,涉及技术领域广,极其复杂,开发周期长,所以国内的能做开发的厂商不多。目前, 深信达公司推出的SDC机密数据保密系统, 给人一眼前一亮的感觉,其产品是第三代透明加密保密技术的典型产品,其产品主要特点是:

1)采用了磁盘过滤,卷过滤,文件过滤,网络过滤等一系列纵深内核加密技术,采用沙盒加密,和文件类型和软件无关,沙盒是个容器。

2)在操作涉密数据的同时,不影响上外网,QQ,MSN等。

3)保密彻底,包括网络上传,邮件发送,另存,复制粘贴,屏幕截取等,特别是屏幕保密,做得非常炫。

4)服务上存放的是明文,客户端存放的是密文,文件上传服务器自动解密,到达客户端自动加密。服务器上明文,减少了业务连续性对加密软件的依赖。

5)不但可以针对普通文档图纸数据进行保密需求,同时更是研发性质的软件公司( 游戏 ,通讯,嵌入式,各种BS/CS应用系统)源代码保密首选。

㈣ 加密软件公司哪家好

域之盾通过部署专业强大的企业数据加密软件、图纸加密软件来对电脑文件进行加密,防止文件私自携带出去的行为,以保护电脑文件的安全。

1. 透明加解密
系统根据管理策略对相应文件进行加密,用户访问需要连接到服务器,按权限访问,越权访问会受限,通过共享、离线和外发管理可以实现更多的访问控制。
2. 泄密控制
对打开加密文档的应用程序进行打印、内存窃取、拖拽和剪贴板等操作管控,用户不能主动或被动地泄漏机密数据。
3. 审批管理
支持共享、离线和外发文档,管理员可以按照实际工作需求,配置是否对这些操作进行强制审批。用户在执行加密文档的共享、离线和外发等操作时,将视管理员的权限许可,可能需要经过审批管理员审批。
4. 离线文档管理
对于员工外出无法接入网络的情况可采用系统的离线管理功能。通过此功能授权指定用户可以在一定时间内不接入网络仍可轻松访问加密数据,而该用户相应的安全策略仍然生效,相应数据仍然受控,文档权限也与联网使用一样。
5. 外发文档管理
本功能主要是解决数据二次泄密的威胁,目的是让发出的文档仍然受控。通过此功能对 需要发出的文件进行审批和授权后,使用者不必安装加密客户端即可轻松访问受控文件,且可对文件的操作权限及生命周期予以管控。

6. 审计管理
对加密文档的常规操作,进行详细且有效的审计。对离线用户,联网后会自动上传相关日志到服务器。
7. 自我保护
通过在操作系统的驱动层对系统自身进行自我保护,保障客户端不被非法破坏,并且始终运行在安全可信状态。即使客户端被意外破坏,客户端计算机里的加密文档也不会丢失或泄漏。

㈤ 文件过滤驱动使用双缓存机制是不是意味着物理内存也双倍增加了

对的。
更好的了解双缓冲机制原理,双缓冲动机,以及如何去应用双缓冲去解决一些问题,比如说编程问题、生活中事例等。
双缓存类 * android双向缓存, * 先缓存到内存,在缓存到SD卡 * 取的时候先取内存,如果内存没有就去SD里面取。

㈥ windows 文件系统驱动

网上搜楚狂人有一篇教程,还不错

㈦ 如何卸载反病毒文件系统过滤驱动

您好:

这样的情况可能是因为您以前安装的安全软件并没有彻底卸载干净回导致的软件冲突,建议答您使用腾讯电脑管家的软件管理里面的卸载功能将以前安装的安全软件卸载干净,并使用垃圾清理功能清理完卸载残留以后再安装新的安全软件就可以了,并建议您使用腾讯电脑管家保护您的电脑,您可以点击这里下载最新版的腾讯电脑管家:腾讯电脑管家最新版下载

腾讯电脑管家企业平台:http://..com/c/guanjia/

㈧ windows10文件驱动过滤

1、获得文件全路径以及判断时机

除在所有 IRP_MJ_XXX 之前自己从头创建 IRP 发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE
中才会使用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而在 IRP_READ IRP_WRITE 中它们是直接操作 FCB (File Control Block)的。

2、从头建立 IRP 发送关注点

无论你建立什么样的 IRP,是 IRP_MJ_CREATE 也好还是 IRP_MJ_DIRECTORY_CONTROL也罢,最要提醒的就是一些标志。不同的标志会代来不同的结果,有些结果是直接返回失败。这里指的标志不光是 IRP->Flags,还要考虑 IO_STACK_LOCATION->Flags还有其它等等。尤其是你要达到一些特殊目的,这时候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的标志结果有很大的不同。

3、从头建立 IRP 获取全路径注意点

自己从头建立一个 IRP_MJ_QUERY_INFORMATION 的 IRP 获取全路径时需要注意,不仅在 IRP_MJ_CREATE 要做区别处理,在 IRP_MJ_CLOSE 也要做同样的处理,否则如果目标是 NTFS 文件系统的话可能产生 deadlock。如果是 NTFS 那么在 IRP_MJ_CLEANUP 的时候也需要对 FO_STREAM_FILE 类型的文件做同样处理。

4、获得本地/远程访问用户名(域名/SID)

方法只有在 IRP_MJ_CREATE 中才可用,那是因为 IO_SECURITY_CONTEXT 只有在 IO_STACK_LOCATION->Parameters.Create.SecurityContext 才会有效。这样你才有可能从 IO_SECURITY_CONTEXT->SecurityContext->AccessState->SubjectSecurityContext.XXXToken 中获得访问 TOKEN,从而进一步得到用户名或 SID。记得 IFS 中有一个库,它的 LIB 导出一个函数可以让你在获得以上信息后得到用户名与域名。但如果你想兼容 NT4 的话,只能自己分析来得出本地和远程的 SID。

5、文件与目录的判断

正确的方法在楚狂人的文档里已经说过了,再补充一句。如果你的文件过滤驱动要兼容所有文件系统,那么不要十分相信从 FileObject->FsContext 里取得的数据。正确的方法还是在你传递下去 IRP_MJ_CREATE 后从最下层文件系统延设备栈返回到你这里后再获得。

6、加/解密中判断点

只判断 IRP_PAGING_IO,IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是没错的。如果有问题,相信是自己的问题。关于有人提到在 FILE_OBJECT->Flags中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判断,对此问题的回答是只要你判断了 IRP_NOCACHE 就不用再判断 FILE_OBJECT 中的,因为它最终会设置 IRP->Flags 为 IRP_NOCACHE。关于你看到的诸如 IRP_DEFER_IO_COMPLETION 等 IRP 不要去管它,因为它只是一个过程。最终读写还是如上所介绍。至于以上这些 IRP 哪个是由 CC MGR 发送的,哪些是由 I/O MGR 发送和在什么时候发送的,这个已经有很多讨论了,相信可以找到。

7、举例说明关于 IRP 传递与完成注意事项

只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介绍的流程,自己没有实际的体会还是不够的,那里只介绍了基础概念,让自己有了知识。知道如何用,在什么情况下用,用哪种方法,能够用的稳定这叫有了技术。我们从另一个角度出发,把问题分为两段来看,这样利于总结。一个 IRP 在过滤驱动中,把它分为需要安装 CompleteRoutine 的与无需安装 CompleteRoutine 的。那么在不需要安装 CompleteRoutine 的有以下几类情况。

(1) 拿到这个 IRP 后什么都不做,直接调用 IoCompleteRequest() 来返回。
(2) 拿到这个 IRP 后什么都不做,直接传递到底层设备,使用IoSkipCurrentIrpStackLocation() 后调用 IoCallDriver() 传递。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()来建立 IRP 的。

以上几种根据需要直接使用即可,除了一些参数与标志需要注意外,没有什么系统机制相关的东西需要注意了。那么再来看需要安装 CompleteRoutine 的情况。我们把这种情况再细分为两种,一是在 CompleteRoutine 中返回标志为STATUS_MORE_PROCESSING_REQUIRED 的情况。二是返回处这个外的标志,需要使用函数IoMarkIrpPending() 的情况。在 CompleteRoutine 中绝大多数就这么两种情况,你需要使用其中的一种情况。那么为什么需要安装 CompleteRoutine 呢?那是因为我们对其 IRP 从上层驱动,经过我们驱动,在经过底层设备栈返回到我们这一层驱动时需要得到其中内容作为参考依据的,还有对其中内容需要进行修改的。再有一种情况是没有经过上层驱动,而 IRP 的产生是在我们驱动直接下发到底层驱动,而经过设备栈后返回到我们这一层,且我们不在希望它继续向上返回的,因为这个 IRP 本身就不是从上层来的。综上所述,先来看下 IoMarkIrpPending() 的情况。

(1) 在 CompleteRoutine 中判断 Irp->PendingReturned 并使用 IoMarkIrpPending()然后返回。这种方法在没有使用 KeSetEvent() 的情况下,且不是自建 IRP 发送到底层驱动返回时使用。也就是说有可能我所做的工作都是在 CompleteRoutine 中进行的。比如加/解密时,我在这里对下层驱动返回数据的判断并修改。修改后因为没有使用 STATUS_MORE_PROCESSING_REQUIRED 标志,它会延设备堆一直向上返回并到用户得到数据为止。这里一定要注意,在这种情况下 CompleteRoutine返回后,不要在碰这个 IRP。也就是说如果这个时候你使用了 IoCompleteRequest()的话会出现一个 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 错误。

(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 标志。这种情况在使用了 KeSetEvent() 的函数下出现。这里又有两个小小的分之。

1) 出现于上层发送到我这里,当我这里使用 IoCallDriver() 后,底层返回数据经过我这一层时,我想让它暂时停止继续向上传递,让这个 IRP 稍微歇息一会,等我对这个 IRP 返回的数据操作完成后(一般是没有在 CompleteRoutine中对返回数据进行操作情况下,也就是说等到完成例程返回后再进行操作),由我来调用 IoCompleteRequest() 让它延着设备栈继续返回。这里要注意,我们是想让它返回的,所以调用了 IoCompleteRequest()。这个可不同于下面所讲的自己从头分配 IRP 时在 CompleteRoutine 中已经调用 IoFreeIrp() 释放了当前IRP 的情况。比如我在做一个改变文件大小,向文件头写入加密标志的驱动时,在上层发来了 IRP_MJ_QUERY_INFORMATION 查询文件,我想在这个时候获得文件信息进行判断,然后根据我的判断结果再移动文件指针。注意:上面是两步,第一步是先获得文件大小,那么在这个时候我就需要用到上述办法,先让这个 IRP传递下去,得到我想要的东西后在进行对比。等待适当时机完成这个 IRP,让数据继续传递,直到用户收到为止。第二步我会结合下面小节来讲。

2) 出现于自己从头建立 IRP,当使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()创建 IRP 调用 IoCallDriver() 后,底层返回数据到我这一层时,我不想让这个 IRP 继续向上延设备栈传递。因为这个 IRP 就是在我这层次建立的,上层本就不知道有这么一个 IRP。那么到这里我就要在 CompleteRoutine 中使用 IoFreeIrp()来释放掉这个 IRP,并不让它继续传递。这里一定要注意,在 CompleteRoutine函数返回后,这个 IRP 已经释放了,如果这个时候在有任何关于这个 IRP 的操作那么后果是灾难性的,必定导致 BSOD 错误。前面 1) 小节给出的例子只完成了第一步这里继续讲第二步,第一步我重用这个 IRP 得到了文件大小,那么这个时候虽然知道大小,但我还是无法知道这个文件是否被我加过密。这时,我就需要在这里自己从头建立一个 IRP_MJ_READ 的 IRP 来读取文件来判断是否我加密过了的文件,如果是,则要减少相应的大小,然后继续返回。注意:这里的返回是指让第一步的IRP 返回。而不是我们自己创建的。我们创建的都已经在CompleteRoutine 中销毁了。

8、关于完成 IRP 的动作简介

当一个底层驱动调用了 IoCompleteRequest() 函数时,基本上所有设备栈相关 IRP 处理工作都是在它那里完成的。包括 IRP->Flags 的一些标志的判断,对 APC 的处理,抛出MULTIPLE_IRP_COMPLETE_REQUESTS 错误等。当它延设备栈一直调用驱动所安装的 CompleteRoutine时,如果发现 STATUS_MORE_PROCESSING_REQUIRED 这个标志,则会停止向上继续回滚。这也是为什么在 CompleteRoutine 中使用这个标志即可暂停 IRP 的原因。

9、关于 ObQueryNameString 的使用

这个函数的使用,在有些环境下会有问题。它的上层函数是 ZwQueryObject()。在某些情况下会导致系统挂起,或者直接 BSOD。它是从 对象管理器中的 ObpRootDirectoryObject开始遍历,通过 OBJECT_HEADER_TO_NAME_INFO 获得对象名称。今天问了下 PolyMeta好象是在处理 PIPE 时会挂启,这个问题出现在 2000 系统。在 XP 上好象补丁了。

10、关于重入问题

其实这个问题在很久前的 IFS FAQ 里已经介绍的很清楚,包括处理方法以及每种方法可能带来的问题。IFS FAQ 里的 Q34 一共介绍了四种方法,包括自己从头建立 IRP发送,使用 ShadowDevice,使用特征字符串,根据线程 ID,在 XP 下使用() 函数。并且把以上几种在不同环境下使用要处理的问题也做了简单的介绍。且在 Q33 里介绍了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 问题的解决方法。

㈨ 如何构造一个简单的USB过滤驱动程序

一、基本原理抄 我们知道,WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上。

㈩ Load File Filter Driver failed 指的是什么意思

装载文件过滤驱动失败

阅读全文

与文件过滤驱动双缓冲相关的资料

热点内容
怎样做可剥离丙烯酸树脂 浏览:987
汕尾城区农村污水ppp中标 浏览:353
污水泵用什么机封 浏览:249
饮水机为什么有两个阀门 浏览:27
陶氏超滤膜生产基地 浏览:142
过滤所需要用的玻璃仪器 浏览:384
霍曼三代饮水机滤芯怎么拆开 浏览:848
武汉消毒车载型空气净化器多少钱 浏览:357
注入版wpe过滤器怎么用 浏览:501
小米净水器一直亮出水怎么回事 浏览:680
垃圾站怎么处理污水 浏览:600
柠檬酸除垢剂只能除水垢吗 浏览:470
呼和浩特污水厂在哪 浏览:628
盐酸水壶除垢 浏览:254
阴离子交换柱多糖上样量 浏览:6
脱硫废水旋流子堵塞原因 浏览:402
石灰乳去铬离子 浏览:407
atem车载空气净化器怎么用 浏览:439
ro反渗透膜滤芯直销 浏览:105
4021反渗透膜尺寸 浏览:352