Partager via


Pourquoi thunking est nécessaire

Les pilotes en mode noyau doivent valider la taille de toute mémoire tampon d’E/S transmise à partir d’une application en mode utilisateur. Si une application 32 bits transmet une mémoire tampon contenant des types de données de précision de pointeur à un pilote 64 bits et qu’aucune manipulation n’a lieu, le pilote s’attend à ce que la mémoire tampon soit plus grande qu’elle ne l’est réellement. En effet, la précision du pointeur est de 32 bits sur Microsoft Windows 32 bits et de 64 bits sur Windows 64 bits. Par exemple, considérez la définition de structure suivante :

typedef struct _DRIVER_DATA
{
    HANDLE           Event;
    UNICODE_STRING   ObjectName;
} DRIVER_DATA;

Sur Windows 32 bits, la taille de la structure DRIVER_DATA est de 12 octets. Ce tableau montre les tailles des membres Event member et ObjectName de la structure DRIVER_DATA :

Événement ObjectName (USHORT Length) ObjectName (longueur maximale USHORT) ObjectName (mémoire tampon PWSTR)
32 bits 16 bits 16 bits 32 bits
(4 octets) (2 octets) (2 octets) (4 octets)

Sur Windows 64 bits, la taille de la structure DRIVER_DATA est de 24 octets. (Les 4 octets de remplissage de structure sont requis pour que le membre Buffer puisse être aligné sur une limite de 8 octets.)

Événement ObjectName (USHORT Length) ObjectName (longueur maximale USHORT) Vide (remplissage de structure) ObjectName (mémoire tampon PWSTR)
64 bits 16 bits 16 bits 32 bits 64 bits
(8 octets) (2 octets) (2 octets) (4 octets) (8 octets)

Si un pilote 64 bits reçoit 12 octets de DRIVER_DATA alors qu’il s’attendait à 24 octets, la validation de la taille échoue. Pour éviter cela, le pilote doit détecter si une structure de DRIVER_DATA a été envoyée par une application 32 bits et, si c’est le cas, l’effectuer correctement avant d’effectuer la validation.

Par exemple, une version voyouillée de la structure de DRIVER_DATA ci-dessus peut être définie comme suit :

typedef struct _DRIVER_DATA32
{
    VOID *POINTER_32   Event;
    UNICODE_STRING32   ObjectName;
} DRIVER_DATA32;

Étant donné qu’elle contient uniquement des types de données de précision fixe, cette nouvelle structure a la même taille sur Windows 32 bits et Windows 64 bits.

Événement ObjectName (USHORT Length) ObjectName (longueur maximale USHORT) Mémoire tampon ULONG
32 bits 16 bits 16 bits 32 bits
(4 octets) (2 octets) (2 octets) (4 octets)