LPC消息数据结构
消息类型 typedef enum _LPC_MSG_TYPE { LPC_NEW_MSG, LPC_REQUEST, LPC_REPLY, LPC_DATAGRAM, LPC_LOST_REPLY, LPC_PORT_CLOSED, LPC_CLIENT_DIED, LPC_EXCEPTION, LPC_DEBUG_EVENT, LPC_ERROR_EVENT, LPC_CONN_REQ, } LPC_MSG_TYPE; 消息结构 struct _PORT_MESSAGE { union { struct { SHORT DataLength; SHORT TotalLength; } s1; ULONG Length; } u1; union { struct { SHORT Type; SHORT DataInfoOffset; } s2; ULONG ZeroInit; } u2; union { struct _CLIENT_ID ClientId; double DoNotUseThisField; }; ULONG MessageId; union { ULONGLONG ClientViewSize; ULONG CallbackId; }; }; 在此结构中,仅使用前三个字段。 ClientId字段指示已处理呼叫者
并穿线; 现在,该信息由内核函数填充。 这个领域负责
报告了欺骗错误。 当用户发送正常消息时,自定义数据将存储在
在DataSize字段中指定的LPC_MESSAGE结构和数据大小。 自定义数据取决于服务器
请求格式为套接字上的数据。 TotalSize字段是DataSize和LPC_MESSAGE的总和
Page 4 of 26 2008年6月2日
结构尺寸(0x18)。 MsgType字段通常是LPC_NEW_MSG,LPC_REQUEST或LPC_REPLY。
根据功能,错误的消息类型将得到纠正或返回错误。
kd> dt nt!_LPCP_MESSAGE +0x000 Entry : _LIST_ENTRY +0x000 FreeEntry : _SINGLE_LIST_ENTRY +0x004 Reserved0 : Uint4B +0x008 SenderPort : Ptr32 Void +0x00c RepliedToThread : Ptr32 _ETHREAD +0x010 PortContext : Ptr32 Void +0x018 Request : _PORT_MESSAGE
Request.MessageId
从全局的LpcpNextMessageId的值生成。 用于唯一地标识一条消息。
SenderPort
指向客户端通信端口的LPCP_PORT_OBJECT
Entry
是用于将消息排队到服务器通信/连接端口的MsgQueue.ReceiveHead的列表条目。
Request
是作为对NtRequestWaitReplyPort()的调用的Request参数提供的消息缓冲区的副本,或者是作为对NtReplyWaitRecivePortEx()的Reply参数提供
的消息缓冲区的副本。
其中 PORT_MESSAGE 是对用户端可见的报文,LPCP_MESSAGE 是内核使用的实际报文格式。
kd> dt nt!_ETHREAD -y Lpc +0x1c8 LpcReplyChain : _LIST_ENTRY +0x1f4 LpcReplySemaphore : _KSEMAPHORE +0x208 LpcReplyMessage : Ptr32 Void +0x208 LpcWaitingOnPort : Ptr32 Void +0x228 LpcReceivedMessageId : Uint4B +0x23c LpcReplyMessageId : Uint4B +0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit +0x250 LpcExitThreadCalled : Pos 1, 1 Bit
LpcReplyMessageId
包含在客户端线程等待响应时发送到服务器的消息的ID。
LpcWaitingOnPort
LPC客户端线程用于存储它正在等待答复的LPC客户端通信端口。
LpcReplySemaphore
在服务器处理LPC消息时,用于阻止LPC客户端线程。
LpcExitThreadCalled
Lpc API用来确定线程当前是否正在退出,如果退出,则从API调用返回STATUS_THREAD_IS_TERMINATING。
LpcReplyChain
用于将线程排队到等待来自服务器通信/连接端口的答复的线程列表。 该列表的列表头位于LPCP_PORT_OBJECT-> LpcReplyChainHead中。