当前位置: 首页 > news >正文

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext----RPC源代码分析

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext


第一部分:
1: kd> kc
 #
00 RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION
01 RPCRT4!OSF_CASSOCIATION::AllocateCCall
02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall
03 RPCRT4!OSF_BINDING_HANDLE::NegotiateTransferSyntax
04 RPCRT4!I_RpcGetBufferWithObject
05 RPCRT4!I_RpcGetBuffer
06 RPCRT4!NdrGetBuffer
07 RPCRT4!NdrClientCall2
08 ADVAPI32!LsarGetUserName
09 ADVAPI32!LsaGetUserName
0a ntdll!RtlpWaitOrTimerCallout


第二部分:
RPC_STATUS
OSF_CASSOCIATION::AllocateCCall (
    IN OSF_BINDING_HANDLE *BindingHandle,
    IN PRPC_MESSAGE Message,
    IN CLIENT_AUTH_INFO * ClientAuthInfo,
    OUT OSF_CCALL ** pCCall,
    OUT BOOL *fBindingHandleReferenceRemoved
    )
{

    Status = LookForExistingConnection (
                                            BindingHandle,
                                            fExclusive,
                                            ClientAuthInfo,
                                            PresentationContextsToUse,
                                            NumberOfBindingsToUse,
                                            &CConnection,
                                            &PresentationContextSupported,
                                            &InitialCallState,
                                            BOOL(fUseSeparateConnection)) ;


    AssociationMutex.Clear();

    if (Status != RPC_S_OK)
        {
        ReleaseBindingList(BindingsList);
        return Status;
        }

    if (CConnection == 0)
        {
        //
        // Allocate a new connection
        //
        RPC_CONNECTION_TRANSPORT *ClientInfo
            = (RPC_CONNECTION_TRANSPORT *) TransInfo->InqTransInfo();

        Status = RPC_S_OK;

        CConnection = new(ClientInfo->ClientConnectionSize
                          + ClientInfo->SendContextSize
                          + sizeof(PVOID))
                          OSF_CCONNECTION(
                              this,
                              ClientInfo,
                              BindingHandle->InqComTimeout(),
                              ClientAuthInfo,
                              fExclusive,
                              BOOL(fUseSeparateConnection),
                              &Status);

第三部分:


1: kd> dv
               this = 00ce1958
      MyAssociation = 0x00ce1840
      RpcClientInfo = 0x77bece00
            Timeout = 5
     ClientAuthInfo = 0x00ce1768
         fExclusive = 0n1
fSeparateConnection = 0n0
            pStatus = 0x007cf938


    inline void
    InitConnectionSupportHeaderSign (
        void
        )
    {
        Flags.SetFlagUnsafe(cshsDontKnow);
    }

 Association = MyAssociation;
    // CASSOC++
    Association->AddReference();

    ObjectType = OSF_CCONNECTION_TYPE;
    ClientInfo = RpcClientInfo;

第四部分:


1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!RPC_CONNECTION_TRANSPORT *)0x77bece00)
((RPCRT4!RPC_CONNECTION_TRANSPORT *)0x77bece00)                 : 0x77bece00 [Type: RPC_CONNECTION_TRANSPORT *]
    [+0x000] TransInterfaceVersion : 0x2004 [Type: unsigned int]
    [+0x004] TransId          : 0xf [Type: unsigned short]
    [+0x006] TransAddrId      : 0x11 [Type: unsigned short]
    [+0x008] ProtocolSequence : 0x77bd2264 : 0x6e [Type: unsigned short *]

    [+0x030] AddressSize      : 0x70 [Type: unsigned int]
    [+0x034] ClientConnectionSize : 0x54 [Type: unsigned int]
    [+0x038] ServerConnectionSize : 0x54 [Type: unsigned int]
    [+0x03c] SendContextSize  : 0x24 [Type: unsigned int]
 

第五部分:u.ConnSendContext的地址的由来!!!


#define TransConnection() ((RPC_TRANSPORT_CONNECTION) \
                                       ((char *) this+sizeof(OSF_CCONNECTION)))


    [+0x034] ClientConnectionSize : 0x54 [Type: unsigned int]

    [+0x03c] SendContextSize  : 0x24 [Type: unsigned int]

//关键地方
    u.ConnSendContext = (char *) TransConnection()
                      + ClientInfo->ClientConnectionSize
                      + sizeof(PVOID);

    *((PVOID *) ((char *) u.ConnSendContext - sizeof(PVOID))) = (PVOID) this;    

00ce1b28  = 00ce1958


1: kd> dd 00ce1958++0x17c+54
00ce1b28  00ce1958 baadf00d baadf00d baadf00d
00ce1b38  baadf00d baadf00d baadf00d baadf00d


1: kd> dx -id 0,0,898d2250 -r1 (*((RPCRT4!OSF_CCONNECTION::__unnamed *)0xce1aac))
(*((RPCRT4!OSF_CCONNECTION::__unnamed *)0xce1aac))                 [Type: OSF_CCONNECTION::__unnamed]
    [+0x000] ConnSendContext  : 0xce1b2c [Type: void *]
    [+0x000] NextConnection   : 0xce1b2c [Type: OSF_CCONNECTION *]


第六部分:u.ConnSendContext作为参数的地方和具体含义

    if (fAsync)
        {
        Status = TransAsyncSend(BindingHandle,
                                BindPacket,
                                BindPacketLength,
                                u.ConnSendContext);
        }


RPC_STATUS
OSF_CCONNECTION::TransAsyncSend (
    IN OSF_BINDING_HANDLE * BindingHandle,
    IN void  * Buffer,
    IN UINT BufferLength,
    IN void  *SendContext
    )
{

    Status = ClientInfo->Send(TransConnection(),
                              BufferLength,
                              (BUFFER) Buffer,
                              SendContext);


1: kd> u 77c6d738
RPCRT4!CO_Send [d:\srv03rtm\com\rpc\runtime\trans\common\cotrans.cxx @ 59]:
77c6d738 ??              ???


RPC_STATUS
RPC_ENTRY
CO_Send(
    RPC_TRANSPORT_CONNECTION ThisConnection,
    UINT Length,
    BUFFER Buffer,
    PVOID SendContext
    )
{
    PCONNECTION pConnection = (PCONNECTION)ThisConnection;
    CO_SEND_CONTEXT *pSend = (CO_SEND_CONTEXT *)SendContext;
    BOOL b;

1: kd> dt CO_SEND_CONTEXT            //正好24个字节
RPCRT4!CO_SEND_CONTEXT
   +0x000 Write            : BASE_OVERLAPPED
   +0x01c pWriteBuffer     : Ptr32 UChar
   +0x020 maxWriteBuffer   : Uint4B

相关文章:

  • 如何简单几步使用 FFmpeg 将任何音频转为 MP3?
  • 插件架构实践
  • 0.深入探秘 Rust Web 框架 Axum
  • 基于 Django 进行 Python 开发
  • Telecom 源码分析计划
  • JUC学习(1) 线程和进程
  • SQL Server 游标介绍
  • 《MySQL:MySQL表结构的基本操作》
  • webgl入门实例-07顶点缓冲区示例
  • 什么是分库分表?
  • 制作Unoconv项目的Docker镜像
  • 部署若依前后端分离
  • 详细讲解一下Java中的Enum
  • vue常见错误
  • 用idea配置springboot+mybatis连接postersql数据库
  • 从GPT到Gemini 大模型进化史
  • CSS的复合选择器
  • Python与图像处理:从基础操作到智能应用的全面解析
  • 《理解 Java 泛型中的通配符:extends 与 super 的使用场景》
  • 电力变压器油的<油质气象色谱>指标分析
  • 远如《月球背面》,近似你我内心
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • 超新星|18岁冲击中超金靴,王钰栋的未来无限可能
  • 周启鸣加盟同济大学,曾任香港浸会大学深圳研究院院长
  • 美国三大指数全线高开:纳指涨逾4%,大型科技股、中概股大涨
  • 上海工匠学院首届学历班56人毕业,新一届拟招生200人