LPC for NT/W2K
作者:陆麟
转载请征得作者同意.
2000.9.23


大病一场,现继续INSIDE PROGRAMMING的工作.:)
今天讲的乃是LPC.
LPC乃是LOCAL PROCEDURE CALL的简写.同RPC类似.但是,却是完全未公开的.
LPC本身用于个集成子系统和环境子系统的互相沟通,以及一些API调用的实际实现.例如:为了实现一个LSA API. ADVAPI32.DLL本身并不负责实现安全管理.它把调用通过LPC转移到LSASS,因为LSASS是实现安全性的组件.
尽管LCP机制没有公开,但是因为OS组件大量依靠于LPC,使得我们有机会了解到LPC调用的基本流程.
大家如果看NTDLL.DLL的引出表,可以发现很多有关"PORT"的函数,这就是LPC实现的基础,NATIVE API提供了LPC的基本环境.
下面给出用于实现LPC的NATIE API调用流.

SERVER:
1:NtCreatePort(...)/NtCreateWaitAblePort(...)创建PORT对象.
NTSYSAPI
NTSTATUS
NTAPI
NtCreatePort(
 PHANDLE PortHandle,
 POBJECT_ATTRIBUTES ObjectAttributes,
 ULONG MaxConnectInfoLength,
 ULONG MaxDataLength,
 ULONG Unknown
);

2.NtListenPort(...)等待联接请求.
NTSYSAPI
NTSTATUS
NTAPI
NtListenPort(
 HANDLE PortHandle,
 PLPCMESSAGE pLpcMessage
);

3.NtAcceptConnectPort(...)接收CLEINT联接请求.得到新的PORT HANDLE.
NTSYSAPI
NTSTATUS
NTAPI
NtAcceptConnectPort(
 PHANDLE PortHandle,
 ULONG Unknown, // Pass 0
 PLPCMESSAGE pLpcMessage,
 ULONG Unknown1, // 1
 ULONG Unknown3, // 0
 PLPCSECTIONMAPINFO pSectionMapInfo
);

4.NtCompleteConnectPort(...)完成联接.
NTSYSAPI
NTSTATUS
NTAPI
NtCompleteConnectPort(
 HANDLE PortHandle
);

5.NtReplyPort(...)回复消息.
NTSYSAPI
NTSTATUS
NTAPI
NtReplyPort(
 HANDLE PortHandle,
 PLPCMESSAGE pLpcMessage
);

6.NtReplyWaitReceivePort(...)可以用于等待消息,回复消息并且等待下一个消息.
NTSYSAPI
NTSTATUS
NTAPI
NtReplyWaitReceivePort(
 PHANDLE PortHandle,
 PULONG Unknown ,
 PLPCMESSAGE pLpcMessageOut,
 PLPCMESSAGE pLpcMessageIn
);

8.NtClose(...)结束对话.
NTSYSAPI
NTSTATUS
NTAPI
NtClose(
    IN HANDLE Handle
    );
 

CLIENT:
1.NtConnectPort(...)请求联接PORT.得到PORT句柄.
NTSYSAPI
NTSTATUS
NTAPI
NtConnectPort(
 PHANDLE PortHandle,
 PUNICODE_STRING PortName,
 PULONG Unknown, /* Can not be NULL */
 PLPCSECTIONINFO Unknown1, /* Used in Big LPC */
 PLPCSECTIONMAPINFO Unknown2, /* Used in Big LPC */
 PVOID Unknown3, /* Can be NULL */
 PVOID ConnectInfo,
 PULONG pConnectInfoLength
);

2.NtRequestPort(...)发消息.此CALL调用者得不到SERVER端的确认.
NTSYSAPI
NTSTATUS
NTAPI
NtRequestPort(
 HANDLE PortHandle,
 PLPCMESSAGE pLpcMessage
);

3.NtRequestWaitReplyPort(...)如果需要SERVER返回确认消息或回复.调用此函数.
NTSYSAPI
NTSTATUS
NTAPI
NtRequestWaitReplyPort(
 HANDLE PortHandle,
 PLPCMESSAGE pLpcMessageIn,
 PLPCMESSAGE pLpcMessageOut
);

4.NtClose(...)结束对话.
NTSYSAPI
NTSTATUS
NTAPI
NtClose(
    IN HANDLE Handle
    );
 

尽管我们了解了NT的LPC机制.但是对于各环境子系统和集成子系统的实际通信所发的数据报仍然需要大量的工作去了解其含义.革命尚未成功,同志还需努力...