RemoteCall_杂_ZC

1、

D:\DrRemoteCall\Debug;SRV*D:\Symbols_Web*http://msdl.microsoft.com/download/symbols

2、

WinDbg的退出

    通过 q 或者 ALT + F4 退出调试并销毁被调试进程:
    > q

    通过 qd 退出调试,但被调试进程继续运行:
    > qd

 

3、20180113 可改进之处:

  3.1、HandleAsk(...)中,可以 申请内存将 整个Block复制下来,。

    好处:InOut型的 缓冲区参数,处理起来更加 方便、简洁明了

    坏处:增加了 内存copy操作,更耗CPU时间

    ZC: 这部分代码,只要写一遍 写好就行,写健壮,以后不会经常的去动这里的代码的。

      所以,这里的代码 目标只有一个:效率高就行,麻不麻烦无所谓

  3.2、DLL导出函数的 函数体内容部分

    接收到Answer之后的处理,需要改进,可以改的更为通用,目标:以后不要去动(修改)这部分代码。

    具体的做法:构造Block的时候,将InOut类型的参数都 保存到 类成员的vector中(将 类型&地址 保存到一个结构体中,然后再保存至vector)。

      ptBuffer 再细分为 ptBufferNumber4、ptBufferNumber8、ptBufferBuffer:

        A、ptBufferNumber4、ptBufferNumber8就是固定长度的缓冲区

        B、(人为规定)ptBufferBuffer参数的后面必定跟一个ptBufferNumber4参数,用于指定  传入时缓冲区的最大长度 传出时缓冲区被使用的长度

    然后在得到Answer的时候,可以自动根据ptBuffer的类型来设置相应参数的缓冲区,有的要用 memcpy,有的可以直接 "*(DWORD*)&pc[dwOffset] = ?;"。这样,得到Answer后的处理代码就不要每次都去修改它了。

    ZC: 这里的代码,每添加一个导出函数,都会要写一遍。于是 在考虑效率的同时,也要尽量方便,要做到 需要修改的地放越少越好,看起来还要简洁易懂

4、

  主动Call 和 被动Call 时,保存下来的 缓冲区参数,在函数执行出错时,还没有释放

5、

6、ZC:可以将 调用函数的功能 写成一个函数,用可变参数的方式(cdecl),类似:

  int TestAAA("函数名(%d, %s, ...)", 参数1, 参数2, 参数3, ...);

  然后统一调用 函数TestAAA(...),而不用调用 具体的 某个函数。

  6.1、Delphi 没有可变参数的函数形式,于是 可以使用如下的方式:

    function TestAAA('函数名(%d, %s, ...)', array of 参数指针):integer;

    然后调用的时候 这样:TestAAA('函数名(%d, %s, ...)', [参数1指针, 参数2指针, 参数3指针, ...]);

  ZC: 但是,感觉 这样弄 也不是很省力... 程序A 要知道 程序B 的某个函数,程序B 肯定要告诉它,有这个功夫 程序A 里面的 函数声明估计也写好了。姑且先 记录下 这种方式,用不用 以后再说吧。

 

7、方式比较:

  7.1、共享内存:少复制一次内存(Ask的时候 ∵不知道函数调用里面会不会还有 远程调用 ∴必须将参数信息复制出来。Answer的时候 可以直接将 共享内存 里面的信息复制到参数的地址空间中去[就是这一次复制操作可以省去])

    多一些无脑操作,少一些 手动判断,可以这样:(1)、所有Ask里面的缓冲区 都增加2个字节的长度(用于存放'\0')。省的判断是否是 字符串。(2)、接收到Ask之后,将整个传来的参数信息全部复制下来,省的一个一个的判断是否是缓冲区 然后再复制。

  7.2、WIndows消息:WM_COPYDATA里面不能再次WM_COPYDATA,于是需要 线程来传递/接收信息,于是 Ask和Answer都需要将信息复制出来

8、

9、

 

posted @ 2018-01-10 08:39  DrMess  阅读(213)  评论(0编辑  收藏  举报