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 plus de commodité, 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 commençant par 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> ]

La extension_version<1> fournit la taille de la section d’extension, en octets. Cela permet au moteur de remise actuel d’effectuer un pas à pas sur la section d’extension correctement, même si la section devait provenir d’une version ultérieure du compilateur avec plus de champs que le moteur actuel 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 de nouveaux 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 vérification de corrélation côté indiqué.

Les indicateurs HasNotify et HasNotify2 indiquent que la routine utilise la fonctionnalité de notification telle que définie par les [notify] et [notify_flag] attributs, 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 à une routine de notification, si elle est utilisée.

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 les routines d’assembly qui téléchargent/chargent des registres depuis/vers la pile virtuelle pour gérer correctement les arguments à virgule flottante et les registres. 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.

Note

Pour les routines d’objet, le premier argument se termine dans le deuxième registre en raison de ce pointeur en premier. Pour chaque registre, la signification des bits est indiquée dans le tableau suivant.

 

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

 

00 et 11 sont des valeurs non valides pour les bits.

Actuellement, il existe huit registres FP dans un processeur Intel Architecture 64 bits. Par conséquent, le masque ne peut avoir que 16b plus bas bits définis. La taille du masque a été définie sur un total de 16 bits en fonction du masque du compilateur C restant 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 le 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;