Teilen über


Korrelationsdeskriptoren

Ein Korrelationsdeskriptor ist eine Formatzeichenfolge, die einen Ausdruck basierend auf einem Argument beschreibt, das sich auf ein anderes Argument bezieht. Ein Korrelationsdeskriptor ist für die Behandlung von Semantik im Zusammenhang mit Attributen wie [size_is()], [length_is()], [switch_is()] und [iid_is()]. Korrelationsdeskriptoren werden mit Arrays, Größenzeigern, Vereinigungen und Schnittstellenzeigern verwendet. Der mögliche Ausdruckswert kann eine Größe, eine Länge, eine Union diskriminant oder ein Zeiger auf eine IID sein. Im Hinblick auf Formatzeichenfolgen werden Korrelationsdeskriptoren mit Arrays, Vereinigungen und Schnittstellenzeigern verwendet. Ein Zeiger der Größe wird in Formatzeichenfolgen als Zeiger auf ein Array beschrieben.

Es gibt zwei Routinen, die grundlegende Ausdrucksberechnungen ausführen: NdrpComputeConformance wird für Größen, Schalter und IID* verwendet, während NdrpComputeVariance für Längen verwendet wird. Es gibt auch eine einzelne Routine, um eine Korrelationswertüberprüfung für die Denial-of-Attack-Funktionalität durchzuführen.

Korrelationsdeskriptoren wurden entwickelt, um nur sehr begrenzte Ausdrücke zu unterstützen. Bei komplizierten Situationen generiert der Compiler bei Bedarf eine Ausdrucksauswertungsroutine, die vom Modul aufgerufen wird.

Ein Korrelationsdeskriptor weist das folgende Format auf:

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

Der Korrelationsdeskriptor correlation_type<1> besteht aus zwei Nibbles: die oberen 4 Bit beschreiben, wo der Ausdruck gefunden werden kann, und die unteren 4 Bit beschreiben den Typ des Ausdruckswerts.

Der obere Nibble kann einen der folgenden fünf Werte aufweisen:

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

Ein normaler Fall der Konformität, z. B. die in einem Feld einer Struktur beschrieben.

FC_POINTER_CONFORMANCE

Für Attributzeiger (size_is(), length_is()) die Felder in einer Struktur sind. Dies wirkt sich auf die Art und Weise aus, wie der Basisspeicherzeiger festgelegt wird.

FC_TOP_LEVEL_CONFORMANCE

Für konformität auf oberster Ebene, die von einem anderen Parameter beschrieben wird.

FC_TOP_LEVEL_MULTID_CONFORMANCE

Für die Konformität eines mehrdimensionalen Arrays auf oberster Ebene, das von einem anderen Parameter beschrieben wird.

Anmerkung

Multidimensionale Arrays und Zeiger lösen einen Schalter zu –Oicfaus.

 

FC_CONSTANT_CONFORMANCE

Für einen Konstantenwert. Der Compiler berechnet den Wert aus einem konstanten Ausdruck, der vom Benutzer bereitgestellt wird. Wenn dies der Fall ist, enthalten die nachfolgenden 3 Bytes in der Konformitätsbeschreibung die unteren 3 Byte einer langen Beschreibung der Konformitätsgröße. Es ist keine weitere Berechnung erforderlich.

Der untere Nibble gibt den Typ des Werts an, der aus dem Speicher extrahiert werden muss:

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

Anmerkung

64-Bit-Ausdrücke werden nicht unterstützt. FC_HYPER wird nur für iid_is() auf 64-Bit-Plattformen verwendet, um den Zeigerwert für IID* zu extrahieren.

Der Compiler legt den Typ nibble für die folgenden Fälle auf Null fest: Konstanter Ausdruck, der oben erwähnt wurde, und wenn die Auswertungsausdrucksroutine aufgerufen werden muss, z. B. wenn FC_CONSTANT_CONFORMANCE und FC_CALLBACK verwendet werden.

 

Das Feld size_is_op<1> ermöglicht die Anwendung einer der folgenden Vorgänge auf die Konformitätsvariable:

FC_DEREFERENCE | 
FC_DIV_2 | FC_MULT_2 | FC_SUB_1 | FC_ADD_1 | 
FC_CALLBACK

Die FC_DEREFERENCE Konstante wird für die Korrelation als Zeiger verwendet, z. B. für [size_is(*pL)]. Arithmetische Operatoren verwenden einfach die angegebene Konstante. Die FC_CALLBACK Konstante gibt an, dass eine Ausdrucksauswertungsroutine aufgerufen werden muss.

Der Offset<2> Felds ist in der Regel ein relativer Speicherversatz für die Ausdrucksargumentvariable. Es kann auch ein Ausdrucksauswertungsroutineindex sein. Wie bereits in diesem Dokument erwähnt, handelt es sich bei konstanten Ausdrücken um einen Teil des tatsächlichen, endgültigen Ausdruckswerts.

Die Interpretation des Offsets<2> Felds als Speicheroffset hängt von der Komplexität des Ausdrucks, der Position der Ausdrucksvariablen und im Fall eines Arrays ab, ob das Array tatsächlich ein zugeordneter Zeiger ist.

Wenn das Array ein zugeordneter Zeiger ist und die Konformitätsvariable ein Feld in einer Struktur ist, enthält das Offsetfeld den Offset vom Anfang der Struktur bis zum Konformitätsbeschreibungsfeld. Wenn das Array kein zugeordneter Zeiger ist und die Konformitätsvariable ein Feld in einer Struktur ist, enthält das Offsetfeld den Offset vom Ende des nichtkonformanten Teils der Struktur bis zum Konformitätsbeschreibungsfeld. Normalerweise befindet sich das konforme Array am Ende der Struktur.

Für die Konformität auf oberster Ebene enthält das Offsetfeld den Offset von der Position des ersten Stubparameters im Stapel bis zum Parameter, der die Konformität beschreibt. Dies wird im modus –Os nicht verwendet. Es gibt andere Ausnahmen bei der Interpretation des Offsetfelds; solche Ausnahmen werden in der Beschreibung dieser Typen beschrieben.

Wenn offset<2> mit FC_CALLBACK verwendet wird, enthält sie einen Index in der vom Compiler generierten Ausdrucksauswertungsroutinetabelle. Die Stubnachricht wird an die Auswertungsroutine übergeben, die dann den Konformitätswert berechnet und dem MaxCount-Feld der Stubnachricht zuweist.

Das Feld robust_flags<2> wurde für Windows 2000 hinzugefügt, um /robustenzu unterstützen, z. B. das Feature "Denial-of-Attacks". Die folgenden Flags werden für das erste Byte definiert:

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;

Die Frühe Kennzeichnung gibt frühe und späte Korrelation an. Eine frühe Korrelation ist, wenn das Ausdrucksargument dem beschriebenen Argument vorausgeht, z. B. vor einem Größenargument vor einem Zeigerargument der Größe. Eine späte Korrelation ist, wenn das Ausdrucksargument nach dem verwandten Argument kommt. Das Modul führt sofort eine Überprüfung der frühen Korrelationswerte durch, die verspäteten Korrelationswerte werden zur Überprüfung gespeichert, nachdem der Entmarshaling abgeschlossen wurde.

Das Flag "Teilen" gibt eine asynchrone Aufteilung zwischen [in] und [out] Argumenten an. Beispielsweise kann ein Größenargument [in] sein, während der Größenzeiger [out] sein kann. Im Asynchronen DCOM-Kontext befinden sich diese Argumente auf verschiedenen Stapeln, daher muss das Modul dies beachten.

Das IsIidIs-Flag gibt eine iid_is() Korrelation an. Die NdrComputeConformance-Routine wird vertrickst, um einen Zeiger auf IID als Ausdruckswert zu erhalten, aber die Validierungsroutine kann solche Werte nicht vergleichen (sie wären Zeiger), und das Flag gibt an, dass tatsächliche IIDs verglichen werden müssen.

Varianzbeschreibung und andere Arrayattribute

Das Feldformat für die Varianzbeschreibung ist identisch mit dem Beschreibungsfeld der Konformität. Der Unterschied besteht darin, dass ein anderes Stubnachrichtenfeld vom NDR-Modul als temporäre Variable verwendet wird. Im Fall einer Varianzbeschreibung ist es die Länge, die ausgewertet wird und das entsprechende Feld als ActualLength bezeichnet wird.

Bei Abweichung ist der Startoffset in der Regel null und der Motor wird entsprechend abgestimmt. Wenn das attribut first_is() auf ein konformes, unterschiedliches Array angewendet wird, wird ein Rückruf zu einer Ausdrucksauswertungsroutine erzwungen.