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