閱讀英文

共用方式為


標頭

下列標頭代表可由目前版本的 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成員會指出新的相互關聯描述元是否用於編譯器所產生的格式字串。 新的相互關聯描述元與拒絕攻擊功能相關。 當常式需要指示端的相互關聯檢查時, 就會設定 ClientCorrCheckServerCorrCheck 成員。

HasNotifyHasNotify2旗標表示常式會分別使用[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;