关于LPC,我要说的一些值得注意的地方。。。

时间:2021-10-16 17:37:15
这几天研究LPC,因为技术资料比较少,网上也只能找到仅有的一点例子,而且很多代码都不完整,我也没办法就蒙着脑袋做了,然后做下来,发现个SB到透顶的问题:
NtCreatePort(NtCreateWaitablePort)创建的一个LPC的Port只能【对应一个Client】也就是一个Server Port不可能响应N个Client的请求,我设计的思路是NtCreatePort创建一个LPC端口,然后开辟一个线程(服务监听线程),使用NtListenPort等待客户端NtConnectPort发来的消息,然后NtAcceptConnectPort握手连接,再开一个线程去NtReplyWaitReceivePort上述NtAcceptConnectPort返回的hPort(客户处理线程)。
这个思路很好很天真,可实际执行起来就傻逼了,客户处理线程中的NtReplyWaitReceivePort监听的NtAcceptConnectPort返回的hPort经常漏消息,比如有时候漏NtRequestPort啊、有时候漏NtRequestWaitReplyPort之类的,百思不得其解,我把NtCreatePort换成NtCreateWaitablePort也还是一样,蛋疼无比。。。
然后仔细观察,这些消息漏去哪里了呢?嘿,没错,漏去服务监听线程的NtListenPort了,而NtListenPort又忽略了除建立连接以外的消息,服务端处理线程挂起卡死了。。。

然后我得出的结论是:
NtCreatePort虽然“名义”上有一个参数指定可接收的最大连接总数,如果那个参数为0,就是可以接受无限个连接,可实际上NtCreatePort建立的LPC端口,一个端口对应一个Client,当某个Client通过NtConnectPort跟我们的Server建立通讯后,这个Server的Port就被占用了。
NtAcceptConnectPort返回的端口是Client用的,对Server无用处,Server就只能用NtCreatePort的原始端口来监听,如果2个同时上,会导致漏消息,漏什么消息看RP(2个线程的CPU切换片)。