Udostępnij za pośrednictwem


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;