指標配置
指標配置描述結構或陣列的指標。
pointer_layout<>
pointer_layout<>字段包含格式字元FC_PP FC_PAD後面接著一或多個指標描述,如稍後所述,並以FC_END格式字元終止:
FC_PP
FC_PAD
{ pointer_instance_layout<> }*
FC_END
pointer_instance_layout<>字段是描述单一或多个指针实例的格式字符串。 這些描述元中會使用下列欄位:
offset_in_memory
記憶體中指標位置的帶正負號位移。 對於位於 結構的指標,此位移是結構結尾的負位移(一致性結構的不一致部分結尾):針對陣列,位移是從數位的開頭開始。
offset_in_buffer
緩衝區中指標位置的帶正負號位移。 對於位於 結構的指標,此位移是結構結尾的負位移(一致性結構的不一致部分結尾):對於陣列,位移是從數位的開頭。
offset_to_array
從封入結構位移至要處理指標的內嵌數位。 對於最上層陣列,此欄位一律為零。
反覆運算
描述相同版面配置<> 的指標總數。
增加
REPEAT 期間連續指標之間的遞增。
number_of_pointers
重複實例中的不同指標數目。
pointer_description
指標描述。
所有指標實例設定都會使用下列單一pointer_instance<8>:
offset_to_pointer_in_memory<2>
offset_to_pointer_in_buffer<2>
pointer_description<4>
以下是實例描述元:
簡單類型的單一指標實例:
FC_NO_REPEAT FC_PAD
pointer_instance<8>
修正重複指標:
FC_FIXED_REPEAT FC_PAD
iterations<2>
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
變數重複指標:
FC_VARIABLE_REPEAT (FC_FIXED_OFFSET | FC_VARIABLE_OFFSET)
increment<2>
offset_to_array<2>
number_of_pointers<2>
{ pointer_instance<8> }*
針對固定重複和變數重複指標實例,重複實例中的每個指標都有一組位移和指標描述。
指標版面配置設計問題
本節說明處理一致性結構和內嵌指標的相關問題。 問題是編譯程式會產生具有某些備援之結構和陣列的指標配置。 這是有益的,因為資訊很有用,例如,一致性結構可以逐步執行一個指標配置,以服務結構中的所有指標,以及從一致性結構的一部分的一致性數位。 不過,有些內嵌情況需要 NDR 引擎執行其他工作,以適當順序處理所有指標配置,並只處理每個指標一次。
編譯程式產生的內容
本節中討論的每個物件都有指標,例如,一致性結構具有結構部分以及陣列元素中的指標。 元素是具有指標的簡單結構。
一致性結構,單一層級
一致性描述項具有PP元件,其中所有指標都是從結構和陣列描述。 成員清單FC_LONG取代指標。 CARRAY 陣列描述元透過使用 embedded_complex 而沒有任何指標描述項來擁有元素。 元素仍然具有其單一指標描述元。 指標配置在一致性結構和簡單結構描述元的成員配置之前。
一致性結構,兩個或多個層級
PP 描述具有來自所有層級的指標。 它會重複使用與內部一致性結構相同的陣列描述。 成員清單FC_LONG取代指標。 內嵌結構是透過使用內嵌的複雜結構。 一致性結構描述元會重複使用 as-is。 結構的平面部分大小也會完整顯示,這表示最上層結構大小會包含內嵌結構的平面大小。
複雜結構,單一層級
指標成員會以FC_POINTER標示。 指標配置已簡化,因此清單中每個FC_POINTER專案都有指標描述元(4 個字節)。 指標配置會與成員逐步解說平行執行,也就是說,FC_POINTER會導致處理下一個指標描述。 CARRAY 陣列具有具有數位所有描述元的指標配置,然後是元素,透過使用內嵌複本。 會重複使用專案描述元。 結構一般部分的大小完成;換句話說,最上層結構的平面大小包括內嵌結構的平面大小。 成員配置在複雜結構的指標配置之前。
因此,一致性陣列描述產生會根據它是一個符合性結構內的陣列或複雜結構內部而有所不同。
複雜結構,2 或多個層級,複雜
最上層複雜結構具有其成員指標,內嵌的複雜結構具有其成員指標。 一致性結構描述元會重複使用。 頂端的陣列描述元是內嵌結構中重複使用的陣列。
具有內嵌一致性結構的複雜結構
Top=level 一致性結構具有其成員指標。 一致性結構描述元會重複使用 as-is。 數位描述元會從內嵌一致性結構重複使用;換句話說,它沒有任何指標位於數位描述元。 專案具有其指標描述元。
具有指標的結構陣列
具有指標的簡單結構陣列會根據數位大小產生為SMFARRAY或 CARRAY,但在這兩種情況下,它都有已完成的指標配置(FIXED_REPEAT或VARIABLE_REPEAT)。 指標配置位於成員配置之前。
不論指標是固定還是大小,以及在這兩種情況下,都會產生具有指標的複雜結構陣列作為BOGUS_ARRAY。
NDR 引擎的功能
本節描述 NDR 引擎行為。
封送處理傳遞
一致性結構和內嵌一致性結構。
最上層結構的行為就像單一層級結構。
具有一致性陣列的內嵌複雜結構
任何複雜結構都會強制外部結構成為複雜結構。 內嵌結構永遠不會封送處理其陣列。 每個結構一律會藉由封送處理成員和發生FC_POINTER的成員,來通過內嵌指標。
具有一致性結構的複雜結構
最上層的內嵌一致性結構會封送處理一致性陣列和所有指標。 如果有,NDR 引擎絕不會遞減到更深的巢狀一致性結構;這可簡化解決方案,因為一致性結構是分葉物件,就內嵌物件的封送處理而言。 最上層複雜結構會略過陣列封送處理。
取消封殺、浮凸和釋放傳球
取消封送處理是對稱的;針對複雜結構執行的第一個作業,是藉由呼叫 NdrComplexStructBufferSize 函式,找出緩衝區中的指點位置。 然後,它會平行取消分界點,以啟用相同的配置,以便正確使用點數。 大小物件和等位應該不會混淆;記憶體映像不應用於大小物件和等位,僅適用於緩衝區內容。
用來執行封送處理和取消分送處理的旗標會以相同的方式進行封送處理和釋放,以確保尖頭只走一次。
Endianness pass
起初,結束傳遞有點類似於封送處理/取消封送處理:需要兩個傳遞才能處理複雜的結構。 第一次傳遞會轉換一般元件,並尋找緩衝區中的指點位置,類似於調整如何執行這項作業以進行取消分割。 第二個階段接著會轉換指標。
Endianness 傳遞的方式不同:每個結構和每個成員都必須逐步執行,直到分葉成員或元素是簡單類型為止。 這與取消封殺不同:例如,在取消合併中,永遠不需要處理內嵌在一致性結構或任何一致性結構成員中符合性結構中的一致性結構。 另一個問題是,轉換不是等冪運算,因此取消分流傳遞可能會取消復原某些片段而不會造成傷害,而轉換必須嚴格地依任何簡單類型執行一次。
因此,尾端演算法可以摘要如下。 NDR 具有最上層一致性結構的概念,以及適當標記的旗標。 第一次行走時,例如轉換平面部分並取得指點的位置,則不會使用這個概念。 NDR 會通過所有結構層級的平面部分下降,永遠不會冒險進行指標處理。 最後,NDR 會以平移方式在最上層轉換陣列。
第二次行走時,旗標會用來標記內嵌指標的傳遞,以避免進入更深層次的一致性結構,然後是最符合頂端的結構。 如此一來,旗標就會強制一般封送處理/取消封送處理行為,以避免遞減到更深層次的一致性結構。
具有一致性陣列的複雜結構第二個階段的運作方式如下:複雜結構的運作方式如下:這表示更深層次的層級永遠不會查看或略過其一致性大小或符合的陣列,而寧願直接逐步執行其成員而不需要觸碰數組。
對於具有一致性結構的複雜結構,一致性結構必須注意其是否為最上層,以及它是否位於複雜結構中。 數位的一般部分會由最符合頂端結構處理。 在第二個階段,最上層一致性的結構會略過一般部分,並經過指標配置並傳回。 最上層複雜的結構會略過其平面部分,也會略過指標配置。
結束度走的強固方面
結束度會檢查一般緩衝區外的情況,並執行不相關本質的其他檢查。 使用此步驟無法執行針對相互關聯的值(例如重設大小自變數與一致性大小)的檢查:稍後,當取消劃界時,會執行它們。