標頭
下列標頭代表可由目前版本的 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>,<64 位的 12>)
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] 属性所定義的 notify 功能。
ClientCorrHint 成員是用戶端上的快取大小提示,ServerCorrHint 是伺服器端的提示。 當大小顯示為零時,應該使用預設大小。
如果使用通知例程,NotifyIndex 專案是通知例程的索引。
FloatDoubleMask 元素解決了 64 位 Windows 的浮點自變數問題。 此欄位只會針對 64 位存根產生。 元件例程需要遮罩,這些例程會從虛擬堆疊下載/上傳緩存器,以正確處理浮點自變數並正確註冊。 遮罩包含每個自變數的 2 位,或每個浮點緩存器。 編碼方式如下:最小有效位會對應至第一個 FP 緩存器、下一個 2 位對應至第二個緩存器等等。
注意
針對物件例程,第一個自變數最後會在第二個緩存器中結束,因為此指標是第一個。 針對每個緩存器,位的意義如下表所示。
位 | 意義 |
---|---|
01 | 浮點數應該載入緩存器。 |
10 | 應該將雙精度浮點數載入緩存器。 |
00 和 11 是位的無效值。
目前 Intel Architecture 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;