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 viene fornito qui.
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 possa eseguire correttamente l'estensione anche se la sezione deve venire da una versione del compilatore successiva con più campi rispetto al motore corrente.
Le INTERPRETER_OPT_FLAGS2 sono definite 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 i nuovi descrittori di correlazione vengono usati 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 rispettivamente la funzionalità di notifica definita 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, deve essere usata una dimensione predefinita.
L'elemento NotifyIndex è un indice per 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 i registri da/allo stack virtuale per gestire correttamente gli argomenti a virgola mobile e i registri. La maschera è costituita da 2 bit per argomento o piuttosto per 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 degli oggetti, il primo argomento termina nel secondo registro a causa del primo puntatore. Per ogni registrazione il significato dei bit è illustrato nella tabella seguente.
BITS | 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 impostati. Le dimensioni della maschera sono state impostate su un totale di 16 bit in base alla maschera del compilatore C rimanente invariata.
Per semplificare il codice e migliorare le prestazioni, il compilatore tenta di generare un'intestazione di dimensione fissa ogni volta che possibile. In particolare, l'intestazione seguente viene usata per DCOM asincrona:
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;