標頭
下列標頭代表可由目前版本的 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 Architecture 64 位處理器中有八個 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;