Dela via


Registerreflektion

[Informationen i det här avsnittet gäller för Windows Server 2008, Windows Vista, Windows Server 2003 och Windows XP. Från och med Windows 7 och Windows Server 2008 R2 använder WOW64 inte längre registerreflektion och tidigare reflekterade nycklar delas i stället. Mer information finns i registernycklar som påverkas av WOW64.]

registeromdirigering isolerar 32-bitars- och 64-bitarsprogram genom att tillhandahålla separata logiska vyer av vissa delar av registret på WOW64. Värdena för vissa registernycklar måste dock vara desamma i både 32-bitars- och 64-bitarsvyerna.

Processen för registerreflektion kopierar registernycklar och värden mellan två registervyer för att hålla dem synkroniserade. Varje vy har en separat fysisk kopia av varje reflekterad registernyckel, en för 32-bitars registervyn och den andra för 64-bitars registervyn.

En reflekterad nyckel kopieras när en nyckel stängs genom att anropa RegCloseKey. Observera att detta ger upphov till ett möjligt konkurrenstillstånd: om fler än en process ändrar den reflekterade nyckeln avgör det sista RegCloseKey--anrop nyckelns slutliga värde.

Reflektorn kopierar COM-aktiveringsdata för lokala servrar mellan vyerna, men kopierar inte processdata eftersom 32/64-datablandning i processen inte är tillåten i 64-bitars Windows.

Reflektion är inte aktiverat för delade registernycklar eller för registernycklar som inte omdirigeras. Reflektion är till exempel inte aktiverat för den HKEY_LOCAL_MACHINE\System nyckeln. En lista över registernycklar som omdirigeras, delas eller återspeglas finns i Registernycklar som påverkas av WOW64.

Registerreflektion använder en "last writer wins"-princip som illustreras i följande exempel:

  • Efter en ren installation av 64-bitars Windows registreras 64-bitars Wordpad.exe för att hantera .doc filer. Reflektorn kopierar .doc registrering från 64-bitars registervyn till 32-bitars registervyn.
  • En administratör installerar 32-bitars Office, som registrerar 32-bitars Winword.exe för att hantera .doc filer i 32-bitars registervyn. Registerreflektor kopierar den här informationen till 64-bitars registervyn, så både 32-bitars- och 64-bitarsprogram startar 32-bitarsversionen av Winword.exe för .doc filer.
  • En administratör installerar 64-bitars Office, som registrerar 64-bitars Winword.exe för att hantera .doc filer i 64-bitars registervyn. Registerreflektor kopierar den här informationen till 32-bitarsregistret, så både 32-bitars- och 64-bitarsprogram startar 64-bitarsversionen av Winword.exe för .doc filer.

Därför bevaras filassociationsinformationen för det senast installerade programmet.

Det kan vara användbart för 32-bitars- och 64-bitarsprogram att dela specifika registernyckelvärden som normalt skrivs till separata registervyer. En 32-bitars OLE-server som kan hantera begäranden från både 32-bitars- och 64-bitarsklienter kan till exempel göra sina 32-bitars registerdata tillgängliga för 64-bitarsvyn i systemregistret.

När en komponent skriver data i systemregistret analyserar WOW64 informationen och gör en kopia av data i den alternativa vyn i registret när det är lämpligt. Normalt behåller den här processen två separata fysiska kopior av samma registernycklar i båda vyerna i registret och kallas för registerreflektion eller registerspegling.

De flesta nycklar under klassroten finns i den här kategorin. Uppdateringar av nycklarna återspeglas när uppdateringen är klar och handtaget till nyckeln stängs. I vissa fall återspeglas inte skrivningar till en nyckel om nyckeln har något bitnessberoende. Till exempel är 32-bitars InprocServer32-nyckeln inte relevant för 64-bitarsprogram, så InprocServer32-nyckeln återspeglas inte i 64-bitars registervyn. 64-bitarsprogram kan dock använda 32-bitars LocalServer32-nyckeln och LocalServer32-nyckeln återspeglas.

För HKEY_LOCAL_MACHINE\Software\Classes\CLSID och HKEY_CURRENT_USER\Software\Classes\CLSIDåterspeglas endast CLSID:er som inte anger InprocServer32 eller InprocHandler32. Endast LocalServer32 CLSID återspeglas eftersom de tar slut på processen och kan aktiveras av antingen 32- eller 64-bitarsprogram. InProcServer32 CLSID återspeglas inte eftersom det inte går att läsa in en 32-bitars DLL för körning i en 64-bitarsprocess eller en 64-bitars DLL för körning i en 32-bitarsprocess.

För HKEY_LOCAL_MACHINE\Software\Classes\Appid och HKEY_CURRENT_USER\Software\Classes\Appidåterspeglas inte DllSurrogate och DllSurrogateExecutable registervärden om deras värde är en tom sträng.

Om du vill inaktivera och aktivera registerreflektion för en viss reflekterad nyckel använder du funktionerna RegDisableReflectionKey och RegEnableReflectionKey. Dessa funktioner påverkar inte nycklar som inte finns med i listan över reflekterade nycklar tidigare i det här avsnittet. Program bör endast inaktivera reflektion för de registernycklar som de skapar och inte försöka inaktivera reflektion för de fördefinierade nycklarna, till exempel HKEY_LOCAL_MACHINE eller HKEY_CURRENT_USER. Om du vill avgöra om nycklarna i reflektionslistan har inaktiverats använder du funktionen RegQueryReflectionKey.

Reflekterade nycklar bör inte användas i transaktionsregisteråtgärder. Om du skriver till reflekterade nycklar under en transaktion kan transaktionen misslyckas. Mer information om transaktioner finns i Kernel Transaction Manager.

omdirigering av register

Registerreflektion i Windows

registernycklar som påverkas av WOW64