Reactos 第 6 章 进程间通信 — 6.8 本地过程调用(LPC)与 6.9 视窗报文(Message)

发布时间:2026/6/13 7:52:35

Reactos 第 6 章 进程间通信 — 6.8 本地过程调用(LPC)与 6.9 视窗报文(Message) 第 6 章 进程间通信 — 6.8 本地过程调用LPC与 6.9 视窗报文Message本章深入剖析 Windows/ReactOS 中两种核心进程间通信机制LPC本地过程调用和视窗报文系统。概述进程间通信IPC是现代操作系统的核心功能Windows 提供了多种 IPC 机制来满足不同场景的需求。本章重点介绍两种特殊的IPC机制LPC 和视窗报文的本质区别是什么LPC 是内核级的高性能请求-响应机制专为系统组件间的高效通信设计视窗报文系统则是用户态GUI应用的事件驱动核心实现窗口间的消息传递。两者服务于不同层次但共同构成了Windows的通信基础设施。想象一个企业办公场景LPC部门之间的内部电话系统快速、可靠的请求-响应交互视窗报文办公室的公告板和内部邮件系统异步消息传递和事件通知CSRSS与应用程序通信员工通过内部电话向IT部门CSRSS请求服务窗口消息循环员工查看公告板消息队列处理日常事务。本章内容概览6.8.0 LPC框架图LPC机制完整架构6.8.1 LPC概述定义、特点和应用场景6.8.2 LPC端口对象端口类型和结构定义6.8.3 LPC通信流程创建、连接、消息传递6.8.4 LPC安全机制身份验证和模拟6.9.0 视窗报文框架图消息系统架构6.9.1 消息机制概述消息驱动架构6.9.2 消息发送方式同步与异步6.9.3 消息队列与分发队列结构和处理流程6.9.4 消息钩子与广播监控和通知机制设计哲学问答关键设计问题深入解答。学习目标读完本章后读者应当能够理解LPC机制的内核实现原理掌握LPC端口类型和通信流程分析视窗报文系统的消息驱动模型理解SendMessage和PostMessage的区别掌握消息钩子和广播机制区分两种IPC机制的适用场景。涉及的内核子系统子系统职责ntoskrnl/lpcLPC核心实现端口管理、消息传递win32ss/user/ntuser用户态消息处理消息队列、钩子csrssWin32子系统进程LPC服务端ntdllLPC用户态APINtConnectPort等6.8.0 LPC框架图┌──────────────────────────────────────────────────────────────────────────────────────┐ │ LPC 机制完整架构 │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ 用户态 API 层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ ntdll.dll │ │ │ │ ├─► NtCreatePort 创建连接端口 │ │ │ │ ├─► NtCreateWaitablePort 创建可等待端口 │ │ │ │ ├─► NtConnectPort 连接到端口 │ │ │ │ ├─► NtSecureConnectPort 安全连接SID验证 │ │ │ │ ├─► NtRequestPort 发送数据报消息 │ │ │ │ ├─► NtRequestWaitReplyPort 发送请求并等待回复 │ │ │ │ ├─► NtListenPort 监听连接请求 │ │ │ │ ├─► NtAcceptConnectPort 接受连接 │ │ │ │ ├─► NtReplyPort 发送回复消息 │ │ │ │ └─► NtReplyWaitReceivePort 回复并等待下一条消息 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ 内核态实现层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ ntoskrnl/lpc/ │ │ │ │ ├─► create.c: NtCreatePort, NtCreateWaitablePort │ │ │ │ ├─► connect.c: NtConnectPort, NtSecureConnectPort │ │ │ │ ├─► send.c: NtRequestPort, NtRequestWaitReplyPort │ │ │ │ ├─► receive.c: NtListenPort, NtAcceptConnectPort │ │ │ │ ├─► reply.c: NtReplyPort, NtReplyWaitReceivePort │ │ │ │ └─► close.c: LpcExitThread, LpcpDeletePort │ │ │ │ │ │ │ │ 核心数据结构 │ │ │ │ ├─► LPCP_PORT_OBJECT: 端口对象 │ │ │ │ ├─► LPCP_MESSAGE: 消息结构 │ │ │ │ ├─► PORT_MESSAGE: 消息头部 │ │ │ │ └─► PORT_VIEW: Section视图信息 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ CSRSS 端口服务层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ csrss.exe │ │ │ │ ├─► \Windows\ApiPort Win32 API请求处理 │ │ │ │ ├─► \Windows\SbApiPort 会话管理器接口 │ │ │ │ ├─► \Windows\SmApiPort 子系统管理接口 │ │ │ │ └─► \Console\LpcPort 控制台I/O接口 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ LPC 通信模型 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ 客户端进程 内核层 服务端进程 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ClientPort │─────────────►│ │◄─────────────│ConnPort │ │ │ │ │ │(客户端端口)│ NtConnectPort│ │NtListenPort │(连接端口)│ │ │ │ │ └────┬─────┘ │ │ └────┬─────┘ │ │ │ │ │ │ LPC子系统│ │ │ │ │ │ │ NtRequestWaitReplyPort │ NtAcceptConnectPort │ │ │ │ │ │ │ │ │ │ │ │ ▼ │ │ ▼ │ │ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ │ │CommPort │◄─────────────│ │─────────────►│CommPort │ │ │ │ │ │(通信端口)│ NtReplyPort │ │NtRequestPort │(通信端口)│ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────────────────────────┘6.8.1 LPC概述6.8.1.1 LPC定义与核心特点LPCLocal Procedure Call本地过程调用是Windows内核提供的高性能进程间通信机制核心特点特点说明内核级实现直接在内核中传递消息无需文件系统介入请求-响应模型同步通信客户端阻塞等待服务器响应消息大小限制256字节32位/ 512字节64位Section共享支持大数据传输的内存映射机制安全机制完善支持SID验证和客户端身份模拟仅限本地不支持跨机器通信6.8.1.2 LPC与其他IPC机制对比特性LPC命名管道共享内存性能最高中等最高消息大小有限无限制无限制同步性同步请求-响应流模式需额外同步安全支持完整部分需额外处理通信范围本地本地/远程本地典型应用CSRSS通信服务通信大数据共享6.8.1.3 LPC在Windows子系统中的应用LPC是Win32子系统通信的核心CSRSS LPC端口架构 ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 应用程序 ──► NtConnectPort ──► \Windows\ApiPort ──► CSRSS │ │ │ │ │ │ │ CreateWindow请求 │ 创建窗口 │ │ │◄───────────── 窗口句柄 ────────────│ │ │ │ │ 应用程序 ──► NtConnectPort ──► \Console\LpcPort ──► CSRSS │ │ │ │ │ │ │ 控制台输入输出请求 │ 处理I/O │ │ │◄───────────── 结果 ──────────────│ │ │ │ └─────────────────────────────────────────────────────────────────────┘6.8.2 LPC端口对象6.8.2.1 端口类型LPC支持四种端口类型端口类型创建方式用途连接端口NtCreatePort服务端监听端口接受连接请求客户端端口NtConnectPort客户端连接端口发起连接通信端口自动创建连接建立后用于实际通信可等待端口NtCreateWaitablePort可作为同步事件使用6.8.2.2 LPCP_PORT_OBJECT结构typedefstruct_LPCP_PORT_OBJECT{struct_LPCP_PORT_OBJECT*ConnectionPort;// 连接端口引用struct_LPCP_PORT_OBJECT*ConnectedPort;// 已连接端口LPCP_PORT_QUEUE MsgQueue;// 消息队列CLIENT_ID Creator;// 创建者标识PVOID ClientSectionBase;// 客户端Section基址PVOID ServerSectionBase;// 服务器Section基址PVOID PortContext;// 端口上下文SECURITY_QUALITY_OF_SERVICE SecurityQos;// 安全服务质量ULONG MaxMessageLength;// 最大消息长度ULONG Flags;// 端口标志KEVENT WaitEvent;// 等待事件}LPCP_PORT_OBJECT,*PLPCP_PORT_OBJECT;源码位置[sdk/include/ndk/lpctypes.h#L209](file:///d:/reactos/sdk/include/ndk/lpctypes.h#L209)6.8.2.3 PORT_MESSAGE消息头部typedefstruct_PORT_MESSAGE{USHORT DataLength;// 消息数据长度USHORT TotalLength;// 总长度含头部union{CLIENT_ID ClientId;// 客户端标识ULONG_PTR ClientUniqueId;// 客户端唯一标识};ULONG MessageId;// 消息IDULONG MessageType;// 消息类型}PORT_MESSAGE,*PPORT_MESSAGE;消息类型枚举LPC_REQUEST客户端请求LPC_REPLY服务器回复LPC_DATAGRAM数据报LPC_CONNECTION_REQUEST连接请求6.8.3 LPC通信流程6.8.3.1 端口创建与连接服务端创建连接端口NTSTATUS NTAPINtCreatePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN ULONG MaxMessageLength,IN ULONG MaxConnectionInfoLength){// 验证参数if(MaxMessageLengthLPC_MAX_MESSAGE_LENGTH)returnSTATUS_INVALID_PARAMETER;// 创建端口对象StatusObCreateObject(ExGetPreviousMode(),LpcPortObjectType,ObjectAttributes,PreviousMode,NULL,sizeof(LPCP_PORT_OBJECT),0,0,(PVOID*)Port);// 初始化端口队列InitializeListHead(Port-MsgQueue.ListHead);// 设置端口标志为连接端口Port-FlagsLPCP_CONNECTION_PORT;returnSTATUS_SUCCESS;}源码位置[ntoskrnl/lpc/create.c#L222](file:///d:/reactos/ntoskrnl/lpc/create.c#L222)客户端连接到端口NTSTATUS NTAPINtConnectPort(OUT PHANDLE PortHandle,IN PUNICODE_STRING PortName,IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,IN OUT PLPC_SECTION_WRITE_DATA SectionData,OUT PLPC_SECTION_READ_DATA*ReadData,OUT PULONG ConnectionInfoLength,IN PVOID ConnectionInfo,IN ULONG ConnectionInfoLength){// 解析端口名称// 查找连接端口对象// 创建客户端端口// 发送连接请求// 等待服务器接受// 返回Section信息如果有}源码位置[ntoskrnl/lpc/connect.c#L777](file:///d:/reactos/ntoskrnl/lpc/connect.c#L777)6.8.3.2 消息发送与接收客户端发送请求请求-响应模式NTSTATUS NTAPINtRequestWaitReplyPort(IN HANDLE PortHandle,IN PPORT_MESSAGE RequestMessage,OUT PPORT_MESSAGE ReplyMessage){// 验证消息长度// 将消息放入目标端口队列// 阻塞等待回复// 返回回复消息}源码位置[ntoskrnl/lpc/send.c#L470](file:///d:/reactos/ntoskrnl/lpc/send.c#L470)服务端接收并回复NTSTATUS NTAPINtReplyWaitReceivePort(IN HANDLE PortHandle,OUT PULONG MessageType,OUT PPORT_MESSAGE ReplyMessage,OUT PPORT_MESSAGE RequestMessage){// 发送回复消息// 等待下一条请求// 返回请求消息}源码位置[ntoskrnl/lpc/reply.c#L743](file:///d:/reactos/ntoskrnl/lpc/reply.c#L743)6.8.3.3 Section共享机制PORT_VIEW结构typedefstruct_PORT_VIEW{PVOID SectionBase;// Section基址ULONG SectionSize;// Section大小ULONG ViewSize;// 视图大小ULONG ViewOffset;// 视图偏移}PORT_VIEW,*PPORT_VIEW;Section共享流程服务端创建Section对象连接时传递PORT_VIEW信息客户端映射Section到自己的地址空间双方通过共享内存传输大数据。6.8.4 LPC安全机制6.8.4.1 安全上下文传递LPC支持两种安全跟踪模式模式说明静态安全跟踪连接时建立安全上下文后续通信复用动态安全跟踪每次消息发送时重新验证6.8.4.2 客户端身份模拟NTSTATUS NTAPINtImpersonateClientOfPort(IN HANDLE PortHandle){// 获取端口的安全上下文// 将当前线程的令牌替换为客户端令牌// 后续操作以客户端身份执行}应用场景服务器需要以客户端身份访问资源时使用。6.9.0 视窗报文框架图┌──────────────────────────────────────────────────────────────────────────────────────┐ │ 视窗报文系统完整架构 │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ 用户态 API 层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ user32.dll │ │ │ │ ├─► SendMessage 同步发送消息 │ │ │ │ ├─► PostMessage 异步投递消息 │ │ │ │ ├─► SendNotifyMessage 同步发送不等待回复 │ │ │ │ ├─► SendMessageTimeout 同步发送带超时 │ │ │ │ ├─► GetMessage 获取消息阻塞 │ │ │ │ ├─► PeekMessage 查看消息非阻塞 │ │ │ │ ├─► DispatchMessage 分发消息到窗口过程 │ │ │ │ ├─► SetWindowsHookEx 设置消息钩子 │ │ │ │ └─► BroadcastSystemMessage 广播消息 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ 内核态实现层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ win32ss/user/ntuser/ │ │ │ │ ├─► message.c: NtUserSendMessage, NtUserPostMessage │ │ │ │ ├─► msgqueue.c: 消息队列管理 │ │ │ │ ├─► hook.c: 消息钩子实现 │ │ │ │ └─► winproc.c: 窗口过程调用 │ │ │ │ │ │ │ │ 核心数据结构 │ │ │ │ ├─► THREADINFO: 线程信息含消息队列 │ │ │ │ ├─► MSG: 消息结构 │ │ │ │ └─► HOOK: 钩子结构 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ 消息队列层 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ SentMessagesListHead 发送消息队列同步 │ │ │ │ PostedMessagesListHead 投递消息队列异步 │ │ │ │ HardwareMessagesListHead 硬件输入队列 │ │ │ │ NotifyMessagesListHead 通知消息队列 │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ 消息处理流程 │ │ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ 发送方线程 内核层 接收方线程 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │SendMessage│─────────────►│ │─────────────►│窗口过程 │ │ │ │ │ │(同步阻塞) │ │ 消息子系统│ │(直接调用) │ │ │ │ │ │◄─────────│ │ │ │ │ │ │ │ │ │ 等待回复 │ │ │ │◄─────────│ │ │ │ │ └──────────┘ └──────────┘ │ 返回结果 │ │ │ │ │ └──────────┘ │ │ │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │PostMessage│─────────────►│ 消息队列 │◄─────────────│GetMessage│ │ │ │ │ │(异步返回) │ │ │ │(阻塞等待) │ │ │ │ │ └──────────┘ │ │ └────┬─────┘ │ │ │ │ │ │ │ │ │ │ │ └──────────┘ ▼ │ │ │ │ ┌──────────┐ │ │ │ │ │DispatchMsg│ │ │ │ │ │(分发消息) │ │ │ │ │ └──────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────────────────────────┘6.9.1 消息机制概述6.9.1.1 消息驱动架构Windows采用事件驱动模型所有用户交互通过消息传递消息驱动架构 ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 用户操作 ──► 系统生成消息 ──► 消息队列 ──► 消息循环 ──► 窗口过程 │ │ │ │ │ │ │ ▼ │ │ │ 处理消息并响应 │ │ │◄───────────────────────────────────│ │ │ │ └─────────────────────────────────────────────────────────────────────┘6.9.1.2 消息类型分类类型示例说明窗口消息WM_CREATE, WM_DESTROY, WM_PAINT窗口生命周期和绘制输入消息WM_KEYDOWN, WM_MOUSEMOVE用户输入系统消息WM_TIMER, WM_QUIT系统通知用户消息WM_USER1, WM_APP100应用自定义消息6.9.1.3 MSG结构typedefstructtagMSG{HWND hwnd;// 消息目标窗口UINT message;// 消息标识符WPARAM wParam;// 消息参数1LPARAM lParam;// 消息参数2DWORD time;// 消息时间戳POINT pt;// 消息发生时的鼠标位置}MSG,*PMSG;6.9.2 消息发送方式6.9.2.1 SendMessage同步发送LRESULT WINAPISendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam){// 验证参数// 检查是否跨线程/进程// 直接调用目标窗口过程或排队等待// 返回处理结果}源码位置[win32ss/user/ntuser/message.c#L1707](file:///d:/reactos/win32ss/user/ntuser/message.c#L1707)co_IntSendMessageTimeout特点同步阻塞等待目标窗口过程返回。6.9.2.2 PostMessage异步投递BOOL WINAPIPostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam){// 验证参数// 将消息放入目标线程队列// 立即返回}源码位置[win32ss/user/ntuser/message.c#L2275](file:///d:/reactos/win32ss/user/ntuser/message.c#L2275)NtUserPostMessage特点异步非阻塞消息放入队列后立即返回。6.9.2.3 发送方式对比特性SendMessagePostMessage同步性同步阻塞异步非阻塞返回值窗口过程返回值投递是否成功消息队列不使用队列使用投递队列跨进程支持需特殊处理支持需特殊处理优先级高立即处理低排队处理6.9.3 消息队列与分发6.9.3.1 线程消息队列结构typedefstruct_THREADINFO{// 消息队列LIST_ENTRY SentMessagesListHead;// 发送消息队列LIST_ENTRY PostedMessagesListHead;// 投递消息队列LIST_ENTRY HardwareMessagesListHead;// 硬件输入队列// 等待标志ULONG fsWakeBits;// 当前等待标志ULONG fsWakeBitsMask;// 等待掩码// 消息事件KEVENT MessageEvent;// 消息到达事件// 消息钩子PHOOK aphkStart[WH_MAXHOOK];// 钩子数组}THREADINFO,*PTHREADINFO;6.9.3.2 GetMessage处理流程源码位置[win32ss/user/ntuser/message.c#L2343](file:///d:/reactos/win32ss/user/ntuser/message.c#L2343)NtUserGetMessageGetMessage处理顺序 1. 检查QS_SENDMESSAGE → 处理发送消息队列 2. 检查QS_POSTMESSAGE → 处理投递消息队列 3. 检查QS_INPUT → 处理硬件输入队列 4. 检查QS_PAINT → 生成WM_PAINT消息 5. 检查QS_TIMER → 生成WM_TIMER消息 6. 无消息 → 等待MessageEvent6.9.3.3 标准消息循环MSG msg;while(GetMessage(msg,NULL,0,0)){TranslateMessage(msg);// 转换键盘消息DispatchMessage(msg);// 分发到窗口过程}源码位置[win32ss/user/ntuser/message.c#L890](file:///d:/reactos/win32ss/user/ntuser/message.c#L890)IntDispatchMessage6.9.4 消息钩子与广播6.9.4.1 消息钩子类型钩子类型触发时机用途WH_CALLWNDPROC窗口过程调用前监控SendMessageWH_CALLWNDPROCRET窗口过程返回后监控消息返回值WH_GETMESSAGEGetMessage返回后监控投递消息WH_KEYBOARD键盘消息到达时键盘钩子WH_MOUSE鼠标消息到达时鼠标钩子6.9.4.2 钩子处理流程源码位置[win32ss/user/ntuser/hook.c#L1102](file:///d:/reactos/win32ss/user/ntuser/hook.c#L1102)co_HOOK_CallHooks消息钩子链 消息产生 ──► Hook1 ──► Hook2 ──► ... ──► 窗口过程 │ │ CallNextHookEx CallNextHookEx6.9.4.3 广播消息BroadcastSystemMessage向指定类型接收者发送消息HWND_BROADCAST向所有顶层窗口发送消息内核实现[win32ss/user/ntuser/message.c#L2654](file:///d:/reactos/win32ss/user/ntuser/message.c#L2654)// 发送系统设置变更通知SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)LEnvironment);设计哲学问答Q1LPC为什么限制消息大小为256/512字节ALPC设计目标是高性能的请求-响应通信小消息可以使用Lookaside列表快速分配避免复杂的内存管理保证快速的消息传递。大数据传输通过Section共享机制实现。Q2为什么SendMessage需要同步阻塞ASendMessage用于需要立即获取结果的场景如获取窗口文本、查询状态等。同步阻塞保证调用者能立即获得返回值。Q3LPC如何保证安全性ALPC通过以下机制保证安全SID验证NtSecureConnectPort安全上下文传递客户端身份模拟静态/动态安全跟踪。Q4消息队列为什么分为发送队列和投递队列A发送队列用于同步消息SendMessage需要立即处理投递队列用于异步消息PostMessage按顺序处理。分离设计提高了消息处理效率。Q5LPC和视窗报文的适用场景有何不同ALPC适用于系统级组件间的高性能请求-响应通信视窗报文适用于GUI应用的事件驱动交互。LPC是内核级机制视窗报文是用户态机制。源码索引LPC核心源码文件路径行号说明sdk/include/ndk/lpctypes.h121PORT_MESSAGE结构定义sdk/include/ndk/lpctypes.h209LPCP_PORT_OBJECT结构定义sdk/include/ndk/lpctypes.h281PORT_VIEW结构定义ntoskrnl/include/internal/lpc.h100LPC内部函数声明ntoskrnl/include/internal/lpc_x.h99LpcpAllocateFromPortZone等内联函数ntoskrnl/lpc/create.c222NtCreatePort实现ntoskrnl/lpc/connect.c80NtSecureConnectPort实现ntoskrnl/lpc/connect.c777NtConnectPort实现ntoskrnl/lpc/send.c440NtRequestPort实现ntoskrnl/lpc/send.c470NtRequestWaitReplyPort实现ntoskrnl/lpc/reply.c190NtReplyPort实现ntoskrnl/lpc/reply.c360NtReplyWaitReceivePortEx实现ntoskrnl/lpc/reply.c743NtReplyWaitReceivePort实现ntoskrnl/lpc/listen.c22NtListenPort实现ntoskrnl/lpc/complete.c40NtAcceptConnectPort实现ntoskrnl/lpc/close.c25LpcExitThread、LpcpDeletePort视窗报文核心源码文件路径行号说明win32ss/user/ntuser/message.c890IntDispatchMessage分发消息win32ss/user/ntuser/message.c1285消息指针处理逻辑win32ss/user/ntuser/message.c1376UserPostMessage投递消息win32ss/user/ntuser/message.c1510SendMessageTimeoutSinglewin32ss/user/ntuser/message.c1707co_IntSendMessageTimeoutwin32ss/user/ntuser/message.c2275NtUserPostMessage内核调用win32ss/user/ntuser/message.c2343NtUserGetMessage获取消息win32ss/user/ntuser/message.c2464NtUserDispatchMessagewin32ss/user/ntuser/msgqueue.c731MsqCreateMessage创建消息win32ss/user/ntuser/msgqueue.c1355消息入队处理win32ss/user/ntuser/msgqueue.c2396MsqCreateMessageQueuewin32ss/user/ntuser/hook.c1102co_HOOK_CallHooks调用钩子win32ss/user/ntuser/hook.c1429NtUserSetWindowsHookEx设置钩子总结LPC核心要点内核级IPC高性能本地通信直接在内核中传递消息请求-响应模型同步通信客户端阻塞等待服务器响应端口对象四种端口类型支持连接、通信和同步Section共享支持大数据传输避免消息复制开销安全机制支持SID验证和客户端身份模拟典型应用CSRSS与应用程序通信。视窗报文核心要点消息驱动Windows GUI的核心事件处理机制同步与异步SendMessage同步PostMessage异步消息队列发送队列、投递队列、输入队列分离钩子机制允许监控和拦截消息广播消息支持系统级通知。两种IPC机制对比特性LPC视窗报文层次内核态用户态/内核态通信模式请求-响应同步/异步消息传递数据大小有限256/512字节消息参数限制大数据支持Section共享WM_COPYDATA典型应用CSRSS通信GUI消息循环性能极高中高文档完成本章详细介绍了Windows/ReactOS中的两种核心IPC机制LPC和视窗报文系统。LPC作为内核级IPC机制为系统组件提供高性能通信视窗报文系统则是GUI应用的核心实现了窗口间的消息传递。理解这两种机制对于深入理解Windows操作系统的工作原理至关重要。

相关新闻