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

VxWorks

开发平台:

C/C++

  1. /* orpcLib.cpp -- DCOM / ORPC interface functions */
  2. /* Copyright (c) 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 02z,17dec01,nel  Add include symbol for diab.
  7. 02y,13jul01,dbs  fix up includes
  8. 02x,15feb00,dbs  fix ORPCTHIS (un)marshaling
  9. 02w,08feb00,dbs  update struct-descs to latest NDR impl
  10. 02v,14sep99,dbs  use newest NDR marshaling routines
  11. 02u,19aug99,aim  change assert to VXDCOM_ASSERT
  12. 02t,12aug99,dbs  comply with new NDR struct support
  13. 02s,30jul99,dbs  tighten up type-safety of NDR types
  14. 02r,30jul99,dbs  fix cstruct initialiser to bind to address
  15. 02q,16jul99,dbs  fix possible alignment problem in ipid/oid conversions
  16. 02p,12jul99,dbs  always use method of ORPC_EXTENT_ARRAY to allocate storage
  17.                  when unmarshaling, manually unmarshal extents
  18. 02o,09jul99,dbs  removing obsolete files (Scm.h) and obsolete code
  19. 02n,07jul99,dbs  fix comments in line with previous change
  20. 02m,07jul99,dbs  fix (un)marshaling of ORPCTHIS extents
  21. 02l,24jun99,dbs  move authn into new class
  22. 02k,17jun99,aim  changed assert to assert
  23. 02j,17jun99,dbs  change to COM_MEM_ALLOC
  24. 02i,07jun99,dbs  need to include stdlib
  25. 02h,02jun99,dbs  use new OS-specific macros
  26. 02g,01jun99,dbs  fix error condition handling
  27. 02f,28may99,dbs  simplify allocator usage
  28. 02e,28may99,dbs  remove obsolete include
  29. 02d,27may99,dbs  check method number is in range
  30. 02c,27may99,dbs  change to vxdcomTarget.h
  31. 02b,25may99,dbs  make sure PDUs are deleted after use
  32. 02a,19may99,dbs  change orpcListenTaskCreate to orpcEndpointCreate
  33. 01z,19may99,dbs  add ORPC_EXTENT marshalers
  34. 01y,18may99,dbs  remove old marshaling scheme
  35. 01x,10may99,dbs  simplify rpc-binding usage
  36. 01w,07may99,dbs  move major functionality into this lib
  37. 01v,30apr99,dbs  change name of ComSCM to SCM
  38. 01u,29apr99,dbs  fix -Wall warnings
  39. 01t,28apr99,dbs  init RPCOLEMESSAGE with RPC-channel in rpcCallback
  40. 01s,26apr99,aim  added TRACE_CALL
  41. 01r,22apr99,dbs  tidy up potential leaks
  42. 01q,21apr99,dbs  change RPCMSG to RPCPDU
  43. 01p,21apr99,dbs  add length arg to orpcDSAFormat()
  44. 01o,13apr99,dbs  fix VxSocket usage
  45. 01n,09apr99,drm  adding diagnostic output
  46. 01m,12mar99,dbs  add IOXIDResolver support
  47. 01l,01mar99,dbs  help tidy up RPC startup
  48. 01k,15feb99,dbs  move ORPC dispatch into orpcLib
  49. 01j,10feb99,dbs  improve handling of endpoints
  50. 01i,08feb99,dbs  formalise naming convention and ORPC/RPC interface
  51. 01h,04feb99,dbs  change wchar_t to OLECHAR
  52. 01g,22jan99,dbs  move some stuff into new rpcLib
  53. 01f,22dec98,dbs  improve ORPC interface
  54. 01e,18dec98,dbs  fix after changes for VXCOM
  55. 01d,16dec98,dbs  add flag to control packet-printing, remove
  56.                  obsolete NDR-related code.
  57. 01c,10dec98,dbs  format packet headers for NDR
  58. 01b,07dec98,dbs  handle return-codes correctly in many cases.
  59. 01a,11nov98,dbs  created
  60. */
  61. /*
  62.   DESCRIPTION:
  63.   This library implements some parts of the ORPC functionality which
  64.   do not reside in any of the implementation classes (yet - in future
  65.   it will hopefully become obsolete) and deals mainly with the
  66.   provision of endpoints.
  67.   */
  68. #include <stdio.h>
  69. #include "orpcLib.h"
  70. #include "SCM.h"
  71. #include "private/comMisc.h"
  72. #include "RpcPdu.h"
  73. #include "NdrStreams.h"
  74. /* Include symbol for diab */
  75. extern "C" int include_vxdcom_orpcLib (void)
  76.     {
  77.     return 0;
  78.     }
  79. NdrTypeDesc StructDesc__GUID(NDRTYPES&);
  80. //////////////////////////////////////////////////////////////////////////
  81. //
  82. // Globals...
  83. //
  84. const GUID DCOM_XFER_SYNTAX = 
  85.     {0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}};
  86. ////////////////////////////////////////////////////////////////////////////
  87. //
  88. // orpcIpidCreate -- create an IPID (Interface Pointer ID) given the
  89. // interface pointer value, and the OID of the object it points to.
  90. //
  91. IPID orpcIpidCreate (void* itf, OID oid)
  92.     {
  93.     GUID ipid;
  94.     ipid.Data1 = (DWORD) itf;
  95.     ipid.Data2 = 0;
  96.     ipid.Data3 = 0;
  97.     memcpy (ipid.Data4, &oid, sizeof(OID));
  98.     
  99.     return ipid;
  100.     }
  101. ////////////////////////////////////////////////////////////////////////////
  102. //
  103. // orpcOidFromIpid -- given an IPID (created by orpcIpidCreate())
  104. // return the OID of the object represented by that IPID.
  105. //
  106. OID orpcOidFromIpid (REFIPID ipid)
  107.     {
  108.     OID oid;
  109.     ::memcpy (&oid, ipid.Data4, sizeof (oid));
  110.     return oid;
  111.     }
  112. //////////////////////////////////////////////////////////////////////////
  113. //
  114. // orpcDSAFormat -- format a DUALSTRINGARRAY given the address and
  115. // security info in string format. The address info should have the
  116. // PROTSEQ in the first character, followed by the NULL-terninated
  117. // address. An extra NULL is appended, followed by the security info,
  118. // followed by two NULLs. As there is no security support, we ignore
  119. // the arg...
  120. //
  121. // Assumes the memory pointer-to by 'pdsa' is large enough to handle
  122. // the information...
  123. //
  124. HRESULT orpcDSAFormat
  125.     (
  126.     DUALSTRINGARRAY* pdsa,
  127.     DWORD dsaLen,
  128.     LPCOLESTR addrInfo,
  129.     LPCOLESTR secInfo
  130.     )
  131.     {
  132.     TRACE_CALL;
  133.     OLECHAR* p = pdsa->aStringArray;
  134.     size_t addrLen=0;
  135.     size_t secLen=0;
  136.     // Length check...
  137.     if (addrInfo)
  138. addrLen = vxcom_wcslen (addrInfo);
  139.     if (secInfo)
  140. secLen = vxcom_wcslen (secInfo);
  141.     if ((addrLen + secLen + 4) > dsaLen)
  142. return E_FAIL;
  143.     
  144.     if (addrInfo)
  145. {
  146. // Write address-info wide-chars into DSA...
  147. vxcom_wcscpy (p, addrInfo);
  148. p += addrLen;
  149. }
  150.     
  151.     // Write 2 terminating NULLs...
  152.     *p++ = 0;
  153.     *p++ = 0;
  154.     // Set security-offset...
  155.     pdsa->wSecurityOffset = p - pdsa->aStringArray;
  156.     if (secInfo)
  157. {
  158. // Write security-info wide-chars into DSA...
  159. vxcom_wcscpy (p, secInfo);
  160. p += secLen;
  161. }
  162.     
  163.     // Write 2 terminating NULLs...
  164.     *p++ = 0;
  165.     *p++ = 0;
  166.     // Set size...
  167.     pdsa->wNumEntries = p - pdsa->aStringArray;
  168.     return S_OK;
  169.     }
  170. //////////////////////////////////////////////////////////////////////////
  171. //
  172. // ndrMarshalOBJREF -- marshal an OBJREF into a marshaling stream...
  173. //
  174. HRESULT ndrMarshalOBJREF (NdrMarshalStream* pms, OBJREF* pObjRef)
  175.     {
  176.     NDRTYPES ndrtypes;
  177.     
  178.     // OBJREF header first...
  179.     widlMarshal (&pObjRef->signature, pms, ndrtypes.ulong_t ());
  180.     widlMarshal (&pObjRef->flags, pms, ndrtypes.ulong_t ());
  181.     widlMarshal (&pObjRef->iid, pms, StructDesc__GUID(ndrtypes));
  182.     // Now union part, depending on flags-field...
  183.     if (pObjRef->flags != OBJREF_STANDARD)
  184. return E_NOTIMPL;
  185.     // Fields of STDOBJREF...
  186.     STDOBJREF* pStd = &pObjRef->u_objref.u_standard.std;
  187.     
  188.     widlMarshal (&pStd->flags, pms, ndrtypes.ulong_t ());
  189.     widlMarshal (&pStd->cPublicRefs, pms, ndrtypes.ulong_t ());
  190.     widlMarshal (&pStd->oxid, pms, ndrtypes.longlong_t ());
  191.     widlMarshal (&pStd->oid, pms, ndrtypes.longlong_t ());
  192.     widlMarshal (&pStd->ipid, pms, StructDesc__GUID(ndrtypes));
  193.     // DUALSTRINGARRAY - in a std OBJREF this is marshaled as
  194.     // contiguous USHORTs, with no preceding length field...
  195.     DUALSTRINGARRAY* pdsa = &pObjRef->u_objref.u_standard.saResAddr;
  196.     widlMarshal (&pdsa->wNumEntries, pms, ndrtypes.ushort_t ());
  197.     widlMarshal (&pdsa->wSecurityOffset, pms, ndrtypes.ushort_t ());
  198.     return widlMarshal (pdsa->aStringArray,
  199. pms,
  200. ndrtypes.array_t (ndrtypes.ushort_t (),
  201.   NDR_SIZEOF(short),
  202.   pdsa->wNumEntries));
  203.     }
  204. //////////////////////////////////////////////////////////////////////////
  205. //
  206. HRESULT ndrUnmarshalOBJREF (NdrUnmarshalStream* pus, OBJREF* pObjRef)
  207.     {
  208.     NDRTYPES ndrtypes;
  209.     
  210.     // OBJREF header first...
  211.     widlUnmarshal (&pObjRef->signature, pus, ndrtypes.ulong_t ());
  212.     widlUnmarshal (&pObjRef->flags, pus, ndrtypes.ulong_t ());
  213.     widlUnmarshal (&pObjRef->iid, pus, StructDesc__GUID(ndrtypes));
  214.     // Now union part, depending on flags-field...
  215.     if (pObjRef->flags != OBJREF_STANDARD)
  216. return E_NOTIMPL;
  217.     // Fields of STDOBJREF...
  218.     STDOBJREF* pStd = &pObjRef->u_objref.u_standard.std;
  219.     
  220.     widlUnmarshal (&pStd->flags, pus, ndrtypes.ulong_t ());
  221.     widlUnmarshal (&pStd->cPublicRefs, pus, ndrtypes.ulong_t ());
  222.     widlUnmarshal (&pStd->oxid, pus, ndrtypes.longlong_t ());
  223.     widlUnmarshal (&pStd->oid, pus, ndrtypes.longlong_t ());
  224.     widlUnmarshal (&pStd->ipid, pus, StructDesc__GUID(ndrtypes));
  225.     // DUALSTRINGARRAY - in a std OBJREF this is marshaled as
  226.     // contiguous USHORTs, with no preceding length field...
  227.     DUALSTRINGARRAY* pdsa = &pObjRef->u_objref.u_standard.saResAddr;
  228.     widlUnmarshal (&pdsa->wNumEntries, pus, ndrtypes.ushort_t ());
  229.     widlUnmarshal (&pdsa->wSecurityOffset, pus, ndrtypes.ushort_t ());
  230.     return widlUnmarshal (pdsa->aStringArray,
  231.   pus,
  232.   ndrtypes.array_t (ndrtypes.ushort_t (),
  233.     NDR_SIZEOF(short),
  234.     pdsa->wNumEntries));
  235.     }
  236. //////////////////////////////////////////////////////////////////////////
  237. //
  238. // Declare type-desc function for externally defined structures.
  239. //
  240. NdrTypeDesc StructDesc_tagORPCTHIS (NDRTYPES& ndrtypes);
  241.     
  242. //////////////////////////////////////////////////////////////////////////
  243. //
  244. // ndrMarshalORPCTHIS -- marshal an ORPCTHIS
  245. //
  246. // This routine marshals an ORPCTHIS, which may also contain an
  247. // ORPC_EXTENT_ARRAY.  In the NDR specification, a structure with a
  248. // conformant array has the maximum count marshalled first, followed
  249. // by the members of the structure, and then finally the elements of
  250. // the array.  In the NDR specification, arrays of pointers are
  251. // marshalled with the representations deferred.  That is, an array of
  252. // pointers is marshalled as an array of arbitrary referent IDs
  253. // followed by the deferred representations.
  254. //
  255. // Thus, with the DCOM spec as reference, the ORPC_EXTENT_ARRAY is
  256. // marshalled as follows:-
  257. //
  258. //  Type          Contents
  259. //  ----------    -------------------------------------
  260. //  ulong        'size' structure member // ORPC_EXTENT_ARRAY
  261. //  ulong        'reserved' structure member (must be 0)// ORPC_EXTENT_ARRAY
  262. //  ulong        'extent' structure member // ORPC_EXTENT_ARRAY
  263. //  ulong        array-size (rounded up to multiple of 2)
  264. //  long         referent ID 1 // ORPC_EXTENT_ARRAY
  265. //                   ... // ORPC_EXTENT_ARRAY
  266. //                   ... // ORPC_EXTENT_ARRAY
  267. //  long         referent ID n ((size+1) & ~1) // ORPC_EXTENT_ARRAY
  268. //
  269. // To marshal the ORPC_EXTENT values, according to the NDR
  270. // specification, the marshalled format is as follows:
  271. // 
  272. //  Type          Contents
  273. //  ----------    -------------------------------------
  274. //  long         size_is of 'data' array  // ORPC_EXTENT
  275. //  GUID         id // ORPC_EXTENT
  276. //  ulong        'size' structure member // ORPC_EXTENT
  277. //  byte  'data' byte 1 // ORPC_EXTENT
  278. //                  ... // ORPC_EXTENT
  279. //                  ... // ORPC_EXTENT
  280. //  byte         'data' byte n  // ORPC_EXTENT
  281. //
  282. // 
  283. //
  284. // RETURNS: S_OK if successful and an HRESULT indicating error otherwise
  285. // 
  286. // HRESULT:
  287. // .iP S_OK
  288. // The operation was successful.
  289. //
  290. // SEE ALSO: ndrUnmarshalORPCTHIS()
  291. // 
  292. // nomanual
  293. //
  294. HRESULT ndrMarshalORPCTHIS
  295.     (
  296.     NdrMarshalStream* pStrm,
  297.     ORPCTHIS* pOrpcThis
  298.     )
  299.     {
  300.     TRACE_CALL;
  301.     NDRTYPES ndrtypes;
  302.     
  303.     return widlMarshal (pOrpcThis, pStrm, StructDesc_tagORPCTHIS(ndrtypes));
  304.     }
  305. //////////////////////////////////////////////////////////////////////////
  306. //
  307. // ndrUnmarshalORPCTHIS -- unmarshal an ORPCTHIS structure from an
  308. // NDR-stream. This function does not use the NdrTypes 'cstruct' class
  309. // to do its unmarshaling, instead it does it 'manually' because the
  310. // NDR-engine is designed for use with plain structures, whereas the
  311. // ORCPTHIS, ORPC_EXTENT and ORPC_EXTENT_ARRAY are actually C++
  312. // classes, and so cannot be manipulated with raw-memory operations
  313. // (due to destructors being called, etc).
  314. //
  315. // Also, the ORPCTHIS dtor will try to free all memory it thinks it
  316. // owns, but the NDR-engine will economise by simply pointing into the
  317. // unmarshaling buffer in the stub-unmarshal phase, which effectively
  318. // would leave a non-heap pointer inside the ORPCTHIS structures, and
  319. // casue problems when the dtor fired.
  320. //
  321. HRESULT ndrUnmarshalORPCTHIS
  322.     (
  323.     NdrUnmarshalStream* pStrm,
  324.     ORPCTHIS* pOrpcThis
  325.     )
  326.     {
  327.     TRACE_CALL;
  328.     NDRTYPES ndrtypes;
  329.     return widlUnmarshal (pOrpcThis, pStrm, StructDesc_tagORPCTHIS(ndrtypes));
  330.     }