Encabezado
El siguiente encabezado representa uno de los estilos de encabezado que puede generar la versión actual de MIDL. Para mayor comodidad, aquí se proporciona la lista completa de campos de encabezado.
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
Extensiones a partir de Windows 2000: <8> para 32 bits, <12> para 64 bits)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
El extension_version<1> proporciona el tamaño de la sección de extensión, en bytes. Al hacerlo, es posible que el motor NDR actual supere correctamente la sección de extensión incluso si la sección provenía de una versión posterior del compilador con más campos que el motor actual entiende.
El INTERPRETER_OPT_FLAGS2 se define de la siguiente manera:
typedef struct
{
unsigned char HasNewCorrDesc : 1; // 0x01
unsigned char ClientCorrCheck : 1; // 0x02
unsigned char ServerCorrCheck : 1; // 0x04
unsigned char HasNotify : 1; // 0x08
unsigned char HasNotify2 : 1; // 0x10
unsigned char Unused : 3;
} INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2;
El miembro HasNewCorrDesc indica si se usan nuevos descriptores de correlación en las cadenas de formato generadas por el compilador. El nuevo descriptor de correlación está relacionado con la funcionalidad de denegación de ataque. Los miembros ClientCorrCheck y ServerCorrCheck se establecen cuando la rutina necesita la comprobación de correlación en el lado indicado.
Las marcas HasNotify y HasNotify2 indican que la rutina usa la característica de notificación tal como se define en los atributos [notify] y [notify_flag], respectivamente.
El miembro ClientCorrHint es una sugerencia de tamaño de caché en el lado cliente y ServerCorrHint es una sugerencia en el lado servidor. Cuando el tamaño sale como cero, se debe usar un tamaño predeterminado.
El elemento NotifyIndex es un índice de una rutina de notificación, si se usa una.
El elemento FloatDoubleMask soluciona el problema de un argumento de punto flotante para Windows de 64 bits. Este campo solo se genera para códigos auxiliares de 64 bits. La máscara es necesaria para las rutinas de ensamblado que descargan o cargan registros desde o en la pila virtual para controlar los argumentos de punto flotante y se registran correctamente. La máscara consta de 2 bits por argumento o, en su lugar, por registro de punto flotante. La codificación es la siguiente: los bits menos significativos corresponden al primer registro fp, los siguientes 2 bits corresponden al segundo registro, etc.
Nota:
En el caso de las rutinas de objeto, el primer argumento termina en el segundo registro debido a que este puntero es primero. Para cada registro, el significado de bits se muestra en la tabla siguiente.
Bits | Significado |
---|---|
01 | Se debe cargar un valor float en el registro. |
10 | Se debe cargar un valor doble en el registro. |
00 y 11 son valores no válidos para los bits.
Actualmente hay ocho registros FP en un procesador intel Architecture de 64 bits, por lo que la máscara solo puede tener 16b bits más bajos establecidos. El tamaño de la máscara se ha establecido en un total de 16 bits en función de que la máscara del compilador de C permanezca sin cambios.
Optimización de encabezados para el rendimiento
Para simplificar el código y mejorar el rendimiento, el compilador intenta generar un encabezado de tamaño fijo siempre que sea posible. En concreto, se usa el siguiente encabezado para Async DCOM:
typedef struct _NDR_DCOM_OI2_PROC_HEADER
{
unsigned char HandleType; // The Oi header
INTERPRETER_FLAGS OldOiFlags; //
unsigned short RpcFlagsLow; //
unsigned short RpcFlagsHi; //
unsigned short ProcNum; //
unsigned short StackSize; //
// expl handle descr is never generated //
unsigned short ClientBufferSize; // The Oi2 header
unsigned short ServerBufferSize; //
INTERPRETER_OPT_FLAGS Oi2Flags; //
unsigned char NumberParams; //
} NDR_DCOM_OI2_PROC_HEADER, *PNDR_DCOM_OI2_PROC_HEADER;