欢迎来到天天文库
浏览记录
ID:15711103
大小:48.50 KB
页数:13页
时间:2018-08-05
《微过滤器驱动开发指南 之四》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、微过滤器驱动开发指南之四微过滤器驱动开发指南之四10.与用户态的通信10.1过滤器通信端口对象为了实现安全的和支持多种不同类型通信方法,一个新的对象被引入:微过滤器通信端口(以下简称通信端口或者端口)。专门设计用来给核心态-用户态通信或者反过来。核心-核心通信现在不在支持。一个端口是一个有名字的NT对象。而且有一个安全的描述符号。过滤管理器生成了一个新的对象类型,FilterConnectionPort来实现这个。过滤管理器在它的DriverEntry中生成这个新的对象类型,赶在了任何微过滤器加载之前。只有核心模式的驱动才能生成一个通信端口,使用以下的调用:NTSTATUSFltCreat
2、eCommunicationPort(INPFLT_FILTERFilter,OUTPHANDLEPortHandle,INPOBJECT_ATTRIBUTESObjectAttributes,INPVOIDServerPortCookieOPTIONAL,INPFLT_CONNECT_NOTIFYConnectNotifyCallback,INPFLT_DISCONNECT_NOTIFYDisconnectNotifyCallback,INPFLT_MESSAGE_NOTIFYMessageNotifyCallback,INULONGMaxConnections);Filter是微过滤器
3、的过滤器句柄。成功生成之后,端口的句柄在PortHandle参数中返回。和其他的NT对象一样,ObjectAttributes参数定义了OBJECT_ATTRIBUTES结构来初始化要生成的端口对象的名字,对象属性和安全描述符等。请注意属性中OBJ_KERNEL_HANDLE标记必须设置。因为通信端口只能是核心对象。ServerPortCookie是一个上下文。微过滤器可以通过这个和端口联系在一起。这个上下文对过滤管理器是不透明的。所有的连接,中断通知,都会同过这个上下文才能传递给微过滤器。有些过滤器可能要生成一组通信端口,又想功用一个同志例程。那么可以通过这个上下文中保存的数据进行区分。
4、调用者还可以注册一些回调函数:ConnectNotifyCallback():当一个用户态进程尝试打开一个端口的时候,这个例程被调用。过滤器可以选择把这个请求失败掉。通知例程回手到一个关于此连接的句柄。每一个连接有唯一的一个句柄。ServerPortCookie也会传入。微过可以填写ConnectionCookie为一个上下文。这个上下文会传到所有的用户态传来的消息以及连接中断例程中。DisconnectNotifyCallback():当一个端口被用户态关闭的时候会调用这个回调。(也就是打开计数到0的时候)。MessageNotifyCallback():任何时候手到一个消息都会调用这个
5、。MaxConnections指出了这个通信端口上允许的最大向外连接数。这没有默认值,必须设置得大于0。并不能保证所有的对象名会生成在根名字空间。有可能过滤管理器把它们映射在FileSystemFilters目录下。不过即使如此,对微过滤器和用户态应用程序来说,这是透明的。当引用了一个通信断口的名字,那么所有的足见都应该使用同样的名字。例子SacnnerMinifiter中展示了这是怎么做的。对应于新的对象类型,新的访问方式也被引入了。有新的访问方式如下:FLT_PORT_CONNECTFLT_PORT_ALL_ACCESS这是一些访问类型。调用者可以设置这些来给使用者权限。用于构造安
6、全描述符的时候,使用InitializeObjectAttributes()。设置了FLT_PORT_CONNECT,那么我们的应用程序足可以连接这个端口并发送和接受消息。微过滤器生成一个端口之后,端口就会开始侦听可能的连接。直到你使用ZwClose()将它关闭为止。10.2从用户态连接到通信端口微过滤器的通信端口模型和旧模型的过滤器一样,是不对称的。核心态端生成,用户态端连接。有一个接口用来给用户态应用打开一个端口。当端口建立,ConnectNotify()例程被调用来通知微过滤器。用户态下连接一个端口的编程接口原型如下:HRESULTFilterConnectCommunication
7、Port(INLPWSTRlpPortName,INDWORDdwOptions,INLPVOIDlpContext,INWORDwSizeOfContext,INLPSECURITY_ATTRIBUTESlpSecurityAttributes,OUTHANDLE*hPort);lpPortName是一个宽字符格式的字符串,指出要连接的端口的名字。这个名字应该和微过滤器生成这个端口的时候一样。名字可以以””开头表示在
此文档下载收益归作者所有