MCCP バッファー保護
Windows Vista 以降、RPC マーシャリング エンジンは、返されたデータによるクライアント側バッファー オーバーランを防ぐために、さらに手順を実行します。 この機能は、ミニ コンピューティング準拠保護 (MCCP) と呼ばれます。
クライアントが [out] または [in,out] パラメーターに既存のバッファーへのポインターを渡すと、そのパラメーターの返されたデータが既存のバッファーにコピーされます。 返されたデータが渡されたバッファーよりも大きい場合、RPC が返されたデータを小さすぎるバッファーにコピーすると、バッファー オーバーランが発生する可能性があります。 「最上位および埋め込みポインター」を参照してください。
MCCP では、RPC はこの状態を検出し、検出された場合は呼び出しを拒否しようとします。 [size_is] などの関連付け値を持つバッファーの場合、返されたデータが指定されたバッファー サイズに収まらない場合、呼び出しは拒否され、例外RPC_X_BAD_STUB_DATA発生します。 未サイズの文字列の場合、既存の文字列サイズ ( null ターミネータまでの長さ) が返された文字列を保持するのに不十分な場合、呼び出しは拒否されます。 RPC はすべての条件でバッファー オーバーランを検出できないため、開発者はバッファー オーバーランに対して引き続き通常の予防措置を講じるようにお勧めします。
クライアントが [out] パラメーターの既存のバッファーを渡さず、代わりに逆参照ポインターを NULL に渡す場合、RPC は通常の規則に従ってクライアントの代わりに新しいバッファーを割り当てます。 このバッファーには、返されたデータを保持するのに十分な領域が割り当てられます。
2 つ目の保護は、相関パラメーターの場合、相関カウント変数が null 以外の場合に、RPC によって null 以外のバッファーが渡されることを強制することです。
HRESULT PassString( [in] DWORD Length, [in, unique, string, size_is( Length )]LPWSTR MyString );
MyString が NULL の場合、Length が 0 に設定されていない限り、RPC は呼び出しを拒否します。 RPC では Length を 0 に設定できますが、 MyString は NULL 以外であり、RPC は MyString を 0 長のバッファー割り当てとして扱うことに注意してください。