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.
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;