Serialización del usuario
Las referencias de usuario tienen una cadena de formato similar a transmit_as:
FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>
<Los marcadores 1> byte constan del nibble de la bandera superior y del níbble de alineación inferior.
Los 2 bits superiores de la marca nibble se usan para describir si el tipo de cable se define como un puntero único, puntero de referencia o ningún puntero (no puede ser un ptr). Se han definido los siguientes manifiestos para establecer o obtener las marcas:
#define USER_MARSHAL_UNIQUE 0x80
#define USER_MARSHAL_REF 0x40
#define USER_MARSHAL_POINTER 0xc0 /* unique or ref */
#define USER_MARSHAL_IID 0x20 /* JIT compiler only */
La alineación de la palabra de marca mantiene la alineación del cable del tipo transmitido.
El quadruple_index<2> es un índice de la rutina de devolución de llamada cuádruple de las funciones de serialización de usuario. Las posiciones rutinarias son las siguientes: ajuste de tamaño, serialización, desmarco y rutina de liberar.
El user_type_memory_size<2> proporciona un tamaño para el tipo específico del usuario, incluidos los tipos desconocidos.
El transmitted_type_buffer_size<2> es cero cuando el tamaño es variable o el tamaño fijo real. Se trata de una optimización que permite a MIDL omitir las devoluciones de llamada al cambiar el tamaño del búfer y también al liberar.
Intervalo
La comprobación [range] proporciona medios adicionales para la validación de argumentos en la capa NDR. El descriptor [range] tiene el siguiente formato:
FC_RANGE, flags_type <1>
low value<4>
high value<4>
Las marcas toman el nibble superior y escriben el nibble inferior del segundo byte. Los valores bajos y altos dependen del tipo de la variable que se va a comprobar.
Las banderas están pensadas como un vehículo de expansión; el compilador ha estado estableciendo el nibble en cero.