⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpcpdu.cpp

📁 VXWORKS源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* RpcPdu.cpp - COM/DCOM RpcPdu class implementation *//*modification history--------------------01z,17dec01,nel  Add include symbol for diab build.01y,10dec01,dbs  diab build01x,08oct01,nel  SPR#70120. reformat ALTER_CONTEXT_RESP separately from                 BIND_ACK.01w,13jul01,dbs  fix up includes01v,15aug00,nel  Win2K Fix.01u,27jun00,dbs  NDR-format presCtxId01t,22jun00,dbs  add accessors for alter_context_resp01s,19aug99,aim  change assert to VXDCOM_ASSERT01r,20jul99,aim  grow vector when building incoming pdu01q,09jul99,dbs  copied from NRpcPdu into RpcPdu files01p,07jul99,aim  removed debug from makeReplyBuffer01o,06jul99,aim  added isBindNak01n,02jul99,aim  added isBindAck01m,25jun99,dbs  add authn properties01l,24jun99,dbs  move authn into new class01k,18jun99,aim  set data rep on outgoing packets01j,17jun99,aim  changed assert to assert01i,01jun99,dbs  add NDR formatting to FAULT packet header01h,19may99,dbs  send packet in fragments so no copying required01g,11may99,dbs  rename VXCOM to VXDCOM01f,07may99,dbs  add method to return object ID01e,29apr99,dbs  fix -Wall warnings01d,28apr99,dbs  add mem-pool01c,26apr99,aim  added TRACE_CALL01b,21apr99,dbs  change RPCMSG to RpcPdu01a,20apr99,dbs  created during Grand Renaming*//*  DESCRIPTION:  RpcPdu -- RPC Protocol Data Unit class.*/#include <stdio.h>#include <ctype.h>#include "RpcPdu.h"#include "orpcLib.h"#include "dcomProxy.h"#include "Syslog.h"#include "TraceCall.h"/* Include symbol for diab */extern "C" int include_vxdcom_RpcPdu (void)    {    return 0;    }////////////////////////////////////////////////////////////////////////////RpcPdu::RpcPdu ()  : m_headerOffset (0),    m_stubData (),    m_requiredOctets (sizeof (rpc_cn_common_hdr_t)),    m_pduState (HAVE_NONE)    {    TRACE_CALL;    m_headerOffset = reinterpret_cast<char*> (&m_header);    (void) ::memset (&m_header, 0, sizeof (m_header));    }RpcPdu::~RpcPdu ()    {    TRACE_CALL;    }////////////////////////////////////////////////////////////////////////////void RpcPdu::guidReformat    (    GUID&                guid,    ULONG                drep    )    {    TRACE_CALL;    ndr_make_right (guid.Data1, drep);    ndr_make_right (guid.Data2, drep);    ndr_make_right (guid.Data3, drep);    }////////////////////////////////////////////////////////////////////////////void RpcPdu::commonHdrReformat    (    ULONG                drep    )    {    TRACE_CALL;    rpc_cn_packet_t* pHdr = &m_header;        ndr_make_right (pHdr->request.hdr.fragLen, drep);    ndr_make_right (pHdr->request.hdr.authLen, drep);    ndr_make_right (pHdr->request.hdr.callId, drep);    }////////////////////////////////////////////////////////////////////////////void RpcPdu::extHdrReformat    (    ULONG                drep    )    {    TRACE_CALL;    rpc_cn_packet_t* pHdr = &m_header;        switch (pHdr->request.hdr.packetType)        {        case RPC_CN_PKT_REQUEST:            ndr_make_right (pHdr->request.allocHint, drep);            ndr_make_right (pHdr->request.presCtxId, drep);            ndr_make_right (pHdr->request.methodNum, drep);            if (pHdr->request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID)                guidReformat (pHdr->request.objectId, drep);            break;        case RPC_CN_PKT_RESPONSE:            ndr_make_right (pHdr->request.allocHint, drep);            ndr_make_right (pHdr->request.presCtxId, drep);            break;        case RPC_CN_PKT_BIND:        case RPC_CN_PKT_ALTER_CONTEXT:            ndr_make_right (pHdr->bind.maxTxFrag, drep);            ndr_make_right (pHdr->bind.maxRxFrag, drep);            ndr_make_right (pHdr->bind.assocGroupId, drep);            guidReformat (pHdr->bind.presCtxList.presCtxElem                          [0].abstractSyntax.id,                          drep);            ndr_make_right (pHdr->bind.presCtxList.presCtxElem                 [0].abstractSyntax.version, drep);            ndr_make_right (pHdr->bind.presCtxList.presCtxElem[0].presCtxId,                             drep);            guidReformat (pHdr->bind.presCtxList.presCtxElem                          [0].transferSyntax [0].id,                          drep);            ndr_make_right (pHdr->bind.presCtxList.presCtxElem                 [0].transferSyntax [0].version, drep);            break;        case RPC_CN_PKT_BIND_ACK:	    ndr_make_right (pHdr->bind_ack.maxTxFrag, drep);	    ndr_make_right (pHdr->bind_ack.maxRxFrag, drep);	    ndr_make_right (pHdr->bind_ack.assocGroupId, drep);	    ndr_make_right (pHdr->bind_ack.secAddr.len, drep);            ndr_make_right (pHdr->bind_ack.resultList.presResult [0].result, drep);            ndr_make_right (pHdr->bind_ack.resultList.presResult [0].reason, drep);	    ndr_make_right (pHdr->bind_ack.resultList.presResult			    [0].transferSyntax.version, drep);	    guidReformat (pHdr->bind_ack.resultList.presResult			  [0].transferSyntax.id, drep);            break;        case RPC_CN_PKT_ALTER_CONTEXT_RESP:	    ndr_make_right (pHdr->alter_context_resp.maxTxFrag, drep);	    ndr_make_right (pHdr->alter_context_resp.maxRxFrag, drep);	    ndr_make_right (pHdr->alter_context_resp.assocGroupId, drep);	    ndr_make_right (pHdr->alter_context_resp.secAddr, drep);            ndr_make_right (pHdr->alter_context_resp.resultList.presResult [0].result, drep);            ndr_make_right (pHdr->alter_context_resp.resultList.presResult [0].reason, drep);	    ndr_make_right (pHdr->alter_context_resp.resultList.presResult			    [0].transferSyntax.version, drep);	    guidReformat (pHdr->alter_context_resp.resultList.presResult			  [0].transferSyntax.id, drep);            break;        case RPC_CN_PKT_FAULT:            ndr_make_right (pHdr->fault.status, drep);            break;        }    }////////////////////////////////////////////////////////////////////////////const rpc_cn_auth_tlr_t*RpcPdu::authTrailer () const    {    TRACE_CALL;    ULONG alen = authLen ();    if (alen == 0)        return 0;#ifdef __DCC__    const char* stubDataOffset = &(*(m_stubData.begin ()));#else    const char* stubDataOffset = reinterpret_cast<const char*>                                 (m_stubData.begin ());#endif        if (stubDataOffset == 0)        return 0;    return reinterpret_cast<rpc_cn_auth_tlr_t*>        (const_cast<char *>        (stubDataOffset + (payloadLen () -                           (alen + SIZEOF_AUTH_TLR_PREAMBLE))));    }// this always includes the auth-trailer if presentsize_tRpcPdu::payloadLen () const    {    TRACE_CALL;    return m_stubData.size ();    }// this *only* the stub data lengthsize_t RpcPdu::stubDataLen () const    {    return (payloadLen () - authLen ());    }ULONGRpcPdu::hdrLen () const    {    TRACE_CALL;    ULONG n = 0;    switch (m_header.request.hdr.packetType)        {        case RPC_CN_PKT_REQUEST:            n = sizeof (rpc_cn_request_hdr_t);            if (! (m_header.request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID))                n -= sizeof (GUID);            break;        case RPC_CN_PKT_RESPONSE:            n = sizeof (rpc_cn_response_hdr_t);            break;        case RPC_CN_PKT_BIND:        case RPC_CN_PKT_ALTER_CONTEXT:            n = sizeof (rpc_cn_bind_hdr_t);            break;        case RPC_CN_PKT_BIND_ACK:            n = sizeof (rpc_cn_bind_ack_hdr_t);            break;        case RPC_CN_PKT_ALTER_CONTEXT_RESP:            n = sizeof (rpc_cn_alter_context_resp_hdr_t);            break;        case RPC_CN_PKT_BIND_NAK:            n = sizeof (rpc_cn_bind_nak_hdr_t);            break;        case RPC_CN_PKT_AUTH3:            n = sizeof (rpc_cn_auth3_hdr_t);            break;                    case RPC_CN_PKT_SHUTDOWN:        case RPC_CN_PKT_REMOTE_ALERT:        case RPC_CN_PKT_ORPHANED:            n = sizeof (rpc_cn_common_hdr_t);            break;        case RPC_CN_PKT_FAULT:            n = sizeof (rpc_cn_fault_hdr_t);            break;        default:            // log warning            n = 4096;            break;        }    return n;    }    voidRpcPdu::opnumSet (USHORT op)    {    TRACE_CALL;    m_header.request.methodNum = op;    }voidRpcPdu::fragLenSet ()    {    TRACE_CALL;    int len = hdrLen () + payloadLen ();    m_header.request.hdr.fragLen = len;    if (packetType () == RPC_CN_PKT_REQUEST)        m_header.request.allocHint = len;    else if (packetType () == RPC_CN_PKT_RESPONSE)        m_header.response.allocHint = len;    }voidRpcPdu::authLenSet (size_t n)    {    TRACE_CALL;    m_header.request.hdr.authLen = n;    }voidRpcPdu::drepSet ()    {    TRACE_CALL;    * (ULONG*) m_header.request.hdr.drep = ORPC_WIRE_DREP;    }voidRpcPdu::drepSet (ULONG dr)    {    TRACE_CALL;    * (ULONG*) m_header.request.hdr.drep = dr;    }size_tRpcPdu::stubDataAppend (const void* pv, size_t n)    {    TRACE_CALL;    const char* p = reinterpret_cast<const char*> (pv);    m_stubData.insert (m_stubData.end (), p, p +n);    return n;    }const GUID& RpcPdu::objectId () const    {    TRACE_CALL;    if (m_header.request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID)        return m_header.request.objectId;    return GUID_NULL;    }/////////////////////////////////////////////////////////////////////////////////boolRpcPdu::complete () const    {    return m_pduState & HAVE_STUB;    }size_tRpcPdu::appendCommonHdr (const char* buf, size_t len)    {    COM_ASSERT (m_pduState & HAVE_NONE);    size_t n = min(len, m_requiredOctets); // octets to copy    ::memcpy (m_headerOffset, buf, n);    m_headerOffset += n;    m_requiredOctets -= n;    if (m_requiredOctets == 0)        {        // Un-NDR the packet header...        commonHdrReformat (drep ());        // mark the next state's requirements        m_pduState = HAVE_HDR;        m_requiredOctets = hdrLen () - sizeof (rpc_cn_common_hdr_t);        if (len - n > 0)            n += appendExtendedHdr (buf + n, len - n);        }    return n;    }size_tRpcPdu::appendExtendedHdr (const char* buf, size_t len)    {    COM_ASSERT (m_pduState & HAVE_HDR);    size_t n = min(len, m_requiredOctets); // octets to copy    ::memcpy (m_headerOffset, buf, n);    m_headerOffset += n;    m_requiredOctets -= n;    if (m_requiredOctets == 0)        {        // Un-NDR the remainder of the header...        extHdrReformat (drep ());        // mark the next state's requirements        m_pduState = HAVE_XHDR;        m_requiredOctets = fragLen () - hdrLen ();        if (m_requiredOctets > 0)            m_stubData.reserve (m_requiredOctets);        if (m_requiredOctets > 0 && (len - n) > 0)            n += appendStubData (buf + n, len - n);        else if (m_requiredOctets == 0)            m_pduState = HAVE_STUB;        }    return n;    }size_tRpcPdu::appendStubData (const char* buf, size_t len)    {    size_t n = min(len, m_requiredOctets); // octets to copy    m_stubData.insert (m_stubData.end (), buf, buf + n);    if ((m_requiredOctets -= n) == 0)        m_pduState = HAVE_STUB;    return n;    }size_tRpcPdu::append (const char* buf, size_t len)    {    if (len < 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -