标头

以下标头表示可由当前版本的 MIDL 生成的标头样式之一。 为方便起见,此处提供了标题字段的完整列表。

–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>

从 Windows 2000 开始的扩展:32 位 <8>,<12> 64 位)

extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]

extension_version<1> 提供扩展节的大小(以字节为单位)。 这样做使当前 NDR 引擎能够正确单步执行扩展部分,即使该部分来自具有比当前引擎理解的字段更多的更高版本的编译器版本。

INTERPRETER_OPT_FLAGS2的定义如下:

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;

HasNewCorrDesc 成员指示是否在编译器生成的格式字符串中使用新的关联描述符。 新的关联描述符与拒绝攻击功能相关。 ClientCorrCheckServerCorrCheck 成员是在例程需要指示端进行关联检查时设置的。

HasNotifyHasNotify2 标志指示例程分别使用 [notify][notify_flag] 属性定义的通知功能。

ClientCorrHint 成员是客户端上的缓存大小提示,ServerCorrHint 是服务器端的提示。 当大小显示为零时,应使用默认大小。

如果使用通知例程,NotifyIndex 元素是通知例程的索引。

FloatDoubleMask 元素解决了 64 位 Windows 浮点参数的问题。 此字段仅为 64 位存根生成。 下载/将寄存器从虚拟堆栈下载/上传到虚拟堆栈的程序集例程需要掩码才能正确处理浮点参数和注册。 掩码由每个参数 2 位组成,或者每个浮点寄存器包含 2 位。 编码如下所示:最小有效位对应于第一个 FP 寄存器,接下来的 2 位对应于第二个寄存器,依此等。

注意

对于对象例程,第一个参数最终出现在第二个寄存器中,因为此指针是第一个。 对于每个寄存器,位的含义如下表所示。

 

意义
01 应将浮点值加载到寄存器。
10 应将双精度值加载到寄存器。

 

00 和 11 是位的无效值。

目前 Intel 体系结构 64 位处理器中有 8 个 FP 寄存器,因此掩码只能设置 16b 最低位。 掩码大小已设置为总共 16 位,具体取决于 C 编译器掩码保持不变。

性能的标头精简

为了简化代码并提高性能,编译器会尽可能尝试生成固定大小的标头。 具体而言,以下标头用于异步 DCOM:

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;