RpcPduFactory.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:13k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* RpcPduFactory - create DCOM protocol requests/responses */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01p,17dec01,nel  Add include symbol for diab build.
  7. 01o,08oct01,nel  SPR#70120. reformat ALTER_CONTEXT_RESP separately from
  8.                  BIND_ACK.
  9. 01n,13jul01,dbs  add pres ctx ID to request pdu
  10. 01m,29mar01,nel  SPR#35873. Add context id parameter to formatBindPdu to allow
  11.                  client side ctxId to be specified.
  12. 01l,16aug00,nel  Win2K patch.
  13. 01k,27jul00,dbs  fix pres-ctx-id returned in FAULT and RESPONSE packets
  14. 01j,26jun00,dbs  explicitly set presCtxId value in BIND msg
  15.                  add 'did not execute' flag to FAULT
  16. 01i,22jun00,dbs  fix handling of alter-context packets
  17. 01h,19aug99,aim  added TraceCall header
  18. 01g,19jul99,dbs  add support for AUTH3 packets
  19. 01f,02jul99,aim  renamed makeBindFormatPdu and makeRequestFormatPdu
  20. 01e,24jun99,dbs  move authn into new class
  21. 01d,23jun99,dbs  fix authn on response packets
  22. 01c,08jun99,aim  rework
  23. 01b,08jun99,aim  now uses NRpcPdu
  24. 01a,03jun99,aim  created
  25. */
  26. #include "RpcPduFactory.h"
  27. #include "dcomProxy.h"
  28. #include "ntlmssp.h"
  29. #include "TraceCall.h"
  30. /* Include symbol for diab */
  31. extern "C" int include_vxdcom_RpcPduFactory (void)
  32.     {
  33.     return 0;
  34.     }
  35. extern IID IID_ISystemActivator;
  36. RpcPduFactory::RpcPduFactory ()
  37.     {
  38.     TRACE_CALL;
  39.     }
  40. RpcPduFactory::~RpcPduFactory ()
  41.     {
  42.     TRACE_CALL;
  43.     }
  44. BYTE
  45. RpcPduFactory::rpcMajorVersion ()
  46.     {
  47.     return 5;
  48.     }
  49. BYTE
  50. RpcPduFactory::rpcMinorVersion ()
  51.     {
  52.     return 0;
  53.     }
  54. void
  55. RpcPduFactory::formatFaultPdu
  56.     (
  57.     const RpcPdu& request,
  58.     RpcPdu& faultPdu,
  59.     HRESULT faultCode,
  60.     bool didNotExecute
  61.     )
  62.     {
  63.     TRACE_CALL;
  64.     RpcPdu& pdu = faultPdu; // shorter, easier!
  65.     pdu.fault ().hdr.rpcVersion      = rpcMajorVersion ();
  66.     pdu.fault ().hdr.rpcMinorVersion = rpcMinorVersion ();
  67.     pdu.fault ().hdr.packetType      = RPC_CN_PKT_FAULT;
  68.     pdu.fault ().hdr.flags           = RPC_CN_FLAGS_FIRST_FRAG |
  69.        RPC_CN_FLAGS_LAST_FRAG;
  70.     if (didNotExecute)
  71. pdu.fault().hdr.flags |= RPC_CN_FLAGS_DID_NOT_EXECUTE;
  72.     
  73.     pdu.fault ().hdr.drep [0]        = VXDCOM_NDR_DATAREP0;
  74.     pdu.fault ().hdr.drep [1]        = VXDCOM_NDR_DATAREP1;
  75.     pdu.fault ().hdr.drep [2]        = VXDCOM_NDR_DATAREP2;
  76.     pdu.fault ().hdr.drep [3]        = VXDCOM_NDR_DATAREP3;
  77.     pdu.fault ().hdr.callId          = request.callId ();
  78.     pdu.fault ().allocHint           = 0; // XXX fix up later
  79.     pdu.fault ().presCtxId           = request.request().presCtxId;
  80.     pdu.fault ().alertCount          = 0;
  81.     pdu.fault ().reserved            = 0;
  82.     pdu.fault ().status              = faultCode;
  83.     pdu.fault ().reserved2           = 0;
  84.     }
  85. void
  86. RpcPduFactory::formatBindAckPdu
  87.     (
  88.     const RpcPdu& request,
  89.     RpcPdu& bindAckPdu,
  90.     ULONG               assocGroupId
  91.     )
  92.     {
  93.     TRACE_CALL;
  94.     // Handle ALTER_CONTEXT response separately now...
  95.     if (request.packetType () == RPC_CN_PKT_ALTER_CONTEXT)
  96. {
  97. formatAlterContextRespPdu (request, bindAckPdu);
  98. return;
  99. }
  100.     // If the input is a BIND PDU then we need to send a BIND_ACK...
  101.     GUID xferSyntax;
  102.     DWORD version;
  103.     RpcPdu& pdu = bindAckPdu; // shorter, easier!
  104.     xferSyntax = request.bind
  105.  ().presCtxList.presCtxElem[0].transferSyntax [0].id;
  106.     version = request.bind
  107.       ().presCtxList.presCtxElem[0].transferSyntax [0].version;
  108.     pdu.bind_ack ().hdr.rpcVersion = rpcMajorVersion ();
  109.     pdu.bind_ack ().hdr.rpcMinorVersion = rpcMinorVersion ();
  110.     pdu.bind_ack ().hdr.packetType = RPC_CN_PKT_BIND_ACK;
  111.     pdu.bind_ack ().hdr.flags =      RPC_CN_FLAGS_FIRST_FRAG |
  112.                                      RPC_CN_FLAGS_LAST_FRAG;
  113.     
  114.     pdu.bind_ack ().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  115.     pdu.bind_ack ().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  116.     pdu.bind_ack ().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  117.     pdu.bind_ack ().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  118.     pdu.bind_ack ().hdr.callId = request.callId ();
  119.     pdu.bind_ack ().maxTxFrag = RpcPdu::MAXLEN;
  120.     pdu.bind_ack ().maxRxFrag = RpcPdu::MAXLEN;
  121.     // XXX aim
  122.     pdu.bind_ack ().assocGroupId = (ULONG) assocGroupId;
  123.     pdu.bind_ack ().secAddr.len = 4; // ???
  124.     pdu.bind_ack ().secAddr.addr [0] = 0; // ???
  125.     pdu.bind_ack ().resultList.numResults = 1;
  126.     pdu.bind_ack ().resultList.presResult [0].result = 0; // accept
  127.     pdu.bind_ack ().resultList.presResult [0].reason = 0; // not specified
  128.     if (IsEqualGUID(request.bind().presCtxList.presCtxElem[0].abstractSyntax.id, 
  129.                     IID_ISystemActivator))
  130.         {
  131.         // DCE spec lists these codes as network congestion. NT4 returns them
  132.         // when queried for the ISystemActivator interface. This was arrived at
  133.         // by examining the wire protocol.
  134.         pdu.bind_ack ().resultList.presResult [0].result = 0x02;
  135.         pdu.bind_ack ().resultList.presResult [0].reason = 0x01;
  136.         pdu.bind_ack ().resultList.presResult [0].transferSyntax.id = GUID_NULL;
  137.         pdu.bind_ack ().resultList.presResult [0].transferSyntax.version = 0;
  138.         }
  139.     else
  140.         {
  141.         pdu.bind_ack ().resultList.presResult [0].result = 0; // accept
  142.         pdu.bind_ack ().resultList.presResult [0].reason = 0; // not specified
  143.         pdu.bind_ack ().resultList.presResult [0].transferSyntax.id 
  144.                                                                 = xferSyntax;
  145.         pdu.bind_ack ().resultList.presResult [0].transferSyntax.version 
  146.                                                                 = version;
  147.         }
  148.     }
  149. void
  150. RpcPduFactory::formatAlterContextRespPdu
  151.     (
  152.     const RpcPdu& request,
  153.     RpcPdu& alterContextRespPdu
  154.     )
  155.     {
  156.     TRACE_CALL;
  157.     RpcPdu& pdu = alterContextRespPdu; // shorter, easier!
  158.     pdu.alter_context_resp().hdr.rpcVersion = rpcMajorVersion ();
  159.     pdu.alter_context_resp().hdr.rpcMinorVersion = rpcMinorVersion ();
  160.     pdu.alter_context_resp().hdr.packetType = RPC_CN_PKT_ALTER_CONTEXT_RESP;
  161.     pdu.alter_context_resp().hdr.flags = 0;
  162.     pdu.alter_context_resp().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  163.     pdu.alter_context_resp().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  164.     pdu.alter_context_resp().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  165.     pdu.alter_context_resp().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  166.     pdu.alter_context_resp().hdr.callId = request.callId ();
  167.     pdu.alter_context_resp().maxTxFrag = RpcPdu::MAXLEN;
  168.     pdu.alter_context_resp().maxRxFrag = RpcPdu::MAXLEN;
  169.     pdu.alter_context_resp().assocGroupId = 0;
  170.     pdu.alter_context_resp().secAddr = 0;
  171.     pdu.alter_context_resp().pad = 0;
  172.     pdu.alter_context_resp().resultList.numResults = 1;
  173.     if (IsEqualGUID(request.bind().presCtxList.presCtxElem[0].abstractSyntax.id, 
  174.                     IID_ISystemActivator))
  175.         {
  176.         // DCE spec lists these codes as network congestion. NT4 returns them
  177.         // when queried for the ISystemActivator interface. This was arrived at
  178.         // by examining the wire protocol.
  179.         pdu.alter_context_resp().resultList.presResult [0].result = 0x02;
  180.         pdu.alter_context_resp().resultList.presResult [0].reason = 0x01;
  181.         pdu.alter_context_resp().resultList.presResult [0].transferSyntax.id = GUID_NULL;
  182.         pdu.alter_context_resp().resultList.presResult [0].transferSyntax.version = 0;
  183.         }
  184.     else
  185.         {
  186.         pdu.alter_context_resp().resultList.presResult [0].result = 0; // accept
  187.         pdu.alter_context_resp().resultList.presResult [0].reason = 0; // not specified
  188.         pdu.alter_context_resp().resultList.presResult [0].transferSyntax.id
  189.             = request.bind().presCtxList.presCtxElem[0].transferSyntax [0].id;
  190.         pdu.alter_context_resp().resultList.presResult [0].transferSyntax.version
  191.             = request.bind().presCtxList.presCtxElem[0].transferSyntax [0].version;
  192.         }
  193.     }
  194. void
  195. RpcPduFactory::formatBindNakPdu
  196.     (
  197.     const RpcPdu& request,
  198.     RpcPdu& bindNakPdu
  199.     )
  200.     {
  201.     TRACE_CALL;
  202.     RpcPdu& pdu = bindNakPdu; // shorter, easier!
  203.     pdu.bind_nak ().hdr.rpcVersion = rpcMajorVersion ();
  204.     pdu.bind_nak ().hdr.rpcMinorVersion = rpcMinorVersion ();
  205.     pdu.bind_nak ().hdr.packetType = RPC_CN_PKT_BIND_NAK;
  206.     pdu.bind_nak ().hdr.flags = RPC_CN_FLAGS_FIRST_FRAG |
  207. RPC_CN_FLAGS_LAST_FRAG;
  208.     pdu.bind_nak ().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  209.     pdu.bind_nak ().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  210.     pdu.bind_nak ().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  211.     pdu.bind_nak ().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  212.     pdu.bind_nak ().hdr.callId = request.callId ();
  213.     pdu.bind_nak ().reason = 0;
  214.     pdu.bind_nak ().numProtocols = 1;
  215.     pdu.bind_nak ().verMajor = rpcMajorVersion ();
  216.     pdu.bind_nak ().verMinor = rpcMinorVersion ();
  217.     }
  218. void
  219. RpcPduFactory::formatResponsePdu
  220.     (
  221.     const RpcPdu& request,
  222.     RpcPdu& responsePdu
  223.     )
  224.     {
  225.     TRACE_CALL;
  226.     // Handle auth info - any outgoing trailer must be appended to the
  227.     // stub-data, and must be 4-byte aligned...
  228.     RpcPdu& pdu = responsePdu; // shorter, easier!
  229.     // Now fill in response fields...
  230.     pdu.response ().hdr.rpcVersion = rpcMajorVersion ();
  231.     pdu.response ().hdr.rpcMinorVersion = rpcMinorVersion ();
  232.     pdu.response ().hdr.packetType = RPC_CN_PKT_RESPONSE;
  233.     pdu.response ().hdr.flags = RPC_CN_FLAGS_FIRST_FRAG |
  234.   RPC_CN_FLAGS_LAST_FRAG;
  235.     pdu.response ().hdr.callId = request.callId ();
  236.     pdu.response ().allocHint  = 0; // XXX fix up later
  237.     pdu.response ().presCtxId  = request.request().presCtxId;
  238.     pdu.response ().alertCount = 0;
  239.     pdu.response ().reserved   = 0;
  240.     }
  241. void
  242. RpcPduFactory::formatBindPdu
  243.     (
  244.     RpcPdu& result,
  245.     REFIID riid,
  246.     ULONG callId,
  247.     ULONG assocGroupId,
  248.     bool alterCtxt,
  249.     USHORT ctxId
  250.     )
  251.     {
  252.     // Build BIND packet
  253.     result.bind().hdr.rpcVersion = rpcMajorVersion ();
  254.     result.bind().hdr.rpcMinorVersion = rpcMinorVersion ();
  255.     if (alterCtxt)
  256.         result.bind().hdr.packetType = RPC_CN_PKT_ALTER_CONTEXT;
  257.     else
  258.         result.bind().hdr.packetType = RPC_CN_PKT_BIND;
  259.     result.bind().hdr.flags = 0;
  260.     result.bind().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  261.     result.bind().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  262.     result.bind().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  263.     result.bind().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  264.     result.bind().hdr.callId = callId;
  265.     result.bind().maxTxFrag = RpcPdu::MAXLEN;
  266.     result.bind().maxRxFrag = RpcPdu::MAXLEN;
  267.     result.bind().assocGroupId = assocGroupId;
  268.     result.bind().presCtxList.numCtxElems = 1;
  269.     result.bind().presCtxList.presCtxElem [0].abstractSyntax.id = riid;
  270.     result.bind().presCtxList.presCtxElem [0].abstractSyntax.version = 0;
  271.     result.bind().presCtxList.presCtxElem [0].presCtxId = ctxId;
  272.     result.bind().presCtxList.presCtxElem [0].nTransferSyntaxes = 1;
  273.     result.bind().presCtxList.presCtxElem [0].transferSyntax [0].id = DCOM_XFER_SYNTAX;
  274.     result.bind().presCtxList.presCtxElem [0].transferSyntax [0].version = 2;
  275.     }
  276. //////////////////////////////////////////////////////////////////////////
  277. //
  278. void
  279. RpcPduFactory::formatRequestPdu
  280.     (
  281.     RpcPdu& result,
  282.     ULONG callId,
  283.     USHORT opnum,
  284.     const GUID* pObjectUuid,
  285.     USHORT              presCtxId
  286.     )
  287.     {
  288.     result.request().hdr.rpcVersion = rpcMajorVersion ();
  289.     result.request().hdr.rpcMinorVersion = rpcMinorVersion ();
  290.     result.request().hdr.packetType = RPC_CN_PKT_REQUEST;
  291.     result.request().hdr.flags = RPC_CN_FLAGS_FIRST_FRAG |
  292.  RPC_CN_FLAGS_LAST_FRAG;
  293.     if (pObjectUuid)
  294.         {
  295.         result.request().hdr.flags |= RPC_CN_FLAGS_OBJECT_UUID;
  296.         result.request().objectId = *pObjectUuid;
  297.         }
  298.     result.request().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  299.     result.request().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  300.     result.request().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  301.     result.request().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  302.     result.request().hdr.fragLen = 0; // fix later
  303.     result.request().hdr.authLen = 0;
  304.     result.request().hdr.callId = callId;
  305.     result.request().allocHint = 0; // fixed up later
  306.     result.request().presCtxId = presCtxId;
  307.     result.request().methodNum = opnum;
  308.     }
  309. //////////////////////////////////////////////////////////////////////////
  310. //
  311. void
  312. RpcPduFactory::formatAuth3Pdu
  313.     (
  314.     RpcPdu& pdu,
  315.     ULONG callId
  316.     )
  317.     {
  318.     pdu.auth3().hdr.rpcVersion = rpcMajorVersion ();
  319.     pdu.auth3().hdr.rpcMinorVersion = rpcMinorVersion ();
  320.     pdu.auth3().hdr.packetType = RPC_CN_PKT_AUTH3;
  321.     pdu.auth3().hdr.flags = RPC_CN_FLAGS_FIRST_FRAG |
  322.      RPC_CN_FLAGS_LAST_FRAG;
  323.     pdu.auth3().hdr.drep [0] = VXDCOM_NDR_DATAREP0;
  324.     pdu.auth3().hdr.drep [1] = VXDCOM_NDR_DATAREP1;
  325.     pdu.auth3().hdr.drep [2] = VXDCOM_NDR_DATAREP2;
  326.     pdu.auth3().hdr.drep [3] = VXDCOM_NDR_DATAREP3;
  327.     pdu.auth3().hdr.fragLen = 0; // fix later
  328.     pdu.auth3().hdr.authLen = 0;
  329.     pdu.auth3().hdr.callId = callId;
  330.     pdu.auth3().maxTxFrag = RpcPdu::MAXLEN;
  331.     pdu.auth3().maxRxFrag = RpcPdu::MAXLEN;
  332.     }