Lire en anglais

Partager via


En-tête

L’en-tête suivant représente l’un des styles d’en-tête qui peuvent être générés par la version actuelle de MIDL. Pour des raisons pratiques, la liste complète des champs d’en-tête est fournie ici.

(–En-tête 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>

Extensions à partir de Windows 2000 : <8> pour 32 bits, <12> pour 64 bits)

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

L’extension_version<1> fournit la taille de la section d’extension, en octets. Cela permet au moteur de remise de remise en cours d’exécuter correctement la section d’extension, même si la section provient d’une version ultérieure du compilateur avec plus de champs que le moteur actuel ne le comprend.

Les INTERPRETER_OPT_FLAGS2 sont définies comme suit :

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;

Le membre HasNewCorrDesc indique si descripteurs de corrélation sont utilisés dans les chaînes de format générées par le compilateur. Le nouveau descripteur de corrélation est lié à la fonctionnalité de déni d’attaque. Les membres ClientCorrCheck et ServerCorrCheck sont définis lorsque la routine a besoin de la corrélation case activée du côté indiqué.

Les indicateurs HasNotify et HasNotify2 indiquent que la routine utilise la fonctionnalité de notification telle que définie par les attributs [notify] et [notify_flag], respectivement.

Le membre ClientCorrHint est un indicateur de taille de cache côté client et ServerCorrHint est un indicateur côté serveur. Lorsque la taille est égale à zéro, une taille par défaut doit être utilisée.

L’élément NotifyIndex est un index vers une routine de notification, le cas échéant.

L’élément FloatDoubleMask résout le problème d’un argument à virgule flottante pour Windows 64 bits. Ce champ est généré uniquement pour les stubs 64 bits. Le masque est nécessaire pour que les routines d’assembly qui téléchargent/chargent des registres depuis/vers la pile virtuelle gèrent correctement les arguments et les registres à virgule flottante. Le masque se compose de 2 bits par argument, ou plutôt par registre à virgule flottante. Le codage est le suivant : les bits les moins significatifs correspondent au premier registre FP, les 2 bits suivants correspondent au deuxième registre, et ainsi de suite.

Notes

Pour les routines d’objets, le premier argument se retrouve dans le deuxième registre, car ce pointeur est le premier. Pour chaque registre, la signification des bits est indiquée dans le tableau suivant.

 

Bits Signification
01 Une valeur float doit être chargée dans le registre.
10 Une valeur double doit être chargée dans le registre.

 

Les valeurs 00 et 11 ne sont pas valides pour les bits.

Il existe actuellement huit registres FP dans un processeur Intel Architecture 64 bits. Par conséquent, le masque ne peut avoir que 16b bits les plus bas définis. La taille du masque a été définie sur un total de 16 bits en fonction du masque du compilateur C qui reste inchangé.

Rationalisation de l’en-tête pour les performances

Pour simplifier le code et améliorer les performances, le compilateur tente de générer un en-tête de taille fixe dans la mesure du possible. En particulier, l’en-tête suivant est utilisé pour un DCOM asynchrone :

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;