Partager via


Restrictions sur le code paginable dans les pilotes de stockage

Pour éviter l’interblocage, aucune partie d’un pilote de stockage utilisée pour traiter les demandes de lecture ou d’écriture ne doit avoir de code paginable, ni tenter d’accéder à la mémoire paginable. Cela est dû au fait que les routines DispatchRead et DispatchWrite du pilote peuvent être appelées au PASSIVE_LEVEL IRQL > , et que les E/S de pagination qui prennent en charge une erreur de page se produisent à IRQL = APC_LEVEL.

Des règles similaires s’appliquent à la routine de répartition du contrôle de périphérique d’un pilote de stockage, DispatchDeviceControl, avec certaines qualifications. La routine de répartition du contrôle de périphérique d’un pilote de stockage ne doit pas contenir de code paginable ni accéder à la mémoire paginable. La routine de répartition doit être en mesure de recevoir les demandes IOCTL destinées à d’autres conducteurs à des IRQL arbitraires et de les transmettre dans la pile des pilotes. Les pilotes doivent transmettre toutes les requêtes IOCTL non gérées dans la pile sans modifier l’IRQL ou le contexte de la requête.

Toutefois, Microsoft exige que toutes les demandes IOCTL de stockage soient envoyées à PASSIVE_LEVEL. Par conséquent, bien que la routine de distribution ne soit pas elle-même paginable, elle peut appeler des sous-routines paginables pour gérer les demandes IOCTL de stockage. Ces sous-routines peuvent également accéder à la mémoire paginable.

Les routines telles que DriverEntry, Reinitialize et Unload, qui n’effectuent aucune E/S et s’exécutent à IRQL = PASSIVE_LEVEL peuvent également avoir du code paginable.

Des considérations particulières s’appliquent aux pilotes qui gèrent les périphériques de stockage dans le chemin d’accès de pagination. Un pilote se trouve dans le « chemin de pagination » s’il participe à des opérations d’E/S sur le fichier de pagination. Lorsqu’un pilote de stockage se trouve dans le chemin d’accès de pagination, sa routine DispatchPower pour les requêtes IRP_MJ_POWER ne doit pas être paginable.

Par défaut, le code des pilotes en mode noyau n’est pas paginable et la mémoire globale utilisée par les pilotes en mode noyau n’est pas paginable. Pour plus d’informations sur la façon de rendre le code paginable, consultez Rendre le code de pilote ou les données paginables.