Un détail fin sur la façon dont les DLL sont déplacées à la suite d’une collision d’adresse de base, et les conséquences

Raymond

19 Janvier, 2017

Si une DLL doit être déplacée en raison d’un conflit d’adresse de base, l’image sera déplacée et la totalité de la DLL déplacée est désormais sauvegardée par le fichier de page.

Si vous lisez la description plus attentivement, vous verrez que ce n’est pas exactement la totalité de la DLL déplacée qui est sauvegardée par le fichier de page. Plus précisément, toutes les pages contenant des correctifs sont placées dans le fichier de page. Si vous avez de la chance et que vous avez une page sans correctifs, alors cette page sera toujours paginée à la demande à partir de l’image car le noyau ne lui a appliqué aucune correction, et n’a donc pas subi de copie en écriture pour cette page, donc elle continue d’être soutenue par l’image du système de fichiers.

L’un des arguments que j’ai vus pour provoquer intentionnellement une collision d’adresse de base est que la DLL déplacée soit copiée dans le fichier de page, ce qui est une victoire si le fichier de page est sur un support plus rapide que la DLL. Par exemple, le fichier de page peut être sur un disque SSD ou (gasp) un lecteur RAM.

Cette logique ne prend pas en compte le cas des pages sans corrections. Ces pages seront toujours en page directement à partir du fichier d’origine, ce qui pose problème si le fichier d’origine est sur un support très lent, ou un support qui pourrait être perdu, comme un lecteur de CD-ROM ou un lecteur réseau.

Heureusement, vous n’avez pas besoin de jouer à des jeux amusants avec des conflits d’adresses de base pour charger l’intégralité de votre DLL dans le fichier de page. Utilisez plutôt l’indicateur /SWAPRUN de l’éditeur de liens qui vous permet de spécifier dans l’en-tête du module que le chargeur doit copier l’image dans le fichier d’échange.

Raymond Chen

Suivre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.