3.2.4.3 Marshaling an Object Reference

When a DCOM application sends an object reference in an ORPC invocation, it MUST supply the IPID. To marshal the object reference, the client MUST do the following:

  • It MUST look up the IPID entry using the IPID.

  • It MUST look up the OID entry using the OID from the IPID entry.

  • It MUST look up the Resolver table entry using the STRINGBINDING hash from the OID entry.

  • It MUST create an STDOBJREF instance as follows:

    • It MUST set the flags field to SORF_NOPING if the garbage_collection flag in the OID entry is True. Otherwise, it MUST set the flags field to 0.

    • If the IPID entry contains more than one public reference count, it SHOULD decrement the public reference count of the IPID entry and set cPublicRefs to 1.

    • Otherwise, it MUST request additional reference counts for the object reference, as specified in section 3.2.4.4.1.

    • It MUST set the oxid field in the STDOBJREF instance to the value of the OXID from the IPID entry.

    • It MUST set the oid field in the STDOBJREF instance to the value of the OID from the IPID entry.

    • It MUST set the ipid field in the STDOBJREF instance to the value of the IPID specified by the DCOM application.

  • It MUST create an OBJREF_STANDARD instance as follows:

    • It MUST set the std field to the STDOBJREF instance created previously.

    • It MUST set the saResAddr field to the DUALSTRINGARRAY from the Resolver table entry.

  • It MUST create an OBJREF instance as follows:

    • It MUST set the signature field to 0x574f454d.

    • It MUST set the flags field to OBJREF_STANDARD.

    • It MUST set the iid field to the IID from the IPID entry.

    • It MUST set the u_objref to the OBJREF_STANDARD created previously.

  • It MUST use NDR to marshal the OBJREF into a MInterfacePointer that is placed in the RPC PDU body.