Az élőfej
Az alábbi fejléc a MIDL aktuális verziója által létrehozható fejlécstílusok egyikét jelöli. Az egyszerűség kedvéért itt találja a fejlécmezők teljes listáját.
(–Oif fejléc)
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>
Windows 2000-től kezdődő bővítmények: <8> 32 bites, 64 bites <12>)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
Az extension_version<1> bájtban adja meg a bővítményszakasz méretét. Ezzel lehetővé teszi, hogy az aktuális NDR-motor helyesen lépkedjen a bővítményszakaszon, még akkor is, ha a szakasz egy későbbi fordítóverzióból származik, több mezővel, mint amennyit a jelenlegi motor megért.
A INTERPRETER_OPT_FLAGS2 a következőképpen vannak definiálva:
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;
A HasNewCorrDesc tag azt jelzi, hogy a fordító által létrehozott formátumsztringek új korrelációs leírókat használnak-e. Az új korrelációs leíró a támadásmegtagadás funkcióhoz kapcsolódik. A ClientCorrCheck és ServerCorrCheck tagok akkor vannak beállítva, ha a rutinnak szüksége van a korrelációs ellenőrzésre a megadott oldalon.
A HasNotify és HasNotify2 jelzők azt jelzik, hogy a rutin a [notify] és [notify_flag] attribútumok által meghatározott értesítési funkciót használja.
A ClientCorrHint tag egy gyorsítótárméret-tipp az ügyféloldalon, és ServerCorrHint egy tipp a kiszolgáló oldalán. Amikor a méret nullaként jelenik meg, egy alapértelmezett méretet kell használni.
A NotifyIndex elem egy értesítési rutin indexe, ha van ilyen.
A FloatDoubleMask elem a 64 bites Windows lebegőpontos argumentumának problémájával foglalkozik. Ez a mező csak 64 bites csonkokhoz jön létre. A maszkra a virtuális veremből vagy a virtuális verembe letöltött/feltöltött szerelvény-rutinokhoz van szükség a lebegőpontos argumentumok és a regisztrálások megfelelő kezeléséhez. A maszk argumentumonként 2 bitből áll, vagy inkább lebegőpontos regiszterenként. A kódolás a következő: A legkevésbé jelentős bitek az első FP-regiszternek, a következő 2 bit a második regiszternek felelnek meg, és így tovább.
Jegyzet
Objektum-rutinok esetén az első argumentum a második regiszterben végződik, mivel ez a mutató az első. Minden egyes regisztráció esetében a bitek jelentése az alábbi táblázatban látható.
Bit | Jelentés |
---|---|
01 | Egy lebegőpontos értéket be kell tölteni a nyilvántartásba. |
10 | Dupla értéket kell betölteni a regiszterbe. |
A 00 és a 11 érvénytelen értékek a bitekhez.
Jelenleg nyolc FP-regisztráló található egy Intel Architecture 64 bites processzorban, így a maszk csak 16b legalacsonyabb bittel rendelkezhet. A maszk mérete összesen 16 bitre lett beállítva a C-fordítómaszk változatlansága alapján.
Fejléc-streamlining for Performance
A kód egyszerűsítése és a teljesítmény javítása érdekében a fordító megpróbál rögzített méretű fejlécet létrehozni, amikor csak lehetséges. Az aszinkron DCOM esetében különösen a következő fejléc használható:
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;