用LPC实现进程通信

上传人:Sc****h 文档编号:145910252 上传时间:2022-08-30 格式:DOC 页数:9 大小:177.50KB
收藏 版权申诉 举报 下载
用LPC实现进程通信_第1页
第1页 / 共9页
用LPC实现进程通信_第2页
第2页 / 共9页
用LPC实现进程通信_第3页
第3页 / 共9页
资源描述:

《用LPC实现进程通信》由会员分享,可在线阅读,更多相关《用LPC实现进程通信(9页珍藏版)》请在装配图网上搜索。

1、用 LPC 实现进程通信一 . LPC 的概念LPC 即是 ”本地过程调用 (Local Procedure Call) ”。二 . LPC 的原理端口是一种面向连接的通信机制,通信的双方需要先建立起“连接”。这种连接一般建立在用户进程之间。在建立了连接的双方之间有几种交换报文的方法:不带数据的纯报文。不大于 256 字节的短报文。如果是大于256 字节的长报文,就要在双方之间建立两个共享内存区(Section) 。双方通过共享内存区交换数据,但通过报文进行协调和同步。Tips:大块数据之所以要通过共享内存区交换,一来是因为这样就为用于Port 机制的缓冲区设置了一个上限,便于内存管理。而更重

2、要的是提高了效率,因为否则便要在发送端把大块数据搬入内核空间,又在接收端把大块数据搬到用户空间。三. 典型的 LPC 建立连接和通信过程如下:符号说明:S 提供服务方(服务端 )C 请求服务方(客户端 )S1、服务线程首先通过NtCreatePort()创建一个命名的连接端口、即Port对象 ( 这个对象名应为客户线程所知 ).S2、建立上述连接端口后,服务线程通过NtListenPort() 等待接收来自客户线程的连接请求(服务线程被阻塞 ).C1、客户线程通过NtConnectPort() 创建客户方的无名通信端口,向上述命名的连接端口发出连接请求(客户线程阻塞 )。S3、服务线程收到连接

3、请求(被唤醒 ) 后,如果同意连接则通过NtAcceptConnectPort() 创建服务方无名通信端口、接受连接、并返回该无名通信端口的handle。然后通过NtCompleteConnectPort() 唤醒客户线程。C2、客户线程被唤醒、返回所创建的无名通信端口handle。S4、服务线程另创建一个新线程负责为客户线程提供服务。该线程因企图从上述通信端口接收报文、等待来自客户端的请求而阻塞。因此、新创建的线程是LPC 服务线程,原来的服务线程是端口服务线程。S5、端口服务线程再次调用NtListenPort() ,等待来自其它客户的连接请求。(S2-S5 的循环 )C3、客户线程通过N

4、tRequestWaitReplyPort() 向服务方发送报文,请求得到 LPC 服务,并因等待而被阻塞。S6、LPC服务线程因接收到报文而被唤醒,并根据报文内容提供相应的LPC 服务。S7、LPC 服务线程通过NtReplyPort() 向客户方发送回答报文。客户线程解除阻塞。LPC 服务端LPC 客户端NtCreatePort ()NtListenPort ()服务线程阻塞服务线程被唤醒NtAcceptConnectPort ()NtCompleteConnectPort ()发送连接请求NtConnectPort ()客户线程阻塞唤醒客户线程NtReplyPort ()NtReques

5、tWaitReplyPort ()数据传送NtClose ()NtClose ()LPC 建立连接和通信典型流程图LPC 通信的报文结构定义如下:/ Define header for Port Message/typedef struct _PORT_MESSAGEUSHORT DataLength;/传输的数据的大小 Length of data following the header (bytes)USHORT TotalLength;/传输的数据加 PORT_MESSAGE 的大小 Length of data + sizeof(PORT_MESSAGE)USHORT Type;/传

6、输的消息的类型 Type of the message (See LPC_TYPE enum)USHORT VirtualRangesOffset;/ Offset of array of virtual address rangesCLIENT_ID ClientId;/发送方进程 ID 和线程 ID Client identifier of the message senderULONG MessageId;/报文消息 ID Identifier of the particular message instanceunionULONGCallbackId;/ULONGClientViewS

7、ize;/ 发送方创建的共享区个数 Size, in bytes, of section created by the sender; PORT_MESSAGE, *PPORT_MESSAGE;NOTE:请求连接的一方对于将来要发送多大的数据量应该是心里有数的。如果数据是不大,那就可以作为附加信息随同报文(在同一个缓冲区中 )中一起发送。但是,要是数据是比较大( 报文总长大于256 字节 ),那就要通过共享内存区发送 ,(reason: 1是传输效率低下,2、报文缓冲区的大小也不好静态地安排确定)。因此,在期望发送数据量比较大时要准备好一个共享内存区(Section)用于数据发送。这是要由请求

8、连接的一方、即客户方做好准备,通过调用参数传给NtConnectPort()的。客户方要准备好两个数据结构,就是PORT_VIEW 和 REMOTE_PORT_VIEW ,把有关共享内存区的信息写在前一个数据结构中,再把指向这两个数据结构的指针作为参数传给NtConnectPort()。这两个结构定义如下:/ Define structure for initializing shared memory on the callers side of the port写数据/typedef struct _PORT_VIEW ULONGLength;/ 本结构体的大小Size of this s

9、tructureHANDLE SectionHandle;/ 共享内存区的句柄Handle to section object with/ SECTION_MAP_WRITE and SECTION_MAP_READULONGSectionOffset;/ 共享内存数据的偏移量The offset in the section to map a view for/ the port data area. The offset must be aligned/ with the allocation granularity of the system.ULONGViewSize;/ 要发送的数据

10、大小The size of the view (in bytes)PVOIDViewBase;/ 指向要发送的数据的指针The base address of the view in the creator/PVOIDViewRemoteBase; / The base address of the view in the process / connected to the port. PORT_VIEW, *PPORT_VIEW;/ Define structure for shared memory coming from remote side of the port 读数据/type

11、def struct _REMOTE_PORT_VIEW ULONG Length;/ 本结构体的大小Size of this structureULONG ViewSize;/ 要读取的数据的大小The size of the view (bytes)PVOID ViewBase;/ 指向要读取的数据的指针Base address of the view REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;四 . LPC 主要 API 简介NOTE: 参数说明格式1 参数名2 参数输入、输出指示3 参数类型4 参数描述1.函数原型 :NTSTATUSNTAPINtCre

12、atePort(OUT PHANDLE PortHandle,INPOBJECT_ATTRIBUTES ObjectAttributes,INULONG MaxConnectionInfoLength,INULONG MaxMessageLength,INULONG MaxPoolUsage);功能描述 :创建一个LPC port对象。LPC port的创建者即是LPC 通信的服务端(服务端 )参数 :PortHandle 输出PHANDLE是一个指针变量,如果函数被成功调用则该变量指向port 对象ObjectAttributes输入POBJECT_ATTRIBUTES指针变量,指向一个描述

13、对象属性的结构。OBJ_KERNEL_HANDLE,OBJ_OPENLINK,OBJ_EXCLUSIVE,OBJ_PERMANENT及 OBJ_INHERIT都不是port 对象的合法属性。MaxConnectionInfoLength输入ULONG表示通过port 发送的最大数据字节数。MaxMessageLength 输入ULONG表示通过port 发送的最大消息字节数。MaxPoolUsage 输入 ULONG 表示用于消息存储的非分页池的最大数量。0 表示使用默认值。ZwCreatePort 将验证 (MaxDataSize = 0x104) 且 (MaxMessageSize Hea

14、der, MessageLength, LPC_NEW_MESSAGE);004016C8movedx,dword ptr ebp-28h004016CBmovax,word ptr ebp-44h004016CFmovword ptr edx+2,ax004016D3movecx,dword ptr ebp-44h004016D6subecx,18h004016D9movedx,dword ptr ebp-28h004016DCmovword ptr edx,cx004016DFmoveax,dword ptr ebp-28h004016E2movword ptr eax+4,offset ClientThread+196h (004016e6)004016E8movecx,dword ptr ebp-28h004016EBmovword ptr ecx+6,offset ClientThread+19Fh (004016ef)全部相关函数简介英文原文LPC 使用的函数简介 .txt

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!