Détection spéciale de l’altération de la mémoire du pool dans Driver Verifier
L’altération de la mémoire est un problème de pilote courant. Les erreurs de pilote peuvent entraîner des blocages longtemps après les erreurs. La plus courante de ces erreurs est l’accès à la mémoire qui a déjà été libérée, l’allocation de n octets, puis l’accès à n+1 octets.
Pour détecter l’altération de la mémoire, Driver Verifier peut allouer la mémoire du pilote à partir d’un pool spécial et surveiller ce pool en cas d’accès incorrect. Une prise en charge spéciale du pool est fournie pour les routines fournies par le système en mode noyau, telles que ExAllocatePoolWithTag , ainsi que pour les routines fournies par le système GDI, telles qu’EngAllocMem.
Pool spécial par alignements
Deux alignements du pool spécial sont disponibles :
- L’alignement Vérifier le début est plus efficace pour détecter les sous-exécutions d’accès.
- Vérifier l’alignement de fin est plus efficace pour détecter les dépassements d’accès.
Pour plus d’informations sur l’utilisation des options Vérifier le début et vérifier la fin , consultez Détection des dépassements et des dépassements. Notez que la grande majorité des altérations de mémoire sont dues à des dépassements, et non à des sous-exécutions.
Lorsque la fonctionnalité Pool spécial est active et que l’option Vérifier la fin a été sélectionnée, chaque allocation de mémoire demandée par le pilote est placée sur une page distincte. L’adresse la plus élevée possible qui permet à l’allocation de tenir sur la page est retournée, de sorte que la mémoire soit alignée sur la fin de la page. La partie précédente de la page est écrite avec des modèles spéciaux. La page précédente et la page suivante sont marquées inaccessibles.
Si le pilote tente d’accéder à la mémoire après la fin de l’allocation, le vérificateur de pilotes le détecte immédiatement et émet des 0xCD de vérification des bogues. Si le pilote écrit dans la mémoire avant le début de la mémoire tampon, cela modifie (vraisemblablement) les modèles. Lorsque la mémoire tampon est libérée, le vérificateur de pilotes détecte la modification et émet des 0xC1 de vérification des bogues.
Si le pilote lit ou écrit dans la mémoire tampon après l’avoir libérée, le vérificateur de pilotes émet des 0xCC de vérification des bogues.
Lorsque l’option Vérifier le démarrage est sélectionnée, la mémoire tampon est alignée sur le début de la page. Avec ce paramètre, les sous-exécutions entraînent un bogue immédiat case activée et les dépassements entraînent un bogue case activée lorsque la mémoire est libérée. Cette option est par ailleurs identique à l’option Vérifier la fin .
Vérifiez que Fin est l’alignement par défaut, car les erreurs de dépassement sont beaucoup plus courantes dans les pilotes que les erreurs de sous-exécution.
Une allocation de mémoire individuelle peut remplacer ces paramètres et choisir son alignement en appelant ExAllocatePoolWithTagPriority avec le paramètre Priority défini sur XxxSpecialPoolOverrun ou XxxSpecialPoolUnderrun. (Cette routine ne peut pas activer ou désactiver la fonctionnalité Pool spécial, ni demander au pool spécial une allocation de mémoire, qui serait autrement allouée à partir d’un pool normal. Seul l’alignement peut être contrôlé à partir de cette routine.)
Dans Windows 7 et versions ultérieures du système d’exploitation Windows, l’option Pool spécial prend en charge la mémoire allouée à l’aide des API de noyau suivantes :
IoAllocateIrp et les autres routines qui peuvent allouer des structures de données de paquets de demandes d’E/S (IRP)
RtlAnsiStringToUnicodeString et d’autres routines de chaînes de bibliothèque d’exécution (RTL)
Pool spécial par balise de pool ou taille d’allocation
Outre la fonctionnalité de pool spécial du vérificateur de pilotes, qui demande un pool spécial pour les allocations par un pilote spécifié, il existe deux autres façons d’utiliser le pool spécial :
Balise de pool. Demandez un pool spécial pour toutes les allocations avec une balise de pool spécifiée.
Taille. Demandez un pool spécial pour toutes les allocations dans une plage de tailles spécifiée.
Pour demander un pool spécial pour une balise de pool ou une plage de tailles, utilisez Gflags, un outil inclus dans Outils de débogage pour Windows. Pour plus d’informations, consultez Utilisation de l’utilitaire Global Flags.
Vous pouvez utiliser la fonctionnalité de pool spécial du vérificateur de pilotes et les fonctionnalités de pool spéciales de Gflags en même temps. Si vous le faites, n’oubliez pas que le pool spécial est limité, que toutes les tentatives d’allocation à partir d’un pool spécial ne réussissent pas et que Windows retourne une status réussie pour les tentatives d’allocation à partir d’un pool spécial qui sont satisfaites par les allocations des pools de mémoire standard.
Efficacité spéciale du pool
Toutes les demandes de pool spéciales ne sont pas traitées. Chaque allocation du pool spécial utilise une page de mémoire physique non paginable et deux pages d’espace d’adressage virtuel. Si le pool est épuisé, la mémoire est allouée de manière standard jusqu’à ce que le pool spécial soit à nouveau disponible. Lorsqu’une demande de pool spéciale est remplie à partir du pool standard, la fonction qui demande ne retourne pas d’erreur, car la demande de pool a réussi. Par conséquent, il n’est pas recommandé de vérifier plusieurs pilotes en même temps si la fonctionnalité pool spécial est activée.
Un seul pilote qui effectue de nombreuses petites demandes de mémoire peut également épuiser ce pool. Si cela se produit, il peut être préférable d’affecter des balises de pool aux allocations de mémoire du pilote et de dédier le pool spécial à une balise de pool à la fois.
La taille du pool spécial augmente avec la quantité de mémoire physique sur le système ; idéalement, il doit être d’au moins 1 Gigaoctet (Go). Sur les machines x86, étant donné que l’espace virtuel (en plus de l’espace physique) est consommé, n’utilisez pas l’option de démarrage /3 Go . Il est également judicieux d’augmenter les quantités minimales/maximales du fichier de pages d’un facteur de deux ou trois.
Pour être sûr que toutes les allocations d’un conducteur sont testées, il est recommandé de mettre l’accent sur le conducteur sur de longues périodes de temps.
Surveillance du pool spécial
Les statistiques relatives aux allocations de pool peuvent être surveillées. Elles peuvent être affichées par le Gestionnaire du vérificateur de pilotes, la ligne de commande Verifier.exe ou dans un fichier journal. Pour plus d’informations, consultez Surveillance des compteurs globaux .
Si le compteur Allocations de pool réussies dans le compteur de pool spécial est égal au compteur Allocations de pool réussies , le pool spécial a été suffisant pour couvrir toutes les allocations de mémoire. Si le premier compteur est inférieur au dernier, le pool spécial a été épuisé au moins une fois.
Ces compteurs ne suivent pas les allocations dont la taille est d’une page ou plus, car le pool spécial ne leur est pas applicable.
Si la fonctionnalité Pool spécial est activée, mais que moins de 95 % de toutes les allocations de pool ont été affectées à partir du pool spécial, un avertissement s’affiche dans le Gestionnaire du vérificateur de pilotes. Dans Windows 2000, cet avertissement s’affiche sur l’écran État du pilote . Dans Windows XP et versions ultérieures, cet avertissement s’affiche sur l’écran Compteurs globaux . Si cela se produit, vous devez vérifier une liste plus courte de pilotes, vérifier des pools individuels par balise de pool ou ajouter plus de mémoire physique à votre système.
L’extension du débogueur de noyau !verifier peut également être utilisée pour surveiller l’utilisation du pool spécial. Il présente des informations similaires à celles du Gestionnaire du vérificateur de pilotes. Pour plus d’informations sur les extensions de débogueur, consultez Débogage Windows.
Activation de l’option spéciale de pool
Vous pouvez activer la fonctionnalité Pool spécial pour un ou plusieurs pilotes à l’aide du Gestionnaire du vérificateur de pilotes ou de la ligne de commande Verifier.exe. Pour plus d’informations, consultez Sélection des options du vérificateur de pilote.
Notes
Pour activer la fonctionnalité de pool spécial par balise de pool ou taille d’allocation, ou pour définir les alignements Vérifier le début (détecter les sous-exécutions) et Vérifier la fin (détecter les dépassements), utilisez l’utilitaire Indicateurs globaux ; ces paramètres d’alignement s’appliquent à toutes les allocations de pool spéciales.
Sur la ligne de commande
Sur la ligne de commande, l’option Pool spécial est représentée par Bit 0 (0x1). Pour activer un pool spécial, utilisez une valeur d’indicateur de 0x1 ou ajoutez 0x1 à la valeur d’indicateur. Par exemple :
verifier /flags 0x1 /driver MyDriver.sys
La fonctionnalité sera active après le prochain démarrage.
Vous pouvez également activer et désactiver un pool spécial sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple :
verifier /volatile /flags 0x1 /adddriver MyDriver.sys
Ce paramètre prend effet immédiatement, mais il est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation de paramètres volatiles.
La fonctionnalité Pool spécial est également incluse dans les paramètres standard. Par exemple :
verifier /standard /driver MyDriver.sys
Utilisation du Gestionnaire de vérificateur de pilotes
- Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
- Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
- Sélectionnez (case activée) Pool spécial.
La fonctionnalité Pool spécial est également incluse dans les paramètres standard. Pour utiliser cette fonctionnalité, dans Le Gestionnaire du vérificateur de pilotes, cliquez sur Créer des paramètres standard.