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>