윈도우 레지스트리



1. 레지스트리 개요 #

윈도우 레지스트리는 마이크로소프트 윈도우 운영체제의 설정과 선택 항목을 담고 있는 데이터베이스이다. 레지스트리에는 모든 하드웨어에 대한 설정, 운영체제, 비 운영체제 소프트웨어, 사용자 정보와 설정이 들어가 있다. 사용자가 시스템 정책, 설치된 소프트웨어를 변경하면 이에 대한 변경 사항이 레지스트리에 반영되어 저장된다.

1.1. 언제 어떻게 만들어 졌는가? #

Windows 3.1 이전 Windows 3.11 Windows 95 이후 =>
($Application)\.INI 파일 C:\Windows\Reg.DAT 레지스트리 하이브 =>

윈도우 3.X, DOS 에서는 구성 설정을 담는데 각 프로그램마다 INI 파일이 사용되었다. 당연히 이러한 파일들이 시스템 여러 곳에 퍼져있어서 찾기가 쉽지 않았는데 윈도우 3.11을 개발하는 동안 INI 파일을 제거해야 한다는 필요성이 제기되었다. 이에 새로운 파일 형식이 도입되었는데 이 파일을 Reg.DAT 이라 하고 C:\Windows 디렉터리에 저장되었으며 현재 레지스트리 구조의 선구자 역할을 했다.

2. 레지스트리 데이터 유형 #

두 가지 기본 요소
  • 키(Key)
  • 값(Value)

레지스트리는 키와 값이라는 두 가지 기본 요소를 포함하고 있다.

키는 폴더와 비슷하며 각 키는 서브키를 가질 수 있다. 각 계급 수준을 나타내기 위해 백슬래시를 사용하며 디렉터리 경로 이름과 비슷한 구문을 사용한다.

레지스트리 값은 키 안에 들어있는 이름와 데이터형을 가진 값이다.

fig3.png
[PNG image (28.28 KB)]

  • [의문] 만약 값에 백슬래시가 포함되면 어떻게 될까?
값 이름에 백슬래시를 포함할 수는 있지만, 백슬래시를 사용하면 키 경로와 구별하는 것이 어렵게 될 수 있다. 이 때문에 레지스트리 값을 찾아서 이용하는 윈도우 API는 부모 키에 대한 핸들과 값 이름을 별도 파라메터로 받아서 사용한다.

2.1. 레지스트리 값의 종류 #

  • REG_NONE
  • REG_SZ
  • REG_EXPAND_SZ
  • REG_BINARY
  • REG_DWORD/REG_DWORD_LITTLE_ENDIAN
  • REG_DWORD_BIG_ENDIAN
  • REG_LINK
  • REG_MULTI_SZ
  • REG_FULL_RESOURCE_DESCRIPTOR
  • REG_RESOURCE_REQUIREMENTS_LIST
  • REG_QWORD/REG_QWORD_LITTLE_ENDIAN

가장 많이 볼 수 있는 값은. REG_SZ, REG_DWORD, REG_BINARY이다. 많은 값 종류 중에서도 REG_MULTI_SZ 정도를 제외하면 다른 종류는 특수한 경우에만 사용되거나 거의 쓰이지 않는다.

3. 레지스트리 구조 #

레지스트리는 하나의 저장소가 아니다.

레지스트리는 하나의 저장소(Repository)를 가진 데이터베이스가 아니라 한 저장소를 논리적으로 구분하는 하이브(Hive)의 집합이다. 모든 하이브 이름은 HKEY_로 시작한다.

3.1. 레지스트리 하이브 #

  • HKEY_CLASSES_ROOT (HKCR)
  • HKEY_CURRENT_USER (HKCU)
  • HKEY_LOCAL_MACHINE (HKLM)
  • HKEY_USERS (HKU)
  • HKEY_CURRENT_CONFIG
  • HKEY_PERFORMANCE_DATA
  • HKEY_DYN_DATA

3.2. 레지스트리의 물리적 위치 #

Windows 95, 98, and ME \Windows\USER.DAT & Windows\SYSTEM.DAT
Windows 2000/XP and Vista/7 \Windows\system32\config & %userprofile%\ntuser.dat 등
fig1.png
[PNG image (95.27 KB)]


대표적으로는 다음과 같다.

HKEY_LOCAL_MACHINE \SYSTEM (%windir%/system32/config/system)
HKEY_LOCAL_MACHINE \SOFTWARE (%windir%/system32/config/software)
HKEY_USERS \.Default (%windir%/system32/config/default)
HKEY_CURRENT_USER (%userprofile%/ntuser.dat)


레지스트리의 물리적 파일은 일반적인 방법으로는 접근(복사)을 할 수 없고 SE_BACKUP_PRIVILEGE를 보안권한을 획득하면 복사할 수 있다.

3.3. 어떻게 구성되는가? #

그러면 여러 개(로 보이는)의 하이브들이 어떻게 모여 구성되는가? 이게 좀 복잡하다... 글로 설명하면 다음과 같다.

  • HKEY_CURRENT_USER (HKCU)는 HKEY_USERS\%SID(User's Security identifier)%[1]와 HKEY_LOCAL_MACHINE의 조합된 Shortcut이다. *아래 추가 설명. (사용자가 로그인하면 그 사용자의 프로파일에 대한 SID 서브키가 HKEY_USERS 아래 연결된다.)
  • HKEY_CLASSES_ROOT (HKCR)는 HKEY_LOCAL_MACHINE\SOFTWARE\Classes와 HKEY_CURRENT_USER\Software\Classes의 조합이다.
  • HKEY_CLASSES_ROOT는 HKEY_CURRENT_USER\%SID%\Software\Classes 의 Shortcut 이다.
  • HKEY_CLASSES_ROOT\SYSTEM\CurrentControlSet은 \SYSTEM\CurrentControlSet001 또는 \SYSTEM\CurrentControlSet002의 Shortcut이다. CurrentControlSet과 만약 윈도우가 예기치않게 종료되었을 때 부팅 시 마지막으로 성공한 구성 메뉴를 선택하면 다른 번호로 연결된다.
  • HKEY_USERS\%SID%_Classes는 HKEY_USERS\%SID%\Software\Classes의 Shortcut이다.
  • HKEY_CURRENT_CONFIG (HKCC)는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current의 Shortcut이다. \Current 는 또다시 \0000 또는 \0001을 의미하며 CurrentControlSet과 마찬가지다.

자세히 보면 HKEY_CLASSES_ROOT, HKEY_CURRENT_USER 등은 실제 키가 아니라 심볼릭 링크와 비슷한 개념이라는 것을 알 수 있다. 즉, 실제 레지스트리는 다음 두 개만으로 구성된다.

  • HKEY_LOCAL_MACHINE
  • HKEY_USERS

HKEY_LOCAL_MACHINE은 하드웨어 설정과 모든 사용자가 같이 쓰는 설정을 담고 있는 레지스트리이고, HKEY_USERS는 윈도우 사용자의 설정을 담고 있다. 각 하이브는 \SOFTWARE와 \SYSTEM 두 개의 동일한 서브키를 가지고 있고 하는 역할도 비슷하다. HKEY_USERS 밑에 윈도우 계정의 SID 이름을 가진 서브키는 HKEY_CURRENT_USER 와 같다. 즉, HKEY_USERS 쪽 키는 원본이고 HKEY_CURRENT_USER 는 링크라고 이해할 수 있다. 다만, HKEY_CURRENT_USER 는 단순한 링크와는 차이가 있는데 HKCU는 HKEY_LOCAL_MACHINE과 HKEY_USERS 의 사용자 SID 키의 OR 조합이다. 그리고 만약 HKLM와 HCU 양 쪽에 같은 이름의 키가 있을 경우 윈도우는 HKEY_USERS 쪽 키를 먼저 조회한다. 이 조회에서 NAME_NOT_FOUND 에러가 발생하면 HKEY_LOCAL_MACHINE의 키를 조회한다.

fig5.png
[PNG image (68.59 KB)]


4. 레지스트리 사용 #

많은 프로그래밍 언어는 자체 런타임 라이브러리나 클래스를 제공하여 프로그래머들이 레지스트리 설정을 저장할 수 있게 도와준다.

Advanced Win 32 API(advapi32.dll)
.NET의 Microsoft.Win32.Registry
델파이의 TRegistry
WSH Wscript.Shell


5. 참고문헌 #


이 글에는 0 개의 댓글이 있습니다.