Sdílet prostřednictvím


Hlavička

Následující záhlaví představuje jeden ze stylů záhlaví, které lze vygenerovat aktuální verzí MIDL. Pro usnadnění je zde uvedený úplný seznam polí záhlaví.

( hlavička–Oif)

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>

Rozšíření začínající systémem Windows 2000: <8> pro 32bitovou verzi <12> pro 64bitovou verzi)

extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]

Extension_version<1> poskytuje velikost oddílu rozšíření v bajtech. Díky tomu může aktuální modul oznámení o nedoručení správně přejít přes oddíl rozšíření i v případě, že oddíl pochází z novější verze kompilátoru s více poli, než rozumí aktuální modul.

INTERPRETER_OPT_FLAGS2 jsou definovány takto:

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;

HasNewCorrDesc člen označuje, zda se nové popisovače korelace používají ve formátových řetězcích vygenerovaných kompilátorem. Nový popisovač korelace souvisí s funkcemi útoku do odepření. ClientCorrCheck a ServerCorrCheck členy jsou nastaveny, když rutina potřebuje kontrolu korelace na uvedené straně.

Příznaky HasNotify a HasNotify2 označují, že rutina používá funkci oznámení definovanou atributem [notify] a [notify_flag] atributů.

ClientCorrHint člen je nápověda velikosti mezipaměti na straně klienta a ServerCorrHint je tip na straně serveru. Když se velikost zobrazí jako nula, měla by se použít výchozí velikost.

NotifyIndex element je index rutiny notify, pokud je použit.

Element FloatDoubleMask řeší problém argumentu s plovoucí desetinou čárkou pro 64bitovou verzi Windows. Toto pole se generuje pouze pro 64bitové zástupné procedury. Maska je nutná pro rutiny sestavení, které stahují a nahrávají registry z/do virtuálního zásobníku, aby zvládly argumenty s plovoucí desetinou čárkou a správně se registrují. Maska se skládá ze 2 bitů na argument nebo spíše na registr s plovoucí desetinou čárkou. Kódování je následující: Nejméně významné bity odpovídají prvnímu registru FP, další 2 bity odpovídají druhému registru atd.

Poznámka

U rutin objektů končí první argument v druhém registru kvůli tomu, že je první ukazatel. Pro každou registraci význam bitů je znázorněno v následující tabulce.

 

Bity Význam
01 Do registru by se měla načíst hodnota float.
10 Do registru by se měla načíst dvojitá hodnota.

 

Hodnoty 00 a 11 jsou pro bity neplatné.

V současné době existuje osm registrů FP v 64bitovém procesoru Intel Architecture, takže maska může mít nastaveno pouze 16b nejnižší bitů. Velikost masky byla nastavena na celkem 16 bitů na základě zbývající masky kompilátoru jazyka C.

Streamování hlaviček pro výkon

Aby se zjednodušil kód a zlepšil výkon, kompilátor se pokusí vygenerovat hlavičku s pevnou velikostí, kdykoli je to možné. Konkrétně se pro asynchronní model DCOM používá následující hlavička:

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;