Intestazione
L'intestazione seguente rappresenta uno degli stili di intestazione che possono essere generati dalla versione corrente di MIDL. Per praticità, l'elenco completo dei campi di intestazione è disponibile qui.
( intestazione–Oif)
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>
Estensioni a partire da Windows 2000: <8> per 32 bit, <12> per 64 bit)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
Il extension_version<1> fornisce le dimensioni della sezione dell'estensione, in byte. In questo modo è possibile che il motore NDR corrente passi correttamente sulla sezione dell'estensione anche se la sezione dovesse provenire da una versione successiva del compilatore con più campi rispetto al motore corrente.
I INTERPRETER_OPT_FLAGS2 sono definiti come segue:
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;
Il membro HasNewCorrDesc indica se vengono utilizzati nuovi descrittori di correlazione nelle stringhe di formato generate dal compilatore. Il nuovo descrittore di correlazione è correlato alla funzionalità Denial of Attack. I membri clientCorrCheck e ServerCorrCheck vengono impostati quando la routine richiede il controllo di correlazione sul lato indicato.
I flag HasNotify e HasNotify2 indicano che la routine usa la funzionalità di notifica come definito rispettivamente dagli attributi [notify] e [notify_flag].
Il membro ClientCorrHint è un hint per le dimensioni della cache sul lato client e ServerCorrHint è un hint sul lato server. Quando le dimensioni escono come zero, è consigliabile usare una dimensione predefinita.
L'elemento NotifyIndex è un indice di una routine di notifica, se ne viene usato uno.
L'elemento FloatDoubleMask risolve il problema di un argomento a virgola mobile per Windows a 64 bit. Questo campo viene generato solo per gli stub a 64 bit. La maschera è necessaria per le routine di assembly che scaricano/caricano registri da/verso lo stack virtuale per gestire correttamente gli argomenti a virgola mobile e i registri. La maschera è costituita da 2 bit per argomento o da un registro a virgola mobile. La codifica è la seguente: i bit meno significativi corrispondono al primo registro FP, i 2 bit successivi corrispondono al secondo registro e così via.
Nota
Per le routine dell'oggetto, il primo argomento termina nel secondo registro a causa del primo puntatore. Per ogni registro il significato dei bit è come illustrato nella tabella seguente.
Bit | Significato |
---|---|
01 | Un valore float deve essere caricato nel registro. |
10 | Un valore doppio deve essere caricato nel registro. |
00 e 11 non sono valori validi per i bit.
Attualmente sono presenti otto registri FP in un processore Intel Architecture a 64 bit, quindi la maschera può avere solo 16b bit minimi impostati. La dimensione della maschera è stata impostata su un totale di 16 bit in base alla maschera del compilatore C rimasta invariata.
Streamlining dell'intestazione per le prestazioni
Per semplificare il codice e migliorare le prestazioni, il compilatore tenta di generare un'intestazione a dimensione fissa quando possibile. In particolare, l'intestazione seguente viene usata per DCOM asincrono:
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;