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;