Création de pilotes Kernel-Mode fiables
Les pilotes représentent un pourcentage significatif du code total qui s’exécute en mode noyau. Un pilote en mode noyau est, en effet, un composant du système d’exploitation. Par conséquent, les pilotes fiables et sécurisés contribuent considérablement à la fiabilité globale du système d’exploitation. Pour créer un pilote fiable en mode noyau, suivez ces instructions :
Sécurisez correctement les objets d’appareil.
L’accès utilisateur aux pilotes et aux périphériques d’un système est contrôlé par des descripteurs de sécurité que le système affecte aux objets d’appareil. Le plus souvent, le système définit les paramètres de sécurité de l’appareil lorsqu’un appareil est installé. Pour plus d’informations, consultez Création d’installations d’appareils sécurisées. Parfois, il est approprié qu’un pilote joue un rôle dans le contrôle de l’accès à son appareil. Pour plus d’informations, consultez Sécurisation des objets d’appareil.
Validez correctement les objets d’appareil.
Si un pilote crée plusieurs types d’objets d’appareil, il doit case activée type qu’il reçoit dans chaque IRP. Pour plus d’informations, consultez Échec de la validation des objets d’appareil.
Utilisez les fonctions « chaîne sécurisée ».
Lors de la manipulation de chaînes, un pilote doit utiliser des fonctions de chaîne sécurisées au lieu des fonctions de chaîne fournies avec les bibliothèques runtime de langage C/C++. Pour plus d’informations, consultez Utilisation de fonctions de chaîne sécurisée.
Valider les handles d’objet.
Les pilotes qui reçoivent des handles d’objet en tant qu’entrée doivent vérifier que les handles sont valides, qu’ils sont accessibles et qu’ils sont du type attendu. Pour plus d’informations sur l’utilisation des handles d’objet, consultez les rubriques suivantes :
Prend en charge les multiprocesseurs correctement.
Ne supposez jamais que votre pilote s’exécutera uniquement sur des systèmes monoprocesseurs. Pour plus d’informations sur les techniques de programmation que vous pouvez utiliser pour vous assurer que votre pilote fonctionnera correctement sur les systèmes multiprocesseurs, consultez les rubriques suivantes :
Gérez correctement l’état du pilote.
Il est important de toujours vérifier que votre pilote est dans l’état où vous le supposez. Par exemple, si le pilote reçoit un IRP, est-il déjà en cours de maintenance d’un IRP du même type ? Si le conducteur ne case activée pas pour cette situation, le premier IRP pourrait être perdu. Pour plus d’informations, consultez Échec de la vérification de l’état d’un pilote.
Valider les valeurs d’entrée IRP.
Il est essentiel, du point de vue de la fiabilité et de la sécurité, de valider toutes les valeurs associées à un IRP, telles que les adresses et les longueurs de mémoire tampon. Les rubriques suivantes fournissent des informations sur la validation des valeurs d’entrée IRP :
DispatchReadWrite à l’aide d’E/S mises en mémoire tampon
Erreurs dans les E/S mises en mémoire tampon
DispatchReadWrite à l’aide d’E/S directes
Gérez correctement la pile d’E/S.
Lors du passage des IIP dans la pile de pilotes, il est important que les pilotes appellent IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext pour configurer l’emplacement de la pile d’E/S du pilote suivant. N’écrivez pas de code qui copie directement un emplacement de pile d’E/S vers le suivant.
Gérez correctement les opérations d’achèvement des IRP.
Un pilote ne doit jamais terminer un IRP avec une valeur status de STATUS_SUCCESS, sauf s’il prend en charge et traite réellement l’IRP. Pour plus d’informations sur les méthodes appropriées pour gérer les opérations de saisie semi-automatique, consultez Terminer les irps.
Gérez correctement les opérations d’annulation D’IRP.
Les opérations d’annulation peuvent être difficiles à coder correctement, car elles s’exécutent généralement de manière asynchrone. Les problèmes dans le code qui gère les opérations d’annulation peuvent passer inaperçus pendant longtemps, car ce code n’est généralement pas exécuté fréquemment dans un système en cours d’exécution.
Veillez à lire et à comprendre toutes les informations fournies sous Annuler les IRPs. Prêtez une attention particulière à la synchronisation de l’annulation D’IRP et aux points à prendre en compte lors de l’annulation des IRPs.
L’un des moyens d’éviter les problèmes de synchronisation associés aux opérations d’annulation consiste à implémenter une file d’attente IRP d’annulation sécurisée. Une file d’attente IRP d’annulation sécurisée est une file d’attente gérée par le pilote qui a été introduite pour Windows XP et les versions ultérieures du système d’exploitation, mais qui est également rétrocompatible avec les versions antérieures.
Gérez correctement les opérations de nettoyage et de fermeture IRP.
Veillez à comprendre la différence entre les demandes IRP_MJ_CLEANUP et IRP_MJ_CLOSE . Les demandes de nettoyage arrivent après qu’une application ferme tous les handles sur un objet de fichier, mais parfois avant la fin de toutes les demandes d’E/S. Les demandes de fermeture arrivent une fois que toutes les demandes d’E/S pour l’objet de fichier ont été terminées ou annulées. Pour plus d'informations, voir les rubriques suivantes :
DispatchCreate, DispatchClose et DispatchCreateClose Routines
Erreurs dans la gestion des opérations de nettoyage et de fermeture
Pour plus d’informations sur la gestion correcte des IRPs, consultez Erreurs supplémentaires dans la gestion des IRPs.
Utilisation du vérificateur de pilotes
Driver Verifier est l’outil le plus important que vous pouvez utiliser pour garantir la fiabilité de votre pilote. Le vérificateur de pilotes peut case activée pour divers problèmes de pilote courants, y compris certains de ceux abordés dans cette section. Toutefois, l’utilisation de Driver Verifier ne remplace pas une conception de logiciel prudente et réfléchie.