ヘッダー
次のヘッダーは、現在のバージョンの MIDL によって生成できるヘッダー スタイルの 1 つを表します。 便宜上、ヘッダー フィールドの完全な一覧については、こちらを参照してください。
(–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] 属性で定義されている通知機能をそれぞれ使用することを示します。
ClientCorrHint メンバーはクライアント側のキャッシュ サイズ ヒントであり、ServerCorrHint はサーバー側のヒントです。 サイズが 0 の場合は、既定のサイズを使用する必要があります。
NotifyIndex 要素は、通知ルーチンを使用する場合のインデックスです。
FloatDoubleMask 要素は、64 ビット Windows の浮動小数点引数の問題に対処します。 このフィールドは、64 ビット スタブに対してのみ生成されます。 浮動小数点引数とレジスタを適切に処理するには、仮想スタックとの間でレジスタをダウンロード/アップロードするアセンブリ ルーチンにマスクが必要です。 マスクは、引数ごとに 2 ビット、または浮動小数点レジスタごとに構成されます。 コーディングは次のとおりです。下位ビットは最初の FP レジスタに対応し、次の 2 ビットは 2 番目のレジスタに対応します。
注意
オブジェクト ルーチンの場合、このポインターが最初であるため、最初の引数は 2 番目のレジスタで終わります。 レジスタごとに、ビットの意味は次の表に示すようになります。
Bits | 説明 |
---|---|
01 | float 値をレジスタに読み込む必要があります。 |
10 | double 値をレジスタに読み込む必要があります。 |
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;