Partager via


Détection d'altération de la mémoire du pool spécial dans le Driver Verifier

La corruption de la mémoire est un problème de pilote courant. Les erreurs de pilote peuvent entraîner des accidents longtemps après avoir été commises. La plupart de ces erreurs concerne l’accès à la mémoire qui a déjà été libérée, et 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 utilisée par le pilote à partir d’un pool spécial et surveiller ce pool pour détecter un accès incorrect. La prise en charge spéciale du pool est fournie pour les routines fournies par le système en mode noyau, telles qu’ExAllocatePoolWithTag et également pour les routines fournies par le système GDI, telles que EngAllocMem.

Pool spécial par alignements

Deux alignements du pool spécial sont disponibles :

  • L’alignement Vérifier le début est meilleur pour détecter les sous-courants d'accès.
  • L'alignement Verify End est meilleur pour détecter les dépassements d'accès.

Pour plus d’informations sur l’utilisation des options Vérifier le début et la fin de la vérification , consultez Détection des dépassements et des sous-exécutions. Notez que la grande majorité des altérations de mémoire sont dues à des dépassements, pas à des sous-coulements.

Lorsque la fonctionnalité Pool spécial est active et que Vérification de 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’ajustement de l’allocation sur la page est retournée, afin 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 comme inaccessibles.

Si le pilote tente d’accéder à la mémoire après la fin de l’allocation, le vérificateur de pilotes détecte immédiatement ce problème et émet la vérification des bogues 0xCD. Si le pilote écrit dans la mémoire avant le début de la mémoire tampon, cela modifiera probablement les schémas. Lorsque la mémoire tampon est libérée, Driver Verifier détectera l’altération et déclenchera le Bug Check 0xC1.

Si le pilote lit ou écrit dans la mémoire tampon après l’avoir libéré, le vérificateur de pilotes émet une vérification des bogues 0xCC.

Lorsque l’option Vérifier le début 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 une vérification immédiate des bogues et des dépassements entraînent une vérification de bogue lorsque la mémoire est libérée. Cette option est sinon identique à l’option Vérifier la fin .

Vérifiez que la 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é de pool spécial, ou demander le pool spécial pour une allocation de mémoire, qui serait autrement allouée à partir du 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 :

Pool spécial par balise de pool ou taille d’allocation

En plus de la fonctionnalité 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. Demander un pool spécial pour toutes les allocations dans une plage de tailles définie.

Pour demander un pool spécial pour une balise de pool ou une plage de tailles, utilisez Gflags, un outil inclus dans Les outils de débogage pour Windows. Pour plus d’informations, consultez Utilisation de l’utilitaire Global Flags.

Vous pouvez utiliser la fonctionnalité Pool spécial du vérificateur de pilotes et les fonctionnalités spéciales de pool 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 du pool spécial ne réussissent pas et que Windows renvoie un état de réussite pour les tentatives ayant échoué à allouer à partir d’un pool spécial, qui sont satisfaites par des allocations des pools de mémoire standard.

Efficacité spéciale du pool

Toutes les demandes de pool spéciales ne sont pas remplies. Chaque allocation du pool spécial utilise une page de mémoire physique non modifiable et deux pages d’espace d’adressage virtuel. Si le pool est épuisé, la mémoire est allouée de la 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 de 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 s’agir d’au moins 1 Gigaoctet (Go). Sur les machines x86, car 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 pilote sont testées, il est recommandé de solliciter le pilote sur de longues périodes.

Surveillance du pool spécial

Les statistiques relatives aux allocations de pool peuvent être surveillées. Celles-ci 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 des allocations réussies dans le pool spécial est égal au compteur des allocations de pool réussies, alors le pool spécial a suffi à couvrir toutes les allocations de mémoire. Si le premier compteur est inférieur au second, alors 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 d'une taille supérieure, 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 proviennent du pool spécial, un avertissement s’affiche dans le Gestionnaire de vérification des 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 du noyau !verifier peut également être utilisée pour surveiller l’utilisation d’un pool spécial. Il présente des informations similaires à celles du Gestionnaire vérificateur de pilotes. Pour plus d’informations sur les extensions de débogueur, consultez Débogage Windows.

Activation de l’option de pool spécial

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.

Remarque

Pour activer la fonctionnalité 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 le pool spécial, utilisez une valeur d’indicateur de 0x1 ou ajoutez 0x1 à la valeur de l’indicateur. Par exemple:

    verifier /flags 0x1 /driver MyDriver.sys
    

    La fonctionnalité sera active après le démarrage suivant.

    Yyou pouvez également activer et désactiver le 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 est effectif immédiatement, mais est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation des 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 du Vérificateur de Pilotes

    1. Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
    2. Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
    3. Sélectionnez (vérifier) 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.