RPC资料及笔记

 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值