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.