Reflection del Registro di sistema
[Le informazioni contenute in questo argomento si applicano a Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP. A partire da Windows 7 e Windows Server 2008 R2, WOW64 non usa più la reflection del Registro di sistema e le chiavi precedentemente riflesse vengono condivise. Per altre informazioni, vedere Chiavi del Registro di sistema interessate da WOW64.]
Il redirector del Registro di sistema isola le applicazioni a 32 bit e a 64 bit fornendo visualizzazioni logiche separate di determinate parti del Registro di sistema in WOW64. Tuttavia, i valori di alcune chiavi del Registro di sistema devono essere uguali sia nelle viste a 32 bit che a 64 bit.
Il processo di reflection del Registro di sistema copia le chiavi e i valori del Registro di sistema tra due viste del Registro di sistema per mantenerle sincronizzate. Ogni vista ha una copia fisica separata di ogni chiave del Registro di sistema riflessa, una per la vista del Registro di sistema a 32 bit e l'altra per la visualizzazione del Registro di sistema a 64 bit.
Una chiave riflessa viene copiata quando una chiave viene chiusa chiamando RegCloseKey. Si noti che ciò comporta una possibile race condition: se più processi modificano la chiave riflessa, l'ultima chiamata RegCloseKey determina il valore finale della chiave.
Il riflettore copia i dati di attivazione COM per i server locali tra le visualizzazioni, ma non copia i dati in-process perché la combinazione di dati in-process 32/64 non è consentita in Windows a 64 bit.
La reflection non è abilitata per le chiavi del Registro di sistema condivise o per le chiavi del Registro di sistema non reindirizzate. Ad esempio, la reflection non è abilitata per la chiave HKEY_LOCAL_MACHINE\System . Per un elenco delle chiavi del Registro di sistema reindirizzate, condivise o riflesse, vedere Chiavi del Registro di sistema interessate da WOW64.
La reflection del Registro di sistema usa un criterio "last writer wins", come illustrato nell'esempio seguente:
- Dopo un'installazione pulita di Windows a 64 bit, Wordpad.exe a 64 bit viene registrata per gestire i file .doc. Il riflettore copia la registrazione .doc dalla visualizzazione del Registro di sistema a 64 bit nella visualizzazione del Registro di sistema a 32 bit.
- Un amministratore installa Office a 32 bit, che registra Winword.exe a 32 bit per gestire i file .doc nella visualizzazione del Registro di sistema a 32 bit. Il riflettore del Registro di sistema copia queste informazioni nella visualizzazione del Registro di sistema a 64 bit, quindi sia le applicazioni a 32 bit che a 64 bit avviano la versione a 32 bit di Winword.exe per i file .doc.
- Un amministratore installa Office a 64 bit, che registra Winword.exe a 64 bit per gestire .doc file nella visualizzazione del Registro di sistema a 64 bit. Il riflettore del Registro di sistema copia queste informazioni nel Registro di sistema a 32 bit, quindi sia le applicazioni a 32 bit che a 64 bit avviano la versione a 64 bit di Winword.exe per i file .doc.
Di conseguenza, le informazioni sull'associazione file vengono mantenute per l'applicazione installata più di recente.
Può essere utile per le applicazioni a 32 bit e a 64 bit condividere valori di chiave del Registro di sistema specifici normalmente scritti in viste del Registro di sistema separate. Ad esempio, un server OLE a 32 bit in grado di gestire le richieste da client a 32 bit e a 64 bit potrebbe rendere disponibili i dati del Registro di sistema a 32 bit per la visualizzazione a 64 bit del Registro di sistema.
Quando un componente scrive dati nel Registro di sistema, WOW64 analizza le informazioni e crea una copia dei dati nella visualizzazione alternativa del Registro di sistema, se appropriato. In genere, questo processo mantiene due copie fisiche separate delle stesse chiavi del Registro di sistema in entrambe le viste del Registro di sistema e viene chiamata reflection del Registro di sistema o mirroring del Registro di sistema.
La maggior parte delle chiavi nella radice delle classi si trova in questa categoria. Aggiornamenti le chiavi vengono riflesse al termine dell'aggiornamento e l'handle alla chiave viene chiuso. In casi specifici, le scritture in una chiave non vengono riflesse se la chiave ha una dipendenza di bit. Ad esempio, la chiave InprocServer32 a 32 bit non è rilevante per le applicazioni a 64 bit, pertanto la chiave InprocServer32 non viene riflessa nella visualizzazione del Registro di sistema a 64 bit. Tuttavia, le applicazioni a 64 bit possono usare la chiave LocalServer32 a 32 bit e la chiave LocalServer32 viene riflessa.
Per HKEY_LOCAL_MACHINE\Software\Classes\CLSID e HKEY_CURRENT_USER\Software\Classes\CLSID, vengono riflessi solo i CLSID che non specificano InprocServer32 o InprocHandler32. Vengono riflesse solo i CLSID LocalServer32 perché vengono eseguiti out-of-process e possono essere attivati da applicazioni a 32 o a 64 bit. I CLSID InProcServer32 non vengono riflessi perché non è possibile caricare una DLL a 32 bit per l'esecuzione in un processo a 64 bit o una DLL a 64 bit per l'esecuzione in un processo a 32 bit.
Per HKEY_LOCAL_MACHINE\Software\Classes\Appid e HKEY_CURRENT_USER\Software\Classes\Appid, i valori del Registro di sistema DllSurrogate e DllSurrogateExecutable non vengono riflessi se il relativo valore è una stringa vuota.
Per disabilitare e abilitare la reflection del Registro di sistema per una determinata chiave riflessa, usare le funzioni RegDisableReflectionKey e RegEnableReflectionKey . Queste funzioni non influiscono sulle chiavi non presenti nell'elenco delle chiavi riflesse in precedenza in questo argomento. Le applicazioni devono disabilitare la reflection solo per le chiavi del Registro di sistema create e non tentare di disabilitare la reflection per le chiavi predefinite, ad esempio HKEY_LOCAL_MACHINE o HKEY_CURRENT_USER. Per determinare se le chiavi nell'elenco di reflection sono state disabilitate, usare la funzione RegQueryReflectionKey .
Le chiavi riflesse non devono essere usate nelle operazioni del Registro di sistema transazionate. La scrittura nelle chiavi riflesse durante una transazione può causare l'esito negativo della transazione. Per altre informazioni sulle transazioni, vedere Kernel Transaction Manager.
Argomenti correlati