Nagłówek
Poniższy nagłówek reprezentuje jeden ze stylów nagłówka, które mogą być generowane przez bieżącą wersję MIDL. Dla wygody pełna lista pól nagłówka jest dostępna tutaj.
( nagłówek–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>
Rozszerzenia począwszy od systemu Windows 2000: <8> dla 32-bitowych, <12> dla 64-bitowych)
extension_version<1>
INTERPRETER_OPT_FLAGS2<1>
ClientCorrHint<2>
ServerCorrHint<2>
NotifyIndex<2>
[ FloatDoubleMask<2> ]
Extension_version<1> zawiera rozmiar sekcji rozszerzenia w bajtach. Dzięki temu bieżący aparat NDR może poprawnie przejść przez sekcję rozszerzenia, nawet jeśli sekcja miała pochodzić z nowszej wersji kompilatora z większą ilością pól, niż rozumie bieżący aparat.
INTERPRETER_OPT_FLAGS2 są zdefiniowane w następujący sposób:
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;
Element członkowski HasNewCorrDesc wskazuje, czy nowe deskryptory korelacji są używane w ciągach formatu generowanych przez kompilator. Nowy deskryptor korelacji jest związany z funkcją odmowy ataku. Elementy członkowskie ClientCorrCheck i ServerCorrCheck są ustawiane, gdy procedury wymagają sprawdzenia korelacji po wskazanej stronie.
Flagi HasNotify i HasNotify 2 wskazują, że procedury używają funkcji powiadamiania zgodnie z definicją odpowiednio atrybutów [notify] i [notify_flag].
Element członkowski ClientCorrHint jest wskazówką rozmiaru pamięci podręcznej po stronie klienta, a ServerCorrHint jest wskazówką po stronie serwera. Gdy rozmiar jest wyświetlany jako zero, należy użyć domyślnego rozmiaru.
Element NotifyIndex jest indeksem procedury powiadamiania, jeśli jest używany.
Element FloatDoubleMask rozwiązuje problem z argumentem zmiennoprzecinkowym dla 64-bitowego systemu Windows. To pole jest generowane tylko dla 64-bitowych wycinków. Maska jest wymagana w przypadku procedur zestawów, które pobierają/przekazują rejestry z/do stosu wirtualnego do obsługi argumentów zmiennoprzecinkowych i rejestrują się prawidłowo. Maska składa się z 2 bitów na argument, a raczej na rejestr zmiennoprzecinkowy. Kodowanie jest następujące: Najmniej znaczące bity odpowiadają pierwszemu rejestrowi FP, następne 2 bity odpowiadają drugiemu rejestrowi itd.
Nuta
W przypadku procedur obiektów pierwszy argument kończy się w drugim rejestrze, ponieważ ten wskaźnik jest pierwszy. Dla każdego rejestru znaczenie bitów jest jak pokazano w poniższej tabeli.
Bitów | Znaczenie |
---|---|
01 | Wartość zmiennoprzecinkowa powinna zostać załadowana do rejestru. |
10 | Do rejestru należy załadować podwójną wartość. |
Wartości 00 i 11 są nieprawidłowe dla bitów.
Obecnie istnieje osiem rejestrów FP w procesorze 64-bitowym Intel Architecture, dlatego maska może mieć tylko 16b najniższych bitów. Rozmiar maski został ustawiony na łącznie 16 bitów na podstawie maski kompilatora języka C pozostały bez zmian.
Streamlining nagłówka pod kątem wydajności
Aby uprościć kod i zwiększyć wydajność, kompilator próbuje wygenerować nagłówek o stałym rozmiarze, jeśli jest to możliwe. W szczególności następujący nagłówek jest używany dla asynchronicznego modelu DCOM:
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;