Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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;