Numéro d'article: 188831 - Dernière mise à jour: vendredi 23 février 2007 - Version: 9.2

Comment faire pour utiliser la fonctionnalité Pool spécial pour isoler les pools endommagés

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Ancien nº de publication de cet article : F188831
Important Cet article contient des informations sur la modification du Registre. Avant de modifier le Registre, pensez à le sauvegarder et assurez-vous que vous savez le restaurer en cas de problème. Pour plus d'informations sur la façon de sauvegarder, restaurer et modifier le Registre, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
256986  (http://support.microsoft.com/kb/256986/ ) Description du Registre de Microsoft Windows
Agrandir tout | Réduire tout

Résumé

Un pool endommagé peut être à l'origine d'un grand nombre des problèmes rencontrés dans Windows NT. Un pool peut être endommagé lorsqu'un composant noyau écrit sur la mémoire en dehors de sa zone de pool allouée. L'écriture sur la mémoire en dehors des limites de la zone allouée risque d'écraser une autre zone de mémoire allouée, pouvant appartenir à un autre composant. Le pool endommagé peut provoquer des problèmes tels que des écrans bleus dans des zones de code ne s'y rapportant pas. Un composant noyau lisant au-delà de sa zone allouée peut également poser des problèmes.

Qu'ils soient provoqués par des pilotes OEM (Original Equipment Manufacturers) ou des problèmes internes à Windows, les problèmes de pool endommagé sont très difficiles à identifier. En général, tout ce qui peut être détecté lors de l'analyse du vidage de la mémoire sont les symptômes du problème réel, tels qu'une zone de données endommagée provoquant des problèmes dans une partie de code ne s'y rapportant pas. Jusqu'à présent, il était quasiment impossible d'identifier la partie de code ayant endommagé la mémoire.

La source du problème peut à présent être identifiée au niveau de l'instruction provoquant les dommages du pool. Un nouvel utilitaire de gestion de mémoire nommé Pool spécial est inclus dans Windows NT 4.0 Service Pack 4 (SP4), Windows 2000, Windows XP et Windows Server 2003. Cet utilitaire identifie le composant noyau qui endommage les données de pool en écrivant sur la mémoire en dehors de sa zone allouée.

Plus d'informations

Avertissement Toute modification incorrecte du Registre à l'aide de l'Éditeur du Registre ou d'une autre méthode peut entraîner des problèmes sérieux. Ces problèmes peuvent vous obliger à réinstaller votre système d'exploitation. Microsoft ne peut pas garantir que ces problèmes puissent être résolus. Vous assumez l'ensemble des risques liés à la modification du Registre.
L'utilitaire Pool spécial attribue deux pages de mémoire virtuelle pour chaque demande d'allocation de pool effectuée par l'intermédiaire de la requête ExAllocatePoolWithTag répondant aux critères suivants :
  • La demande d'allocation doit être pour une taille inférieure à la taille maximale d'allocation pouvant être contenue sur une page de pool.
  • La demande doit correspondre à la spécification PoolTag du Registre.
L'allocation pour la détection de dépassement de pool est située à la fin de la première page. La deuxième page est une page de protection. Pour la détection d'approvisionnement insuffisant de mémoire du pool, la première page est une page de protection. Elle est suivie d'une page contenant l'allocation au début de la page.

La détection de dépassement est probablement la plus utilisée. Pour la détection de dépassement, l'allocation demandée est placée à la fin de la première page en sauvegardant la taille de la requête à partir de la fin de la page. La taille d'allocation est arrondie à une limite de 8 octets. Une clé de motif, la taille et les informations de balise de pool sont inscrits dans l'en-tête sur les 8 premiers octets de la première page. Le motif apparaît également sur toute la page. Puisque l'allocation est placée sur la limite de 8 octets la plus proche, il peut y avoir au moins sept octets restants suivant l'allocation. Le motif est également écrit sur les octets restants suivant l'allocation.

La deuxième page est la page de protection. La page de protection est constituée d'une entrée de table de page (PTE, Page Table Entry) spéciale marquée d'une protection de non-accès. En marquant la protection de non-accès sur cette seconde page, tout code qui tentera de lire ou d'écrire au-delà de la fin de la première page entraînera immédiatement une violation d'accès qui se traduira par un message d'erreur Stop 0x0000000A ou Stop 0x0000001E. Cela permet à la personne qui débogue le système d'identifier l'instruction exacte à l'origine du pool endommagé.

En tant que vérification secondaire pour détecter les violations d'écriture au-delà de la fin de l'allocation mais pas au-delà de la fin de la page, les octets restants à la fin de l'allocation sont validés durant la requête de pool libre (ExFreePoolWithTag). Les octets restants sont comparés au motif dans l'en-tête de l'allocation pour vérifier si quelque chose a été remplacé dans la zone d'octets restants. Si la vérification n'aboutit pas, un message d'erreur Stop 0x00000001A s'affiche.

Cette vérification n'identifie pas nécessairement la partie de code exacte à l'origine du pool endommagé, mais elle peut aider à identifier le composant responsable de l'endommagement.

Pour activer l'utilitaire Pool spécial, ajoutez au Registre les clés et les valeurs suivantes :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


Nom de la valeur : PoolTag
Type de données : REG_DWORD
Données : Pool tag mask | Allocation size mask | 0
Le masque de balise de pool est l'ID de la balise de pool contenant des caractères de masquage du pool dans lequel vous souhaitez placer le pool spécial. Ce masque doit être spécifié en hexadécimal dans le sens inverse. Ce masque peut également contenir « ? » pour masquer un seul caractère ou « * » pour masquer à partir de cet endroit jusqu'à la fin de la balise. Par exemple, pour surveiller tous les pools ayant une balise de pool commençant par « Nt », spécifiez « 2A744E » (sans les guillemets), ce qui représente « *tN ».

Le tableau suivant répertorie d'autres exemples :

   Pool à analyser   Caractère   Masque Balise de pool
   ----------------------------------------------------------               
   Tous les pools    « * »       0x2A
   N??s              « s??N »    0x733F3F4E
				
La spécification Masque taille d'allocation place toutes les allocations de pool d'une taille spécifiée dans le pool spécial. Elle est également spécifiée en hexadécimal. Par exemple, si toutes les allocations de 32 octets sont placées dans le pool spécial, spécifiez 0x20.

Lorsque zéro (0x0) est spécifié, l'utilitaire Pool spécial n'est pas initialisé. De plus, il n'est pas initialisé si la valeur du Registre PoolTag n'est pas définie dans le Registre.
Nom de la valeur : PoolTagOverruns
Type de données : REG_DWORD
Données : 1 | 0
1 indique que des dépassements d'allocation de pool sont détectés pour la balise spécifiée. L'allocation est placée à la fin de la page et la page de protection suit la page contenant l'allocation.

0 indique que des approvisionnements insuffisants d'allocation de pool sont détectés pour la balise spécifiée. L'allocation est placée au début de la page et la page de protection précède la page contenant l'allocation.

Des méthodes courantes pour créer ces deux clés de Registre sont par exemple :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management


Nom de la valeur : PoolTag
Type de données : REG_DWORD
Données : 0x2A

Nom de la valeur : PoolTagOverruns
Type de données : REG_DWORD
Données : 1


Remarque : pour Windows NT Terminal Server 4.0, vous devez désactiver KStackPool lorsque vous utilisez un pool spécial. Pour cela, ajoutez la valeur de Registre suivante :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


Nom de la valeur : EnableKStackPool
Type de données : REG_DWORD
Données : 0

1 - KStackPool toujours activé
2 - KStackPool activé pour les ordinateurs ayant 256 Mo ou plus de mémoire (par défaut)
Si vous n'effectuez pas cette modification sur les ordinateurs Terminal Server ayant une mémoire de 256 Mo ou plus, vous pouvez recevoir des messages d'erreur STOP 0x00000078 (PHASE0_EXCEPTION).

Remarque : après avoir effectué les modifications du Registre décrites dans cet article, redémarrez votre ordinateur pour que ces modifications soient prises en compte.

Si, après avoir activé la fonctionnalité Pool spécial, l'ordinateur cesse de répondre (se bloque) en affichant un message d'erreur sur un écran bleu lors du démarrage, redémarrez l'ordinateur en utilisant l'option Dernière configuration correcte connue. L'activation de la fonctionnalité Pool spécial n'est écrite dans l'entrée Dernière configuration correcte connue du Registre qu'après une ouverture de session normale.

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows XP Professional
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows NT Workstation 4.0 Édition Développeur
  • Microsoft Windows NT 4.0 Service Pack 4
Mots-clés : 
kbhowto kbqfe kbenv KB188831
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.