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;