Auf Englisch lesen

Freigeben über


Der Header

Der folgende Header stellt eine der Headerstile dar, die von der aktuellen Version von MIDL generiert werden können. Der Einfachheit halber finden Sie hier die vollständige Liste der Kopfzeilenfelder.

(–Oif-Header )

handle_type<1> 
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>  
stack_size<2>
[explicit_handle_description<>]
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>

Erweiterungen ab Windows 2000: <8> für 32-Bit, <12> für 64-Bit)

extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]

Der extension_version<1> gibt die Größe des Erweiterungsabschnitts in Bytes an. Dies ermöglicht es der aktuellen NDR-Engine, den Erweiterungsabschnitt ordnungsgemäß zu durchlaufen, selbst wenn der Abschnitt aus einer späteren Compilerversion mit mehr Feldern stammt, als die aktuelle Engine versteht.

Die INTERPRETER_OPT_FLAGS2 werden wie folgt definiert:

typedef struct
  {
  unsigned char   HasNewCorrDesc      : 1;    // 0x01
  unsigned char   ClientCorrCheck     : 1;    // 0x02
  unsigned char   ServerCorrCheck     : 1;    // 0x04
  unsigned char   HasNotify           : 1;    // 0x08
  unsigned char   HasNotify2          : 1;    // 0x10
  unsigned char   Unused              : 3;
  } INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2;

Das HasNewCorrDesc-Element gibt an, ob neue Korrelationsdeskriptoren in den vom Compiler generierten Formatzeichenfolgen verwendet werden. Der neue Korrelationsdeskriptor bezieht sich auf die Denial-of-Attack-Funktionalität. Die Member ClientCorrCheck und ServerCorrCheck werden festgelegt, wenn die Routine die Korrelationsprüfung auf der angegebenen Seite benötigt.

Die Flags HasNotify und HasNotify2 geben an, dass die Routine das Benachrichtigungsfeature verwendet, wie durch die Attribute [notify] bzw. [notify_flag] definiert.

Der ClientCorrHint-Member ist ein Hinweis auf die Cachegröße auf der Clientseite, und ServerCorrHint ist ein Hinweis auf der Serverseite. Wenn die Größe 0 (null) lautet, sollte eine Standardgröße verwendet werden.

Das NotifyIndex-Element ist ein Index für eine Benachrichtigungsroutine, sofern verwendet.

Das FloatDoubleMask-Element behandelt das Problem eines Gleitkommaarguments für 64-Bit-Windows. Dieses Feld wird nur für 64-Bit-Stubs generiert. Die Maske wird für die Assemblyroutinen benötigt, die Register vom/in den virtuellen Stapel herunterladen/hochladen, um Gleitkommaargumente und Registrierungen ordnungsgemäß zu verarbeiten. Die Maske besteht aus 2 Bits pro Argument bzw. pro Gleitkommaregister. Die Codierung sieht wie folgt aus: Die am wenigsten signifikanten Bits entsprechen dem ersten FP-Register, die nächsten 2 Bits entsprechen dem zweiten Register usw.

Hinweis

Bei Objektroutinen endet das erste Argument im zweiten Register, da dieser Zeiger zuerst ist. Für jedes Register ist die Bedeutung von Bits wie in der folgenden Tabelle dargestellt.

 

Bits Bedeutung
01 Ein Gleitkommawert sollte in das Register geladen werden.
10 Ein double-Wert sollte in das Register geladen werden.

 

00 und 11 sind ungültige Werte für die Bits.

Derzeit gibt es acht FP-Register in einem Intel Architecture 64-Bit-Prozessor, daher kann die Maske nur 16b niedrigste Bits festlegen. Die Maskengröße wurde auf insgesamt 16 Bit festgelegt, basierend auf der unveränderten C-Compilermaske.

Optimieren von Headern für die Leistung

Um Code zu vereinfachen und die Leistung zu verbessern, versucht der Compiler, nach Möglichkeit einen Header mit fester Größe zu generieren. Insbesondere wird der folgende Header für asynchrones DCOM verwendet:

typedef struct _NDR_DCOM_OI2_PROC_HEADER
  {
  unsigned char               HandleType;        // The Oi header
  INTERPRETER_FLAGS           OldOiFlags;        //
  unsigned short              RpcFlagsLow;       //
  unsigned short              RpcFlagsHi;        //
  unsigned short              ProcNum;           //
  unsigned short              StackSize;         //
  // expl handle descr is never generated        //
  unsigned short              ClientBufferSize;  // The Oi2 header
  unsigned short              ServerBufferSize;  //
  INTERPRETER_OPT_FLAGS       Oi2Flags;          //
  unsigned char               NumberParams;      //
  } NDR_DCOM_OI2_PROC_HEADER, *PNDR_DCOM_OI2_PROC_HEADER;