Partager via


Utilisation de ni d’E/S en mémoire tampon ni d’E/S directes

Si un pilote n’utilise pas d’E/S directes ou mises en mémoire tampon, le gestionnaire d’E/S transmet les adresses virtuelles d’origine de l’espace utilisateur dans les IRPs qu’il envoie au pilote. Pour accéder à ces mémoires tampons en toute sécurité, le pilote doit s’exécuter dans le contexte du thread appelant. En règle générale, par conséquent, seuls les pilotes de niveau supérieur, tels que les FSD, peuvent utiliser cette méthode pour accéder aux mémoires tampons.

Un pilote intermédiaire ou de niveau le plus bas ne peut pas toujours remplir cette condition. Par exemple, si un thread demandeur attend l’achèvement d’une demande d’E/S ou si un pilote de niveau supérieur est superposé au pilote de niveau intermédiaire ou inférieur, il est peu probable que les routines du pilote de niveau inférieur soient appelées dans le contexte du thread demandeur.

Le gestionnaire d’E/S détermine qu’une opération d’E/S n’utilise ni mise en mémoire tampon ni E/S directe comme suit :

Lorsqu’un pilote reçoit une IRP qui spécifie une opération d’E/S n’utilisant ni e/S en mémoire tampon ni directe, il doit effectuer les opérations suivantes :

  1. Vérifiez la validité de la plage d’adresses de la mémoire tampon utilisateur et case activée si l’accès en lecture ou en écriture approprié est autorisé, à l’aide des routines de prise en charge ProbeForRead et ProbeForWrite. Le pilote doit inclure ses accès à la plage d’adresses de la mémoire tampon dans un gestionnaire d’exceptions fourni par le pilote, afin qu’un thread utilisateur ne puisse pas modifier les droits d’accès de la mémoire tampon pendant que le pilote accède à la mémoire mémoire. Si la sonde lève une exception, le pilote doit retourner une erreur. Le pilote doit appeler ces routines dans le contexte du thread qui a effectué la demande d’E/S ; par conséquent, seul un pilote de niveau supérieur peut effectuer cette tâche.

  2. Gérez les mémoires tampons et les opérations de mémoire de l’une des manières suivantes :

    • Effectuez ses propres opérations de mise en mémoire tampon double, comme le fait le gestionnaire d’E/S pour les pilotes qui utilisent des E/S mises en mémoire tampon. Pour plus d’informations, consultez Utilisation des E/S mises en mémoire tampon.
    • Créez ses propres DLL et verrouillez la mémoire tampon en appelant les routines de support du gestionnaire de mémoire, comme le fait le gestionnaire d’E/S pour les pilotes qui utilisent des E/S directes. Pour plus d’informations, consultez Utilisation d’E/S directes.
    • Effectuez toutes les opérations nécessaires sur la mémoire tampon utilisateur directement dans le contexte du thread appelant. Le pilote doit encapsuler son accès à la mémoire tampon dans un gestionnaire d’exceptions fourni par le pilote, au cas où un thread utilisateur modifie les droits d’accès de la mémoire tampon ou les données de la mémoire tampon pendant que le pilote accède à la mémoire mémoire. Pour plus d’informations, consultez Gestion des exceptions.

En effet, le pilote doit choisir par IRP s’il doit effectuer des E/S mises en mémoire tampon, des E/S directes ou des E/S dans le contexte du thread appelant, et il doit gérer toutes les exceptions qui peuvent se produire dans un contexte de thread en mode utilisateur. Le pilote doit gérer ses propres accès à la mémoire tampon utilisateur, les opérations de double mise en mémoire tampon et les mappages de mémoire, si nécessaire, au lieu de laisser le gestionnaire d’E/S gérer ces opérations pour le pilote.