L’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 de l'en-tête )

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> ]

La _ version d’extension<1> fournit la taille de la section d’extension, en octets. Cela permet au moteur de NDR actuel d’effectuer un pas à pas détaillé dans la section d’extension, même si la section devait provenir d’une version ultérieure du compilateur contenant plus de champs que le moteur actuel ne comprend.

L’INTERPRÉTeur d’FLAGS2 de l’INTERPRÉTeur _ _ est défini 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 de l’attaque. Les membres ClientCorrCheck et ServerCorrCheck sont définis lorsque la routine doit vérifier la corrélation du côté indiqué.

Les indicateurs HasNotify et HasNotify2 indiquent que la routine utilise la fonctionnalité Notify comme défini par les attributs [ notifier ] et [ notifier _ ] , respectivement.

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

L’élément NotifyIndex est un index d’une routine Notify, s’il est utilisé.

L’élément FloatDoubleMask traite le problème d’un argument à virgule flottante pour le Windows de 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 les registres à partir de/vers la pile virtuelle pour gérer les arguments à virgule flottante et s’inscrit correctement. Le masque est constitué de 2 bits par argument, ou non 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’objet, le premier argument finit dans le deuxième Registre en raison de la première position de ce pointeur. Pour chaque registre, la signification de bits est indiquée dans le tableau suivant.

Bits Signification
01 Une valeur flottante 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 64-bit architecture. par conséquent, le masque ne peut avoir que les bits les plus faibles définis. La taille du masque a été définie sur un total de 16 bits, en fonction du masque de compilateur C restant inchangé.

En-tête simplifié 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 chaque fois que cela est possible. En particulier, l’en-tête suivant est utilisé pour le modè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;