The type_UserSize Function

The <type>_UserSize function is a helper function for the wire_marshal and user_marshal attributes.The stubs call this function to size the rpc data buffer for the user data object before data is marshaled on the client or server side. The function is defined as:

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long             StartingSize,
    <type>  __RPC_FAR *       pMyObj);
 

The <type> in the function name means the userm-type, as specified in the wire_marshal or user_marshal type definition. This type may be nonremotable or even, when used with the user_marshal attribute, a type unknown to the MIDL compiler. The wire type name (the name of the transmissible type) is not used in the function prototype. Note, however, that the wire type defines the wire layout for the data as specified by OSF DCE.

The pFlags argument is a pointer to an unsigned long flag field.The upper word of the flag contains NDR data representation flags as defined by OSF DCE for floating point, endianess, and character representations. The lower word contains a marshaling context flag as defined by the COM channel. The exact layout of the flags within the field is:

Bits Flag Value
31-24 Floating-point representation 0 = IEEE
1 = VAX
2 = Cray
3 = IBM
23-20 Integer and floating-point byte order 0 = Big-endian
1 = Little-endian
19-16 Character representation 0 = ASCII
1 = EBCDIC
15-0 Marshaling context flag 0 = MSHCTX_LOCAL
1 = MSHCTX_NOSHAREDMEM
2 = MSHCTX_DIFFERENTMSCHINE
3 = MSHCTX_INPROC

The marshaling context flag makes it possible to alter the behavior of your routine depending on the context for the RPC call. For example, if you have a handle (long) to a block of data, you could send the handle for an in-process call, but you would send the actual data for a call to a different machine.

The marshaling context flag and its values are defined in the wtypes.h and wtypes.idl files in the Win32 SDK.

Note  When the wire type is properly defined, you do not have to use the NDR Data Representation flags, as the NDR engine performs the necessary conversions. The flags and their values are shown here solely for interest.

The StartingSize argument is the current buffer offset. The starting size indicates the buffer offset for the user object and it may or may not be aligned properly. Your routine should account for whatever padding is necessary.

The pMyObj argument is a pointer to a user type object.

The return value is the new offset or buffer position. The function should return the cumulative size, which is the starting size plus possible padding plus the data size.

The <type>_UserSize function can return an overestimate of the size needed. The actual size of the sent buffer is defined by the data size, not by the buffer allocation size.

The <type>_UserSize function is not called if the wire size can be computed at compile time. Note that for most unions, even if there are no pointers, the actual size of the wire representation can be determined only at run time.

See also

Marshaling rules for user_marshal and wire_marshal, user_marshal, wire_marshal