Freigeben über


Die Kopfzeile

Der folgende Header stellt eine der Headerformatvorlagen dar, die von der aktuellen Version von MIDL generiert werden können. Aus Gründen der Einfachheit wird hier die vollständige Liste der Kopfzeilenfelder bereitgestellt.

(–Oif Kopfzeile)

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> ]

Die extension_version<1> stellt die Größe des Erweiterungsabschnitts in Byte bereit. Dies ermöglicht es dem aktuellen NDR-Modul, den Erweiterungsabschnitt korrekt zu durchlaufen, auch wenn der Abschnitt von einer späteren Compilerversion mit mehr Feldern stammt, als das aktuelle Modul versteht.

Die INTERPRETER_OPT_FLAGS2 sind 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;

Der HasNewCorrDesc Member 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 ClientCorrCheck- und ServerCorrCheck- Member werden festgelegt, wenn die Routine die Korrelationsprüfung auf der angegebenen Seite benötigt.

Die flags HasNotify und HasNotify2 weisen darauf hin, dass die Routine das Benachrichtigungsfeature gemäß der Definition der attribute [notify] bzw. [notify_flag] verwendet.

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 als Null angezeigt wird, sollte eine Standardgröße verwendet werden.

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

Das FloatDoubleMask--Element behebt 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 von/zum virtuellen Stapel herunterladen/hochladen, um Gleitkommaargumente zu verarbeiten und ordnungsgemäß zu registrieren. Die Maske besteht aus 2 Bit pro Argument oder eher pro Gleitkommaregister. Die Codierung lautet wie folgt: Die am wenigsten signifikanten Bits entsprechen dem ersten RP-Register, die nächsten 2 Bits entsprechen dem zweiten Register usw.

Anmerkung

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

 

Bits Bedeutung
01 Ein Float-Wert sollte in das Register geladen werden.
10 Ein doppelter 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 festgelegt haben. Die Maskengröße wurde auf insgesamt 16 Bit festgelegt, basierend auf der unveränderten C-Compilermaske.

Leistungsoptimierung für Kopfzeilen

Um Code zu vereinfachen und die Leistung zu verbessern, versucht der Compiler, wann immer möglich, 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;