Megosztás a következőn keresztül:


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;