3.1.1.5.4 ORPC Invocations

Object exporters MUST process ORPC invocations. An ORPC invocation is the receipt of an RPC request with an object UUID field set to a non-GUID_NULL value, which is interpreted as an IPID. The ORPC invocation specifies a method number (opnum), an ORPCTHIS, and a list of arguments to the method.

Upon receipt of an ORPC request, the object exporter MUST perform the following:

  • It MUST perform capability negotiation as discussed in section 1.7; specifically, it MUST return RPC_E_VERSION_MISMATCH (as specified in [MS-ERREF] section 2.1) if the client has a higher COM minor version or a different COM major version.

  • If the object exporter requires security on the incoming ORPC, the object exporter MUST check the security settings on the incoming ORPC as follows:

    • If the authentication level of the incoming ORPC is lower than the authentication level of the object exporter, the object exporter MUST return E_ACCESSDENIED or ERROR_ACCESS_DENIED. The return error code is chosen in an implementation-specific manner.<40>

    • The authentication level of the object exporter MUST be the value specified by the application or the higher-level protocol (see section 3.1.1.4). If the value is not specified by the application or higher-level protocol, it MUST be the default value obtained in an implementation-specific manner.<41>

    • The object exporter MUST check if the client has the permissions to make the ORPC request. If the permissions are not granted, the object exporter MUST return E_ACCESSDENIED or ERROR_ACCESS_DENIED. The return code is chosen in an implementation-specific manner.<42>

    • The permissions of the object exporter MUST be the value specified by the application or the higher-level protocol (see section 3.1.1.4). If the value is not specified by the application or the higher-level protocol, it MUST be the default value obtained in an implementation-specific manner.<43>

  • If the flags field of the ORPCTHIS parameter contains a value other than 0x00000000, the object exporter MUST return RPC_E_INVALID_HEADER.

  • It MUST use the cid field of the ORPCTHIS parameter to determine if the incoming ORPC belongs to the same causality chain as that of a currently executing outgoing ORPC (see section 1.3.5).

    • If yes, the object exporter MUST process the incoming ORPC.

    • Otherwise, the object exporter MAY delay the processing of the incoming ORPC until the currently executing outgoing ORPC completes. It might do this to prevent re-entrancy in the application.<44>

  • It MAY process the extensions fields in the ORPCTHIS implicit input parameter.<45>

  • It MUST look up the IPID entry identified by the IPID in the RPC UUID field. If the IPID entry is not found, the object exporter MUST return RPC_E_DISCONNECTED (as specified in [MS-ERREF] section 2.1).

  • It MUST unmarshal input parameters that are object reference types, as specified in section 3.1.1.5.3.

  • It MUST invoke the application-specified state in the IPID entry using the opnum and input parameters specified in the RPC request.

  • It MUST return the output parameters from the application in the RPC response.

  • It MUST look up the OID entry and set the last ORPC invocation time to the current time.

  • It MAY return the extensions field in the ORPCTHAT implicit output parameter.<46>

  • If an object is returned as a parameter from the ORPC, the object exporter MUST marshal the object (see section 3.1.1.5.1).

  • If an object reference is returned as a parameter from the ORPC, the object exporter MUST marshal the object reference (see section 3.1.1.5.2).<47>