标头
以下标头表示可由当前版本的 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 成员。
HasNotify 和 HasNotify2 标志指示例程分别使用 [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;