Comment le mode de compatibilité sous Windows fonctionne-t-il en interne?
Comment le mode de compatibilité sous Windows fonctionne-t-il en interne?
Réponses:
Le mode de compatibilité est obtenu à l'aide de cales. Un bon article sur TechNet décrit leur fonctionnement.
Les fichiers d'application Windows contiennent une table d'importation qui indique au chargeur d'application les DLL dont l'application a besoin et les fonctions qu'elle utilise depuis celles-ci. Un processus peut par exemple faire référence GetVersionEx
à la kernel32.dll
. Lorsqu'un programme doit être exécuté en mode de compatibilité, le shim est placé entre l'application et le shim remplace la GetVersionEx
fonction, de sorte que l'application n'appelle pas à GetVersionEx
partir de kernel32.dll
mais GetVersionEx
dans le shim. Les fonctions shimmed 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 GetVersionEx
. Ainsi, lorsque vous simulez un ancienGetVersionEx
fonction ne renvoie plus les numéros de version de Windows 7, mais par exemple les numéros de version de Windows XP. Donc, l'application va croire qu'elle fonctionne sous Windows XP.
Il y a également eu quelques autres changements de la version Windows à la version Windows. Dans les anciennes versions, par exemple, si un programme chargeait une DLL, le chemin de recherche de la DLL incluait également le répertoire en cours. Il s'agit d'un problème de sécurité. Par conséquent, les nouvelles versions de Windows ne recherchent pas par défaut dans le répertoire en cours. Avec la cale appropriée, vous pouvez simuler l'ancien comportement.
Les shim n'étant qu'une couche entre l'application et l'API Windows, ils peuvent faire ce que l'application peut faire elle-même. La cale ne peut pas être utilisée par exemple pour contourner le contrôle de compte d'utilisateur ou accéder aux fichiers protégés.
Si vous voulez en savoir plus, voici quelques liens qui pourraient vous intéresser:
En particulier, Microsoft Application Compatibility Toolkit vaut le détour. Cet outil vous donne un aperçu des applications présentant des problèmes connus, de tous les correctifs de compatibilité disponibles et des modes, ainsi que des correctifs appliqués à chaque application.
Je pense qu'il se passe beaucoup de choses différentes. Un exemple simple est qu'un programme peut vérifier votre version de Windows, mais être confus par la valeur de retour d'un nouveau système d'exploitation. Donc, utiliser le mode de compatibilité indiquerait à Windows de signaler une mauvaise version. Raymond Chen mentionne encore quelques choses: http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590
D'après ce que je sais du mode de compatibilité, plusieurs appels système Windows sont liés au programme.
Un exemple évident est les fonctions GetVersionEx et GetVersion qui indiquent la version Windows spécifiée au lieu de la version réelle.
Les chemins d'accès aux fichiers de style ancien sont également automatiquement traduits lorsqu'un programme en mode de compatibilité fait référence à un fichier situé dans des dossiers système connus. Par exemple, il C:\Documents and Settings
est traduit en C:\Users\<user>\Documents
exécutant sur Windows 7 un programme en mode de compatibilité XP.
Cet article explique très bien le problème.
http://arstechnica.com/information-technology/2010/01/windows-xp-mode/
Avec Windows 7, cependant, Redmond a fourni une solution au problème: le mode Windows XP. Le mode Windows XP utilise la technologie de virtualisation pour permettre aux applications s'exécutant sur une copie virtualisée de Windows XP d'apparaître dans le menu Démarrer de Windows 7 et sur le bureau Windows 7.