Comment fonctionne le Mode de compatibilité dans Windows en interne ?
Réponses
Trop de publicités?Le mode de compatibilité est obtenu en utilisant ce qu'on appelle des shims. Il existe un bon article sur TechNet décrivant comment ils fonctionnent.
Les fichiers d'application Windows contiennent une table d'importation qui indique au chargeur d'application quels DLL l'application a besoin et quelles fonctions elle utilise à partir d'eux. Un processus pourrait par exemple faire référence à GetVersionEx
dans le kernel32.dll
. Lorsqu'un programme doit s'exécuter en mode de compatibilité, le shim est placé entre l'application et le shim remplace la fonction GetVersionEx
, de sorte que l'application n'appelle pas GetVersionEx
de kernel32.dll
mais le GetVersionEx
dans le shim. Les fonctions shimées implémentent ensuite le comportement des versions précédentes de Windows. GetVersionEx
est un exemple simple, chaque version de Windows renvoie ses propres numéros de version dans GetVersionEx
, donc en imitant un ancien Windows la fonction GetVersionEx
ne renvoie plus les numéros de version de Windows 7 mais par exemple ceux de Windows XP. Ainsi l'application croira qu'elle s'exécute sous Windows XP.
Il y a également eu d'autres changements d'une version de Windows à une autre. Dans les anciennes versions par exemple, si un programme chargeait un DLL, le chemin de recherche du DLL incluait également le répertoire courant. C'est un problème de sécurité, donc les nouvelles versions de Windows par défaut ne recherchent pas dans le répertoire courant. Avec le bon shim, vous pouvez simuler l'ancien comportement.
Comme les shims ne sont qu'une couche entre l'application et l'API Windows, un shim ne peut faire que ce que l'application pourrait faire elle-même. Le shim ne peut pas être utilisé par exemple pour contourner l'UAC ou accéder à des fichiers protégés.
Si vous voulez en savoir plus, voici quelques liens qui pourraient vous intéresser :
- Utiliser le shim CorrectFilePaths pour rediriger les fichiers sur Windows Vista
- Créer un shim de compatibilité d'application avec le Microsoft Application Compatibility Toolkit
- Blog MSDN sur les bases internes des shims
Particulièrement le Microsoft Application Compatibility Toolkit vaut le détour. Cet outil vous donne un aperçu des applications avec des problèmes connus, toutes les corrections de compatibilité disponibles et les modes et quelles corrections sont appliquées à chaque application.
Je pense que beaucoup de choses différentes se produisent. Un exemple simple est qu'un programme pourrait vérifier votre version de Windows, mais être confus par la valeur de retour d'un nouveau système d'exploitation. Ainsi, l'utilisation du mode de compatibilité indiquerait à Windows de signaler une mauvaise version. Raymond Chen mentionne quelques autres choses : http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590
Mes connaissances sur le Mode de compatibilité sont que cela entraîne plusieurs appels système Windows à mentir au programme.
Un exemple évident sont les fonctions GetVersionEx et GetVersion qui rapportent la version Windows spécifiée au lieu de la véritable.
Les anciens chemins d'accès aux fichiers sont également automatiquement traduits lorsqu'un programme en mode de compatibilité fait référence à un fichier dans des dossiers système bien connus. Par exemple C:\Documents and Settings
est traduit en C:\Users\\Documents
lors de l'exécution sur Windows 7 d'un programme en mode de compatibilité XP.
Cet article fait un bon travail pour l'expliquer.
http://arstechnica.com/information-technology/2010/01/windows-xp-mode/
Avec Windows 7, cependant, Redmond a fourni une solution au problème : Windows XP Mode. Windows XP Mode utilise la technologie de virtualisation pour permettre aux applications s'exécutant sur une copie virtualisée de Windows XP de s'afficher dans le menu Démarrer de Windows 7 et sur le bureau de Windows 7.