Megosztás a következőn keresztül:


Korrelációs leírók

A korrelációs leíró egy olyan formátumsztring, amely egy másik argumentumhoz kapcsolódó argumentumon alapuló kifejezést ír le. A [size_is()], [length_is()], [switch_is()] és [iid_is()] attribútumokhoz kapcsolódó szemantikák kezeléséhez korrelációs leíró szükséges. A korrelációs leírók tömbökkel, méretmutatókkal, egyesítőkkel és illesztőmutatókkal használhatók. A végső kifejezés értéke lehet méret, hossz, egyesítési különbség, vagy egy IID-hez mutató mutató. A formázási sztringek tekintetében a korrelációs leírók tömbökkel, egyesítőkkel és illesztőmutatókkal használhatók. A méretmutatók formázási sztringekben tömbre mutató mutatóként írhatók le.

Két alapszintű kifejezésszámítást végző rutin létezik: az NdrpComputeConformance a méretekhez, a kapcsolókhoz és az IID*-hoz, míg az NdrpComputeVariance a hosszokhoz használatos. Egyetlen rutin is létezik a támadásmegtagadási funkciók korrelációs értékének ellenőrzéséhez.

A korrelációs leírókat úgy tervezték, hogy csak nagyon korlátozott kifejezéseket támogassanak. Bonyolult helyzetek esetén a fordító létrehoz egy kifejezés-kiértékelési rutint, amelyet szükség esetén a motor hív meg.

A korrelációs leíró formátuma a következő:

correlation_type<1>
correlation_operator<1>
offset<2>
[robust_flags<2>]

A korrelációs leíró correlation_type<1> két részletből áll: a felső 4 bit írja le, hogy hol található a kifejezés, az alsó 4 bit pedig a kifejezés értékének típusát írja le.

A felső nibble az alábbi öt érték egyikével rendelkezhet:

00  FC_NORMAL_CONFORMANCE
10  FC_POINTER_CONFORMANCE
20  FC_TOP_LEVEL_CONFORMANCE
80  FC_TOP_LEVEL_MULTID_CONFORMANCE
40  FC_CONSTANT_CONFORMANCE

FC_NORMAL_CONFORMANCE

A megfelelőség normál esete, például egy struktúra területén leírt.

FC_POINTER_CONFORMANCE

Attribútumként (size_is(), length_is()) mutató esetén, amelyek egy struktúra mezői. Ez hatással van az alap memóriamutató beállítására.

FC_TOP_LEVEL_CONFORMANCE

Egy másik paraméter által leírt legfelső szintű megfelelőséghez.

FC_TOP_LEVEL_MULTID_CONFORMANCE

Egy másik paraméter által leírt többdimenziós tömb felső szintű megfelelőségéhez.

Jegyzet

A többdimenziós méretű tömbök és mutatók kapcsolót váltanak –Oicf.

 

FC_CONSTANT_CONFORMANCE

Állandó érték esetén. A fordító előre kiszámítja a felhasználó által megadott állandó kifejezés értékét. Ebben az esetben a megfelelőségi leírás későbbi 3 bájtja tartalmazza a megfelelőség méretét leíró hosszú 3 bájt alsó 3 bájtját. Nincs szükség további számításokra.

Az alsó nibble a memóriából kinyerni kívánt érték típusát adja meg:

FC_LONG | FC_ULONG | 
FC_SHORT | FC_USHORT | 
FC_SMALL | FC_USMALL | 
FC_HYPER

Jegyzet

A 64 bites kifejezések nem támogatottak. FC_HYPER csak 64 bites platformokon iid_is() használható az IID*mutatóértékének kinyeréséhez.

A fordító a következő esetekben nullára állítja a nibble típust: a fent említett állandó kifejezéseket, valamint a kiértékelési kifejezés rutinjának meghívását, például FC_CONSTANT_CONFORMANCE és FC_CALLBACK használatakor.

 

Az size_is_op<1> mező lehetővé teszi az alábbi műveletek egyikének alkalmazását a megfelelőségi változóra:

FC_DEREFERENCE | 
FC_DIV_2 | FC_MULT_2 | FC_SUB_1 | FC_ADD_1 | 
FC_CALLBACK

A FC_DEREFERENCE konstanst arra használják, hogy a korreláció pontszerű legyen, például [size_is(*pL)]. Az aritmetikai operátorok csak a megadott állandót használják. A FC_CALLBACK állandó azt jelzi, hogy egy kifejezés-kiértékelési rutint kell meghívni.

Az eltolás<2> mező általában a kifejezés argumentum változójának relatív memóriaeltolása. Kifejezésértékelési rutinindex is lehet. A dokumentumban már említettük, hogy az állandó kifejezések esetében ez a tényleges, végleges kifejezési érték része.

Az eltolás<2> mező memóriaeltolásként való értelmezése a kifejezés összetettségétől, a kifejezésváltozó helyétől és tömb esetén attól függ, hogy a tömb valójában attribútumalapú mutató-e.

Ha a tömb egy attribútummal rendelkező mutató, és a megfelelési változó egy struktúra mezője, az eltolás mező a struktúra elejétől a megfelelőségleíró mezőig tartalmazza az eltolást. Ha a tömb nem attribútumalapú mutató, és a megfelelési változó egy struktúra mezője, az eltolás mező a szerkezet nem konformáns részének végétől a konformitásleíró mezőig tartalmazza az eltolást. A megfelelő tömb általában a struktúra végén található.

A legfelső szintű megfelelőséghez az eltolás mező a csonk első paraméterének a veremen való helyétől a megfelelőséget leíró paraméterig tartalmazza az eltolást. Ez nem használható –Operációs rendszer módban. Az eltolás mező értelmezésére más kivételek is vannak; ilyen kivételeket az ilyen típusok leírásában ismertetünk.

Ha<2> eltolást használ a FC_CALLBACK, a fordító által létrehozott kifejezés-kiértékelési rutintáblában lévő indexet tartalmaz. A rendszer átadja a csonküzenetet a kiértékelési rutinnak, amely kiszámítja a megfelelőség értékét, és hozzárendeli a csonküzenet MaxCount mezőjéhez.

A Windows 2000 robust_flags<2> mezője a /robusztustámogatása érdekében lett hozzáadva, például a támadásmegtagadás funkcióhoz. Az első bájton a következő jelzők vannak definiálva:

typedef  struct  _NDR_CORRELATION_FLAGS
  {
  unsigned char   Early     : 1;
  unsigned char   Split     : 1;
  unsigned char   IsIidIs   : 1;
  unsigned char   DontCheck : 1;
  unsigned char   Unused    : 4;
  } NDR_CORRELATION_FLAGS;

A Korai jelző a korai és a késői korrelációt jelzi. A korai korreláció az, amikor a kifejezés argumentuma megelőzi a leírt argumentumot, például egy méretargumentum egy méretmutató argumentuma előtt van. A késői korreláció az, amikor a kifejezés argumentuma a kapcsolódó argumentum után jön. A motor azonnal elvégzi a korai korrelációs értékek ellenőrzését, a késői korrelációs értékeket pedig a kifésülést követően ellenőrzi.

A Felosztás jelölő aszinkron felosztást jelez a [in] és a [out] argumentum között. Egy méretargumentum lehet például [in], míg a méretmutató [kifelé]. A DCOM aszinkron környezetében ezek az argumentumok különböző veremeken vannak, ezért a motornak tisztában kell lennie ezzel.

Az IsIidI-jelölő egy iid_is() korrelációt jelez. Az NdrComputeConformance rutint trükközik az IID-hez mutató mutató kifejezésértékként való lekéréséhez, de az érvényesítési rutin nem tudja összehasonlítani az ilyen értékeket (ezek mutatók lennének), ezért a jelző azt jelzi, hogy a tényleges IID-ket össze kell hasonlítani.

Variancia leírása és egyéb tömbattribútumok

A variancia-leírás mező formátuma megegyezik a megfelelőségi leírás mezővel. A különbség az, hogy az NDR-motor egy másik csonküzenetmezőt használ ideiglenes változóként. Variancia leírás esetén a kiértékelt hossz, a megfelelő mező neve ActualLength.

A varianciával a kezdő eltolás általában nulla, és a motor ennek megfelelően van hangolva. Ha a first_is() attribútumot egy megfelelő változó tömbre alkalmazza, a rendszer visszahívást kényszerít egy kifejezés-kiértékelési rutinra.