http://andylin02.iteye.com/blog/457411 win32 rpc编程系列四篇 已看
http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/ rpc编程 已看
sudami的sandbox代码
http://bbs.pediy.com/showthread.php?t=172274&highlight=rpc
http://www.hsc.fr/ressources/articles/win_net_srv/index.html
http://bbs.pediy.com/showthread.php?t=77899&highlight=rpc
http://msdn.microsoft.com/en-us/library/cc213372.aspx
http://bbs.pediy.com/showthread.php?t=79437&highlight=rpc
http://bbs.pediy.com/showthread.php?t=140154
RPC/XDR/NFS系列 文章
LPC:连接端口(服务进程),通信端口。大于256字节,报文是共享内存。小于则是报文发送。
csrss,lsass->lpc.跨进程的过程调用。port是进程间通信机制,lpc是建立在这上面的应用。
NtCreatePort
NtCreateWaitablePort()
NtListenPort()
NtConnectPort()
NtAcceptConnectPort()
NtCompleteConnectPort()
NtRequestPort()
NtRequestWaiReplyPort()
NtReplyPort()
NtReplyWaitReceivePort()
NtReplyWaitReceivePortEx()。同上,但是带有超时控制
NtReadRequestData()
NtWriteRequestData()
NtQueryInformationPort()
客户 服务端
NtCreatePort(端口服务线程)
NtListenPort->NtReplyWaitReceivePort(无线for 循环,如果是应答报文,EiReplyOrRequestPort发送应答报文(EiEnqueueMessagePort()挂入目标端口的接收
报文队列),如果是连接请求报文,EiEnqueueConnectMessagePort()把它挂入端口的ConnectQueueListHead队列,这是为随后的“接受连接”操作、即系统调用NtAcceptConnectPort()留下一个参考).
NtConnectPort目标是一个连接端口(EiConnectPort(ObCreateObject,EiReplyOrRequestPort(把报文的容器挂入目标连接端口的接收队列),KeReleaseSemaphore(唤醒服务线程))
NtAcceptConnectPort创建无名通信端口,返回handle(如果是拒绝,EiReplyOrRequestPort在对方端口挂个拒绝报文。)
NtCompleteConnectPort唤醒客户线程
EiDequeueMessagePort()从通讯端口队列中获取对方应答报文。
创建线程(LPC服务线程),提供LPC服务。从通信端口接受报文,等待客户端服务请求而阻塞。
NtListenPort等待新连接
NtRequestPort(不等回复),NtRequestWaitReplyPort(等待回复)发送报文,请求LPC服务而阻塞 服务端接受报文提供服务,NtReplyPort回答报文,客户端解除阻塞。
eport中有信号量,实现通信双方同步。
三种报文,两种特殊,一种数据。特殊:连接请求,连接应答。在报文的data部分。
com:
1. 杨老的com教程
2. com原理与应用
com实现-潘爱民
com原理与应用
com本质论
com技术内幕 64页
ole2对象链接与嵌入技术高级编程技术
http://blog.chinaunix.net/uid-20071539-id-1978405.html com实现过程。
进程外的COM以及DCOM,前者是基于LPC 本地过程调用,后者是基于RPC远程过程调用。除了协议不同外,其他的都一样。
exports
DllGetClassObject, 返回类工厂接口。
DllCanUnloadNow, 告诉客户端该COM是否可以被正常卸载。
DllRegisterServer, 向系统注册COM组件信息。Regsvr32.exe 就是调用这个函数来进行注册的。
DllUnregisterServer 从系统中反注册一个COM。Regsvr32.exe 就是调用这个函数来进行反注册的。
1. CreateCOMObject -- CoCreateInstance。 CoCreateInstance 在注册表中查找COM的注册信息。
2. CoCreateInstance - CoGetClassObject 。注册信息被交给CoGetClassObject。这时候CoGetClassObject将知道COM组件在磁盘上的位置。
3.CoGetClassObject - LoadLibrary 。LoadLibrary 将寻找COM DLL的入口,然后GetProcAddress调用其输出函数DllGetClassObject
4. DllGetClassObject 的输出参数将向我们返回“类工厂”接口IClassFactory。
5. IclassFactory -- CreateInstance 。CreateInstance方法建立其我们实现接口的类。该类将调用自身的QueryInterface 方法,查看用户指定的接口是否被自己实现,如果实现了,则向返回自定义的接口。
6. 调用结束后,COM客户将调用COM的DLL输出函数DllCanUnloadNow 。如果该函数返回S_OK,则释放该组件。
CLASS_xx 类型的GUID,是用来标识COM组件的。
IID_xx类型的GUID,是用来标识一个接口的。可以有多个。
LIBID_xx类型的GUID,是用来标识一个TypeLib的。
AddRef 方法:
该方法用于增加一个COM的计数器。我们知道COM Server是需要支持多客户调用的,在COM中每实现一次调用,就必须进行计数。如果COM的计数>0 ,则COM继续生存。否则,该COM接口实例就必须被注销。
_Release 方法:
该方法和_AddRef方法相反,用于减少一个计数,当计数为0,则注销该接口。
QueryInterface 方法:
该方法用于查询一个接口是否存在,如果存在则在输出参数里返回该接口指针。
ProgID:程序标志,由项目名称和类名两部分组成。如: project.class1
LocalServer32:进程外组件,如ActiveX EXE这样的进程外服务器中的组件需要该子键
该子键保存了服务器文件的物理路径。
InprocServer32:进程内组件,如ActiveX DLL这样的进程内服务器中的组件需要该子键
该子键保存了服务器文件的物理路径。
TypeLib:类型库。它所对应的数据在HKEY_CLASSES_ROOT\TypeLib下面互相联系。
Vb的工程->引用对话框,就是通过该键来填充列表的。
--成文于2013-11-3