导航:首页 > 设备说明 > 驱动设备过滤和类过滤

驱动设备过滤和类过滤

发布时间:2022-06-26 09:33:48

Ⅰ 怎样才能关闭电脑的过滤器驱动程序啊

以下为复制成分 WDM(Windows Driver Mode)是微软公司为Windows的驱动程序设计的一种通用的驱动程序模型。相比以前的KDM和VXD来说,他的性能更高、系统之间移植更加方便。所以,随着系统的升级,WDM已经成为Windows 2000系统下驱动程序开发的主流。作为WDM模型之中一类特殊的驱动程序,过滤器驱动程序(Filter driver)可以在不更改现有驱动程序的情况下,方便地修改、增加现有驱动程序的功能。特别是对于Windows 2000已经提供了通用驱动程序的硬件设备,通过编写过滤器驱动程序,可以以较小的代价扩展硬件现有的功能。因此具有很强的实际应用价值。 1 Windows 2000 I/O请求处理结构如图1所示,Windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用Win32子系统提供的API来同设备交互,当请求传递到I/O管理器时,他进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传递到适当的驱动程序去,并给应用程序一个消息,通知这次I/O操作还没完成。驱动程序一般通过硬件抽象层来和硬件交互,从而完成I/O请求工作。驱动程序完成I/O操作后,他将调用一个特殊的内核服务例程来完成IRP。这时,I/O管理器把数据和结果返回给Win32和用户应用程序。2 WDM驱动程序模型体系结构Windows驱动程序模型重新定义驱动程序分层使用了如图2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象PDO(Physical Device Object),代表了设备和总线之间的连接。在设备对象堆栈的中间的对象称为功能设备对象FDO(Functional Device Object),代表了设备的功能。在FDO的上面和下面还会有一些过滤器设备对象FIDO(Filter Device Object)。位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO之上)的过滤器设备对象称为下层过滤器。总线驱动程序负责枚举他的总线,这意味着发现总线上的全部设备和检测设备何时被添加或删除并为每个设备创建一个PDO。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使I/O请求过程更加明了。I/O管理器发送的IRP,先被送到设备堆栈的上层过滤器驱动程序(FIDO),他可以根据要求决定IRP的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以决定如何处理IRP。高层的驱动程序可以把请求划分成更简单的请求并传递给下层驱动程序。中间层次的驱动程序进一步处理请求,将一个IRP中的请求划分为若干个小的请求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些IRP在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。 3 过滤器驱动程序过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改IRP流,在不影响其他驱动程序的前提下提供一些附加的功能。他的功能可分为:(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。(2)上层过滤器驱动程序在功能驱动程序之前看到IRP,可以很方便地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送IRP时看到IRP。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,进行必要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。 (4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序完全独立于总线结构而不直接与设备对话。针对不同的总线编写不同的下层过滤器,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送IRP即可。4 过滤器驱动程序设计过滤器驱动程序设计与功能驱动程序相似。这里限于篇幅主要讨论一下过滤器驱动程序设计中与功能驱动程序相区别的几个关键的技术要点。4.1 DriverEntry例程DriverEntry例程是驱动程序的人口点。当I/O管理器装入驱动程序时,他调用DriverEntry例程用来初始化驱动程序范围的数据结构和资源,包括输出该驱动程序的其他人口点,初始化该驱动程序使用的特定对象,并设置驱动程序系统资源。与功能驱动程序相区别的是:他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。4.2 AddDevice例程AddDevice函数的基本职责是创建一个设备对象并把他连接到以物理设备对象PDO为底的设备堆栈中,并负责设备对象初始化。与功能驱动程序相区别的是:过滤驱动程序创建的设备对象可能是2种,一种是不命名的过滤设备对象,过滤器工作时把这个无名的设备对象连接到以物理设备对象PDO为底的设备堆栈中。一种是为了和用户程序通信而创建的命名的设备对象并不连接到以物理设备对象PDO为底的设备堆栈中。命名可以采用2种方法:第一种方法是采用可显示的"硬编码"符号链接名,用户态程序必须把设备名硬编码到源代码中;另外一种方法是使用设备接口,每个设备接口是由一个全局惟一标志符GUID标志。设备注册为一个特定的设备接口就创建了一个符号链接。相关步骤如下:(1)调用IoCreateDevke创建过滤设备对象,并建立一个私有的设备扩展对象。(2)寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。(3)初始化设备扩展和设备对象的F1ag成员。(4)调用IOAttachDevkeToDeviceStack函数把新设备对象放到堆栈上。具体实现程序如下:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){PDEVICE_OBJECT fido=NULL;//创建没有设备名的过滤设备对象NTSTATUS status=IoCreateDevice (DriverObjeot,sizeof (DEVICE-EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fido);if(!NT_SUCCESS(status)) return status;//初始化设备扩展和设备对象的Flag成员PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;pdx->DeviceObject=fido;pdx->Pdo=pdo;pdx->eDeviceType =FILTER-p.htm" target="_blank" title="FILTER货源和PDF资料">FILTER;//把没有设备名的设备对象放到堆栈上PDEVICE- OBJECT fdo =IoAttachDeviceToDeviceStack (fido,pdo);pdx->TopDevObj=fdo;fido->Flags ︱=pdo->F1ags&(DO_DIRECT-IO ︱DO-BUFFERED-IO ︱ DO_POWER_PAGABLE ︱DO_POWER_INRUSH);………//建立一个命名的设备对象创建符号链接CreateSymbOlicLink (DriverObject,pdo);return STATUS_SUCCESS;}4.3 派遣例程派遣例程处理来自应用程序的打开、关闭、读、写等I/O请求命令。与功能驱动程序的区别是:过滤器驱动程序不能影响其他驱动程序接受IRP。对于未知的IRP或不处理的IRP过滤驱动程序的原则是必须沿设备栈传递下去。因此他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。对于希望处理的IRP必须指定特殊的派遣函数,直接用CompleteIRP来完成接收到的这类IRP,不往下层传送。这里由DispatchDeviceControl处理来自应用程序的所有希望处理的I/O操作命令。通常采用给予所有自定义的I/O请求代码的SWITCH-p.htm" target="_blank" title="SWITCH货源和PDF资料">SWITCH语句,而对于每个命令使用相应的处理函数。下面列出了主要的代码框架:NTSTATUS DispatchDeviceControl (PDEVICE_OBJECT fido,PIRP Irp){NTSTATUS status;PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fido->DeviceExtension;PlO_STACK_LOCATION IrpStack =IoGetCurrentlrpStackLocation(1rp);//取I/O控制命令代码ULONG IoControlCode = IrpStack >Parameters.DeviceloContr01.IoControlCode;switch(IoControlCode){case IOCTL-XXX:…… //处理I/O控制命令代码case IOCTL-XXX:……default:……break;}//完成接收到的IRPIoCompleteRequest(Irp,IO_NO_INCREMENT);……return status;}对于不需要处理的IRP则交由DispatchAny例程处理,将IRP沿着设备栈直接传递下去:NTSTATUS DispatchAny(PDEVICE_OBJECT fido,PIRP Irp){PDEVICE_ EXTENSION pdx=(PDEVICE-EXTENSION)fido->DeviceExtension//使堆栈指针少前进一步。IoSkipCurrentlrpStackLocation(hp);Status=IoCallDriver(pdx->LowerDeviceObject,Irp);……return status;4.4 Unload例程功能在Unload例程中,驱动程序必须释放所有创建的对象和所有分配给驱动程序的资源。5 结 语笔者就采用在Windows提供的USB声卡驱动程序下方插入自己编写的下层过滤器驱动程序实现了对USB声卡输出的数据流的截获并进行语音信号处理,取得了不错的效果,现已投入实际应用。可见过滤器驱动程序作为一类特殊的驱动程序,它可以以较小的代价实现对驱动数据流的截获,修改、增加现有驱动常需的功能,具有很强的实用性。
类别:驱动 | 添加到搜藏 | 浏览(254) | 评论 (0) 上一篇:VMware虚拟机中如何安装VMWare-T... 下一篇:今天离婚,你得抱我出门 相关文章: �6�1Windows文件系统的过滤器驱动程... 最近读者: 登录后,您就出现在这里。 蝶舞360°jacky85chan 网友评论:

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

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

Ⅲ windows防火墙驱动和过滤模块之间的关系

这里说的驱动应该是防火墙的“驱动过滤模块”,因为该模块是在系统回内核里实现的,例如IMD中间答层驱动过滤。
而防火墙的过滤模块不一定是在内核里实现的,例如winsock 2 SPI过滤技术中的过滤模块属于用户层。
相对而言,驱动防火墙的安全性更高。

Ⅳ 什么是过滤驱动

过滤驱动就是挂载在其他驱动上,对某设备的irp进行拦截过滤作用,可以对设备专进行功能属扩展,或是数据加密等的驱动程序。

比如:

1. 可以对写入硬盘的数据做加密,然后读取的时候解密,这样对于用户来说,根本不知道有加密解密的过程,然后存在硬盘上的数据是加密的。

2. 可以对已有驱动做一些扩展,或者改变已有驱动的功能。比如已有驱动一次只能写1024字节的数据,那么过滤驱动可以扩展到任何长度,然后分段调用已有驱动就是了。



过滤驱动可以在功能型驱动的上面,称之为上层过滤驱动,或者高层,反正就这个意思。过滤驱动在功能型驱动下面,称之为下层过滤驱动。看示意图:

Ⅳ USB过滤驱动开发

《USB Design By Example》(http://www.usb-by-example.com)的作者John Hyde实现了一个USB键盘过滤驱动程序,即给此程序增内加了一个“拦截(Intercept)”功能容来处理USB键盘的Report以实现特定的功能:当驱动程序在IRP_MJ_INTERNAL_DEVICE_CONTROL设置的完成例程从USB设备拦截到一个Get_Report_Descriptor时,拦截程序将此Descriptor中的USAGE值从“Keyboard”改为“UserDefined”,再返回给系统。

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

Ⅶ 过滤器有哪些原理和作用

要了解过滤器的原理和作用,先要了解过滤器的大概分类,因为不同种类的过滤器作用和工作原理是有差别的。常见的过滤器种类有:保安过滤器,不锈钢袋式过滤器,多介质过滤器等。工作原理和作用如下:
1.保安过滤器的工作原理
保安过滤器工作原理是待过滤液体由滤器进口压入,经滤芯自外向里透过滤层而被过滤成清澄液体,然后经出口排出。在压力的作用下,使原液通过滤材,滤渣留在滤材上,滤液透过滤材流出。水中残存的微量悬浮颗粒、胶体、微生物等,被截留或吸附在滤芯表面和孔隙中。
作用:去除水中杂质、沉淀物和悬浮物、细菌,从而达到过滤的目的
2.不锈钢袋式过滤器的工作原理
使用袋滤器过滤液体时,液体从过滤容器侧面或者下面进液口进入,由被网篮支撑的滤袋上方冲入滤袋中,滤袋因液体的冲击和均匀的压力面展开,使得液体物料在整个过滤袋内表面得到均匀分布,透过滤袋的液体沿着金属支承网篮壁,由过滤器底部出液口排出。
作用:高效截留滤出颗粒杂质在过滤袋内,完成过滤过程。
3.多介质过滤器的工作原理
常用的多介质过滤器有活性炭过滤器,其工作原理是:活性炭在其颗粒表面形成一层平衡的表面浓度,其颗粒的大小对吸附能力也有影响。活性炭颗粒越小,过滤面积就越大。颗粒状的活性炭因颗粒成形不易流动,水中有机物等杂质在活性炭过滤层中也不易阻塞,其吸附能力强,携带更换方便。活性炭的吸附能力和与水接触的时间成正比,接触时间越长,过滤后的水质越佳。
作用:吸附水中有机物等杂质。

Ⅷ 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 问题的解决方法。

Ⅸ 什么是过滤器,它的作用是什么

过滤器(filter)是输送介质管道上不可缺少的一种装置,通常安装在减压阀、泄压阀、定水位阀 ,方工过滤器其它设备的进口端设备。过滤器有一定规格滤网的滤筒后,其杂质被阻挡,当需要清洗时,只要将可拆卸的滤筒取出,处理后重新装入即可,因此,使用维护极为方便。 过滤器的工作原理是: 过滤器待处理的水由入水口进入机体, 水中的杂质沉积在不锈钢滤网上,由此产生压差。通过压差开关监测进出水口压差变化,当压差达到设定值时,电控器给水力控制阀,驱动电机信号。设备安装后,由技术人员进行调试,设定过滤时间和清洗转换时间,待处理的水由入水口进入机体,过滤器开始正常工作,当达到预设清洗时间时,电控器给水力控制阀、驱动电机信号,引发下列动作:电动机带动刷子旋转,对滤芯进行清洗,同时控制阀打开进行排污,整个清洗过程只需持续数十秒钟,当清洗结束时,关闭控制阀,电机停止转动,系统恢复至其初始状态,开始进入下一个过滤工序。过滤器的壳体内部主要由粗滤网、细滤网、吸污管,不锈钢刷或不锈钢吸嘴、密封圈、防腐涂层、转动轴等组成。 用过滤介质把容器分隔为上、下腔即构成简单的过滤器。悬浮液加入上腔,在压力作用下通过过滤介质进入下腔成为滤液,固体颗粒被截留在过滤介质表面形成滤渣(或称滤饼)。过滤过程中过滤介质表面积存的滤渣层逐渐加厚,液体通过滤渣层的阻力随之增高,过滤速度减小。当滤室充满滤渣或过滤速度太小时,停止过滤,清除滤渣,使过滤介质再生,以完成一次过滤循环。 液体通过滤渣层和过滤介质必须克服阻力,因此在过滤介质的两侧必须有压力差,这是实现过滤的推动力。增大压力差可以加速过滤,但受压后变形的颗粒在大压力差时易堵塞过滤介质孔隙,过滤反而减慢。 悬浮液过滤有滤渣层过滤、深层过滤和筛滤 3种方式。 ①滤渣层过滤:过滤初期过滤介质只能截留大的固体颗粒,小颗粒随滤液穿过过滤介质。在形成初始滤渣层后,滤渣层对过滤起主要作用,这时大、小颗粒均被截留,例如板框压滤机的过滤。 ②深层过滤:过滤介质较厚,悬浮液中含固体颗粒较少,且颗粒小于过滤介质的孔道。过滤时,颗粒进入后被吸附在孔道内,例如多孔塑料管过滤器、砂滤器的过滤。 ③筛滤:过滤截留的固体颗粒都大于过滤介质的孔隙,过滤介质内部不吸附固体颗粒,例如转筒式过滤筛滤去污水中的粗粒杂质。在实际的过滤过程中,三种方式常常是同时或相继出现。

Ⅹ 过滤分为哪几种类型

过滤按功能分类,可以分为三种类型,具体如下:

1、刷式

刷式过滤器种类有:全自动不锈钢刷式过滤器,手摇不锈钢刷式过滤器。其主要作用就是除掉水里的悬浮物,降低水里的悬浮物浓度,颗粒物,降低浊度,净化水质,减少系统污垢、菌藻、锈蚀,净化水质等。

2、全自动

全自动是过滤行业广泛应用的一套设备,传统过滤产品的纳污量小、易受污物堵塞、过滤部分需拆卸清洗且无法监控过滤器状态等众多缺点克服,具有对原水进行过滤并自动对滤芯进行自动清洗排污的功能。

3、自清洗

它是一种利用滤网直接拦截水中的杂质,去除水体悬浮物、颗粒物,降低浊度,净化水质,减少系统污垢、菌藻、锈蚀等产生,以净化水质及保护系统其他设备正常工作的精密设备。

主要组件有:电机、电控箱、控制管路、主管组件、滤芯组件、316L不锈钢刷、框架组件、传动轴、进出口连接法兰等。

(10)驱动设备过滤和类过滤扩展阅读:

过滤常用介质

织物是最为常用的过滤介质,工业上称为滤布或滤网。而这其中最为常用的尤属不锈钢滤布或不锈钢滤网等过滤制品。不锈钢丝机织成各种规格网(布),具有良好的耐酸、耐碱、耐高温,抗拉力强和耐磨性强等性能。

1、不锈钢网丝材质:SUS304, SUS304L, SUS316, SUS316L最为常用,SUS201,SUS202,SUS302,SUS430亦可。

2、不锈钢丝编织方式:平纹编织、斜纹编织、席形编织、竹花编织、反差编织、五综编织。其中平纹不锈钢网是最为常见的编织方法,主要特点是经向和纬向丝径的密度相同。

性能:具有过滤性能稳定、精细、耐高温氧化、耐腐蚀性能好,比普通过滤材料经久耐用,光洁度高等。气体、液体、固体等不同介质对过滤网的耐酸碱耐候性要求不同。

用途:用于航天、石油、化工、化纤、橡胶、车胎制造、冶金、医药、食品等行业等行业。

阅读全文

与驱动设备过滤和类过滤相关的资料

热点内容
迷你世界触发器怎么做可以喝水的饮水机 浏览:333
美的净水器按复位键为什么没有反应 浏览:351
黑人英语课作弊在线播放 浏览:742
男男小电影资源 浏览:558
李采潭第一部 浏览:620
洗浴区大理石除垢 浏览:470
丁冬和浩哥的电影叫什么 浏览:546
泰国影片《永恒2010》在线观看下载 浏览:515
电影院怎么买票看电影 浏览:605
带肉的电影 浏览:765
台湾全漏电影 浏览:118
污水中的浓硫酸怎么去除 浏览:908
钾型阳离子交换树脂 浏览:425
醋里面用蒸馏剂 浏览:715
烧烤车净化器不净化了怎么办 浏览:776
防水除尘滤芯怎么做 浏览:233
长耳朵外星人电影叫什么 浏览:786
女主是妓女,男主是农村小伙 电影 浏览:44
净水机老是出现缺水是怎么回事 浏览:422
男主囚禁女主脚链手链的小说 浏览:303