레지스트리 리플렉션

[이 항목의 정보는 Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP에 적용됩니다. Windows 7 및 Windows Server 2008 R2부터 WOW64는 더 이상 레지스트리 리플렉션을 사용하지 않으며 이전에 반영된 키는 대신 공유됩니다. 자세한 내용은 WOW64의 영향을 받는 레지스트리 키를 참조하세요.]

레지스트리 리디렉터에서는 WOW64에서 레지스트리의 특정 부분에 대한 별도의 논리적 보기를 제공하여 32비트 및 64비트 애플리케이션을 격리합니다. 그러나 일부 레지스트리 키의 값은 32비트 및 64비트 뷰 모두에서 동일해야 합니다.

레지스트리 리플렉션 프로세스는 두 레지스트리 뷰 간에 레지스트리 키와 값을 복사하여 동기화된 상태로 유지합니다. 각 보기에는 32비트 레지스트리 보기용으로, 다른 하나는 64비트 레지스트리 보기에 대해 각각 반영된 레지스트리 키의 별도 물리적 복사본이 있습니다.

RegCloseKey를 호출하여 키를 닫을 때 반영된 키가 복사됩니다. 이렇게 하면 경합 상태가 발생할 수 있습니다. 둘 이상의 프로세스가 반영된 키를 변경하는 경우 마지막 RegCloseKey 호출은 키의 최종 값을 결정합니다.

리플렉터에서는 뷰 간에 로컬 서버에 대한 COM 정품 인증 데이터를 복사하지만 64비트 Windows에서는 32/64 In Process 데이터 혼합이 허용되지 않으므로 In-Process 데이터를 복사하지 않습니다.

리플렉션은 공유 레지스트리 키 또는 리디렉션되지 않은 레지스트리 키에 대해 사용하도록 설정되지 않습니다. 예를 들어 리플렉션은 HKEY_LOCAL_MACHINE\System 키에 대해 사용하도록 설정되지 않습니다. 리디렉션, 공유 또는 반영되는 레지스트리 키 목록은 WOW64의 영향을 받는 레지스트리 키를 참조하세요.

레지스트리 리플렉션은 다음 예제와 같이 "마지막 작성자 우선" 정책을 사용합니다.

  • 64비트 Windows를 클린 설치한 후 .doc 파일을 처리하도록 64비트 Wordpad.exe 등록됩니다. 리플렉터에서는 64비트 레지스트리 보기의 .doc 등록을 32비트 레지스트리 보기로 복사합니다.
  • 관리자는 32비트 레지스트리 보기에서 .doc 파일을 처리하기 위해 32비트 Winword.exe 등록하는 32비트 Office를 설치합니다. 레지스트리 리플렉터에서 이 정보를 64비트 레지스트리 보기에 복사하므로 32비트 및 64비트 애플리케이션 모두 .doc 파일에 대한 32비트 버전의 Winword.exe 시작합니다.
  • 관리자는 64비트 레지스트리 보기에서 .doc 파일을 처리하기 위해 64비트 Winword.exe 등록하는 64비트 Office를 설치합니다. 레지스트리 리플렉터에서는 이 정보를 32비트 레지스트리에 복사하므로 32비트 및 64비트 애플리케이션 모두 .doc 파일에 대한 64비트 버전의 Winword.exe 시작합니다.

따라서 파일 연결 정보는 가장 최근에 설치된 애플리케이션에 대해 유지됩니다.

32비트 및 64비트 애플리케이션이 일반적으로 별도의 레지스트리 뷰에 기록되는 특정 레지스트리 키 값을 공유하는 데 유용할 수 있습니다. 예를 들어 32비트 및 64비트 클라이언트의 요청을 처리할 수 있는 32비트 OLE 서버는 시스템 레지스트리의 64비트 보기에서 해당 32비트 레지스트리 데이터를 사용할 수 있도록 할 수 있습니다.

구성 요소가 시스템 레지스트리에 데이터를 쓰는 경우 WOW64는 정보를 분석하고 적절한 경우 레지스트리의 대체 보기에서 데이터 복사본을 만듭니다. 일반적으로 이 프로세스는 레지스트리의 두 보기에 동일한 레지스트리 키의 두 개의 개별 물리적 복사본을 유지하며 레지스트리 리플렉션 또는 레지스트리 미러링이라고 합니다.

클래스 루트 아래의 대부분의 키는 이 범주에 있습니다. 키에 대한 업데이트 업데이트가 완료되고 키에 대한 핸들이 닫히면 반영됩니다. 특정 경우 키에 약간의 비트 종속성이 있는 경우 키에 대한 쓰기가 반영되지 않습니다. 예를 들어 32비트 InprocServer32 키는 64비트 애플리케이션과 관련이 없으므로 InprocServer32 키는 64비트 레지스트리 보기에 반영되지 않습니다. 그러나 64비트 애플리케이션은 32비트 LocalServer32 키를 사용할 수 있으며 LocalServer32 키가 반영됩니다.

HKEY_LOCAL_MACHINE\Software\Classes\CLSIDHKEY_CURRENT_USER\Software\Classes\CLSIDInprocServer32 또는 InprocHandler32를 지정하지 않는 CLSID만 반영됩니다. LocalServer32 CLSID는 Out-of-process가 실행되고 32비트 또는 64비트 애플리케이션에서 활성화할 수 있기 때문에 반영됩니다. InProcServer32 CLSID는 64비트 프로세스에서 실행하기 위해 32비트 DLL을 로드하거나 32비트 프로세스에서 실행하기 위해 64비트 DLL을 로드할 수 없기 때문에 반영되지 않습니다.

HKEY_LOCAL_MACHINE\Software\Classes\AppidHKEY_CURRENT_USER\Software\Classes\Appid의 경우 해당 값이 빈 문자열인 경우 DllSurrogateDllSurrogateExecutable 레지스트리 값이 반영되지 않습니다.

반영된 특정 키에 대해 레지스트리 리플렉션을 사용하지 않도록 설정하고 사용하도록 설정하려면 RegDisableReflectionKeyRegEnableReflectionKey 함수를 사용합니다. 이러한 함수는 이 항목의 앞부분에서 반영된 키 목록에 없는 키에는 영향을 미치지 않습니다. 애플리케이션은 만든 레지스트리 키에 대해서만 리플렉션을 사용하지 않도록 설정하고 HKEY_LOCAL_MACHINE 또는 HKEY_CURRENT_USER 같은 미리 정의된 키에 대해 리플렉션을 사용하지 않도록 설정하지 않아야 합니다. 리플렉션 목록의 키가 비활성화되었는지 여부를 확인하려면 RegQueryReflectionKey 함수를 사용합니다.

반영된 키는 트랜잭션된 레지스트리 작업에 사용하면 안 됩니다. 트랜잭션 중에 반영된 키에 쓰면 트랜잭션이 실패할 수 있습니다. 트랜잭션에 대한 자세한 내용은 커널 트랜잭션 관리자를 참조하세요.

레지스트리 리디렉터

Windows의 레지스트리 리플렉션

WOW64의 영향을 받는 레지스트리 키