O cabeçalho

O cabeçalho a seguir representa um dos estilos de cabeçalho que podem ser gerados pela versão atual do MIDL. Para sua conveniência, a lista completa de campos de cabeçalho é fornecida aqui.

(–Cabeçalho 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>

Extensões a partir do 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> ]

O extension_version<1> fornece o tamanho da seção de extensão, em bytes. Isso possibilita que o mecanismo de NDR atual percorra a seção de extensão corretamente, mesmo que a seção venha de uma versão posterior do compilador com mais campos do que o mecanismo atual entende.

As INTERPRETER_OPT_FLAGS2 são definidas da seguinte maneira:

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;

O membro HasNewCorrDesc indica se novos descritores de correlação são usados nas cadeias de caracteres de formato geradas pelo compilador. O novo descritor de correlação está relacionado à funcionalidade de negação de ataque. Os membros ClientCorrCheck e ServerCorrCheck são definidos quando a rotina precisa da correlação marcar no lado indicado.

Os sinalizadores HasNotify e HasNotify2 indicam que a rotina usa o recurso de notificação conforme definido pelos atributos [notify] e [notify_flag] , respectivamente.

O membro ClientCorrHint é uma dica de tamanho de cache no lado do cliente e ServerCorrHint é uma dica no lado do servidor. Quando o tamanho sai como zero, um tamanho padrão deve ser usado.

O elemento NotifyIndex é um índice para uma rotina de notificação, se um for usado.

O elemento FloatDoubleMask aborda o problema de um argumento de ponto flutuante para Windows de 64 bits. Esse campo é gerado apenas para stubs de 64 bits. A máscara é necessária para as rotinas de assembly que baixam/carregam registros de/para a pilha virtual para lidar com argumentos de ponto flutuante e registra corretamente. A máscara consiste em 2 bits por argumento ou, em vez disso, por registro de ponto flutuante. A codificação é a seguinte: os bits menos significativos correspondem ao primeiro registro fp, os próximos 2 bits correspondem ao segundo registro e assim por diante.

Observação

Para rotinas de objeto, o primeiro argumento acaba no segundo registro devido a esse ponteiro ser o primeiro. Para cada registro, o significado de bits é conforme mostrado na tabela a seguir.

 

Bits Significado
01 Um valor float deve ser carregado no registro.
10 Um valor duplo deve ser carregado no registro.

 

00 e 11 são valores inválidos para os bits.

Atualmente, há oito registros FP em um processador intel architecture de 64 bits, portanto, a máscara pode ter apenas 16b bits mais baixos definidos. O tamanho da máscara foi definido como um total de 16 bits com base na máscara do compilador C permanecendo inalterada.

Otimização de cabeçalho para desempenho

Para simplificar o código e melhorar o desempenho, o compilador tenta gerar um cabeçalho de tamanho fixo sempre que possível. Em particular, o seguinte cabeçalho é usado para DCOM assíncrono:

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;