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.

(-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 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.

Streamlining delle intestazioni per le prestazioni

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;