Routines de répartition et IRQL
La plupart des routines de répartition des pilotes sont appelées dans un contexte de thread arbitraire à IRQL = PASSIVE_LEVEL, avec les exceptions suivantes :
Les routines de répartition de tous les pilotes de niveau supérieur sont appelées dans le contexte du thread à l’origine de la demande d’E/S, qui est généralement un thread d’application en mode utilisateur.
En d’autres termes, les routines de répartition des pilotes de système de fichiers et d’autres pilotes de niveau supérieur sont appelées dans un contexte de thread nonarbitrary à l’adresse IRQL = PASSIVE_LEVEL.
Les routines DispatchRead, DispatchWrite et DispatchDeviceControl des pilotes de périphérique de niveau le plus bas et des pilotes intermédiaires superposés dans le chemin de pagination système peuvent être appelées à l’adresse IRQL = APC_LEVEL et dans un contexte de thread arbitraire.
Les routines DispatchRead et/ou DispatchWrite , ainsi que toute autre routine qui traite également les demandes de lecture et/ou d’écriture dans un périphérique de niveau le plus bas ou un pilote intermédiaire, doivent être résidentes à tout moment. Ces routines de pilotes ne peuvent pas être paginables ni faire partie de la section d’image paginable d’un pilote ; ils ne doivent pas accéder à la mémoire paginable. En outre, ils ne doivent pas dépendre d’appels bloquants (tels que KeWaitForSingleObject avec un délai d’attente différent de zéro).
La routine DispatchPower des pilotes dans les chemins de mise en veille prolongée et/ou de pagination peut être appelée à l’adresse IRQL = DISPATCH_LEVEL. Les routines DispatchPnP de ces pilotes doivent être préparées pour gérer les requêtes pnP IRP_MN_DEVICE_USAGE_NOTIFICATION .
La routine DispatchPower des pilotes qui nécessitent une alimentation d’appel au démarrage peut être appelée à l’adresse IRQL = DISPATCH_LEVEL.
Pour plus d’informations, consultez Gestion des priorités matérielles.