Come funziona la "modalità di compatibilità" in Windows?

Come funziona internamente la modalità di compatibilità in Windows?

comp

La modalità di compatibilità viene raggiunta utilizzando cosiddetti spessori. C'è un buon articolo su TechNet che descrive come questi funzionano.

I file di applicazione di Windows contengono una tabella di importzione che indica al loader di applicazioni le DLL necessarie all'applicazione e le funzioni che utilizza da essi. Un process potrebbe, ad esempio, fare riferimento a GetVersionEx nel kernel32.dll . Quando un programma viene eseguito in modalità di compatibilità, quindi viene spostato tra l'applicazione e lo shim sostituisce la function GetVersionEx , in modo che l'applicazione non chiami GetVersionEx da kernel32.dll ma il GetVersionEx nello shim. Le funzioni shimmed attuano quindi il comportmento delle versioni precedenti di Windows. GetVersionEx è un esempio facile, each versione di Windows restituisce i propri numbers di versione in GetVersionEx , quindi quando falsando un vecchio Windows la function GetVersionEx non restituisce i numbers di versione di Windows 7, ma ad esempio i numbers di versione di Windows XP. Quindi l'applicazione crederà che sia in esecuzione su Windows XP.

Ci sono stati anche alcuni altri cambiamenti dalla versione di Windows alla versione di Windows. Ad esempio nelle versioni precedenti, se un programma ha caricato una DLL, il path di ricerca per la DLL includeva anche la directory corrente. Si tratta di un problema di protezione, per cui le versioni più recenti di Windows per impostazione predefinita non eseguono la ricerca nella directory corrente. Con lo spessore appropriato è ansible simulare il vecchio comportmento.

Poiché gli spessori sono solo uno strato tra l'applicazione e l'API di Windows uno shim può fare solo quello che l'applicazione potrebbe fare se stessa. Ad esempio, lo shim non può essere usato per aggirare UAC o per accedere ai file protetti.

Se vuoi saperne di più, ecco alcuni link che potrebbero essere interessanti:

  • Utilizzo di CorrectFilePaths Shim per redirect i file in Windows Vista
  • Creazione di un Shim Compatibility Application con il Microsoft Application Compatibility Toolkit
  • Blog di MSDN sulle basi interne degli spessori

Soprattutto Microsoft Application Compatibility Toolkit vale la pena dare un'occhiata. Questo strumento fornisce una panoramica sulle applicazioni con problemi noti, tutte le correzioni e le modalità di compatibilità disponibili e quali correzioni vengono applicate a ciascuna applicazione.

Penso che succedono molte cose diverse. Un esempio semplice è che un programma potrebbe controllare la versione di Windows, ma si confonde con il valore restituito di un nuovo sistema operativo. Quindi, utilizzando la modalità di compatibilità direbbe alle windows di segnalare una versione sbagliata. Raymond Chen menziona altre cose: http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590

La mia conoscenza della modalità di compatibilità è che causa diverse chiamate di sistema Windows per mentire al programma.

Un esempio ovvio sono le funzioni GetVersionEx e GetVersion che riportno la versione Windows specificata invece che quella reale.

I routes di file di vecchio stile vengono tradotti automaticamente quando un programma in modalità di compatibilità si riferisce a un file in cartelle di sistema ben note. Ad esempio C:\Documents and Settings viene tradotto in C:\Users\<user>\Documents quando si esegue in Windows 7 un programma in modalità di compatibilità XP.

Questo articolo fa un buon lavoro di spiegarlo.

http://arstechnica.com/information-technology/2010/01/windows-xp-mode/

Con Windows 7, tuttavia, Redmond ha fornito una soluzione al problema: Windows XP Mode. La modalità di Windows XP utilizza la tecnologia di virtualizzazione per consentire alle applicazioni di eseguire su una copia virtualizzata di Windows XP visualizzate nel menu di avvio di Windows 7 e nel desktop di Windows 7.