MCCP 緩衝區保護
從 Windows Vista 開始,RPC 封送處理引擎會採取進一步的步驟,以避免因為傳回的資料而造成用戶端緩衝區溢位。 此設施稱為 Mini Compute Conformance Protection (MCCP) 。
當用戶端將現有緩衝區的指標傳遞至 [out] 或 [in,out] 參數時,該參數傳回的資料會複製到現有的緩衝區。 如果傳回的資料大於傳遞的緩衝區,當 RPC 將傳回的資料複製到太小的緩衝區時,可能會發生緩衝區溢位。 請參閱 最上層和內嵌指標。
使用 MCCP 時,RPC 會嘗試偵測此條件,並在偵測到時拒絕呼叫。 對於具有相互關聯值的緩衝區,例如 [size_is],如果傳回的資料不符合指定的緩衝區大小,則會拒絕呼叫並引發RPC_X_BAD_STUB_DATA例外狀況。 對於未化的字串,如果現有的字串大小 (長度,直到 null 結束字元) 不足以保存傳回的字串,就會拒絕呼叫。 RPC 無法偵測所有情況下的緩衝區滿溢,因此建議開發人員繼續針對緩衝區溢位採取一般預防措施。
如果用戶端未傳遞 [out] 參數的現有緩衝區,而是將取值指標傳遞至 Null,RPC 會遵循一般規則來代表用戶端配置新的緩衝區。 此緩衝區會配置足夠的空間來保存傳回的資料。
第二個保護是針對相互關聯的參數,RPC 會強制在相互關聯計數變數為非Null 時傳遞非Null緩衝區。
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 長度的緩衝區配置。