MCCP 緩衝區保護
從 Windows Vista 開始,RPC 封送處理引擎會採取進一步步驟,嘗試防止客戶端緩衝區因傳回的數據而溢出。 這項設施稱為迷你計算一致性保護(MCCP)。
當用戶端將指標傳遞至現有緩衝區的 [out] 或 [,out] 參數時,傳回該參數的數據會複製到現有的緩衝區。 如果傳回的數據大於傳遞的緩衝區,當 RPC 將傳回的數據複製到太小的緩衝區時,可能會發生緩衝區滿溢。 請參閱 Top-Level 與內嵌指標。
使用 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 );
如果 MyStringNULL,除非 Length 設定為 0,否則 RPC 會拒絕呼叫。 請注意,RPC 會允許 Length 為 0,而 MyString 為非NULL,而 RPC 會將 myString 視為 0 長度的緩衝區配置。