Condividi tramite


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;