使用英语阅读

通过


标头

以下标头表示可由当前版本的 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 开始的扩展: <8> 个用于 32 位, <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 成员指示是否以编译器生成的格式字符串使用新的相关描述符。 新的关联描述符与拒绝攻击功能相关。 当例程需要指示端的关联检查时,将设置 ClientCorrCheck 和 ServerCorrCheck 成员。

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

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

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

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

备注

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

 

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

 

00 和 11 是位的无效值。

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

标头简化性能

为了简化代码并提高性能,编译器会尽可能尝试生成固定大小的标头。 具体而言,以下标头用于异步 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;