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;