このページの本文へ

前へ 1 2 次へ

Windows Info 第36回

Windowsの設定を保存するレジストリの構造を分析する

2014年12月04日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

Windowsの設定データをAPIからアクセスできるよう
情報がまとめて保存された「レジストリ」

 レジストリ(Registry)とは、Windowsがシステムやアプリケーションの設定データなどを管理する仕組みだ。ファイルに直接保存する設定情報と違い、構造化されたデータをAPI経由でアクセスするため、データの読み書きや解釈に対する処理が不要で、高速なアクセスが可能というメリットがある。

Windowsの設定情報が格納されたレジストリ。レジストリエディタから、中身を見たり、編集することが可能

 初期のWindowsでは、ファイルに設定データなどを保存していたが、システムが複雑化/高性能化するとファイルによる管理が困難になる。そこで導入されたのがWindowsのAPIを介してアクセスする構造化されたデータ構造であるレジストリだ。

 レジストリに含まれている情報の一部は、ファイルに保存されるが、その処理はWindows側でまとめて行なうため、レジストリを利用する側では、ファイルの読み書きやデータの保存のタイミングなどを意識する必要がない。また、あらかじめ定義されたデータ形式で文字列や整数値を扱えるため、API経由で入手したデータを変換するなどの手間も不要になる。

 また、レジストリは、Windowsが持つハードウェアや動作状態に関する情報も同じ形式で提供し、システム情報を入手するための方法としても利用されている。こうした情報は、ファイルには保存されず、Windowsが必要に応じて自動的に作り出して、APIを介して提供している。このような情報を「揮発性」があるという。

 これに対して、ファイルに保存されているレジストリ情報は、システムの電源がオフになっても、値を保持できるため、「不揮発性」であるいう。また、レジストリでは、ファイルに格納されているレジストリ情報を「ハイブ」と呼ぶ。レジストリは、複数のハイブと揮発性の情報から構成されている。

 基本的にはレジストリを扱うには、WindowsのAPIを使うが、その一部は、Windows付属のレジストリエディタ(RegEdit.exe)で編集することができる。ただし、レジストリエディタが扱えるのは、レジストリの一部で、レジストリの中にはレジストリエディタでアクセスできない部分も存在する。

レジストリを構成する要素

 レジストリは、ファイルシステムのフォルダのような「ツリー構造」でデータを管理している。レジストリには、このツリー構造を作るレジストリの要素を「キー」という。

 「キー」は、フォルダのようなもので、その下に複数のキーを含むことができる。あるキーの下にあるキーを「サブキー」と呼び、サブキーを含むキーをサブキーの「親キー」ということがある。また、レジストリには、6つのルートキーがある。ルートキーは、キーのツリー構造の起点となる部分で、最も上にある「親キー」だ。

ルートキー Reg
Edit
略称 Hive/Link 備考
サブキー Hiveファイル
HKEY_CLASSES
_ROOT
HKCR HKLM\SOFTWARE\Classesと
HKEY_USERS\<SID>
\SOFTWARE\Classesを合成したもの
クラス定義と拡張子の関連づけ
HKEY_CURRENT
_USER
HKCU HKEY_USERの下のログオンしているユーザーのサブキーにリンク  
HKEY_LOCAL
_MACHINE
HKLM BCD00000000 \Boot\BCD システム全体、ハードウェアに関する情報
COMPONENTS %SystemRoot%\System32
\Config\COMPONENTS
SYSTEM %SystemRoot%\System32
\Config\SYSTEM
SAM %SystemRoot%\System32
\Config\SAM
SECURITY %SystemRoot%\System32
\Config\SECURITY
SOFTWARE %SystemRoot%\System32
\Config\SOFTWARE
HARDWARE 揮発性
HKEY_CURRENT
_USER
HKCU HKEY_USERの下のログオンしているユーザーのサブキーにリンク  
HKEY_USERS HKU <SID> %SystemRoot%\ServiceProfiles\NetworkService\Ntuser.dat
%SystemRoot%\ServiceProfiles\LocalService\Ntuser.dat
\Users\ユーザー名\Ntuser.dat
AppData\Local\Microsoft\Windows\Usrclass.dat
ユーザーすべての情報
.DEFAULT %SystemRoot%\System32\Config\Default
HKEY_CURRENT
_CONFIG
HKCC HKLM\SYSTEM\CurrentControlSet
\Hardware Profiles\Currentへのリンク
 
HKEY_PERFOR
MANCE_DATA
× HKPD 揮発性 パフォーマンスデータ

 キーには、かならず名前がつく。名前にはASCII文字や日本語(UTF-16LE形式)を含む文字列が利用できる。その最大長は230文字である。ただし、キーの名前に「\」を含むことはできない。キー名には、空白を含むことができるが、このような場合、扱うときにダブルクオートで括るなど、ファイルパスと同様の扱いが必要になる。

 キーには、サブキーのほかに「値」を保存することができる。値は、「名前」、「種類」、「データ」という構造を持つ。つまり、情報を「種類」で指定した形式として「データ」に保存し、これに「名前」を付けるわけだ。

 「種類」は、あらかじめ既定されたもののみが利用できる。システムとして定義されているデータ形式は12種類あるが、そのうち6種類だけをレジストリエディタで扱うことができる。Plug & Play用のデータ形式(Resource関連)もあるが、レジストリエディタで扱うことができるのは文字列または整数およびバイナリのみである。

API上の種類(タイプ) RegEditでの種類 意味
REG_BINARY バイナリ値 特定の形式を持たないバイトデータ
REG_SZ 文字列値 改行を含まない固定長の文字列
REG_EXPAND_SZ 展開可能な文字列値 環境変数で展開される文字列(%~%)
REG_MULTI_SZ 複数行文字列値 改行を含む文字列
REG_DWORD/
REG_DWORD_LITTLE_ENDIAN※1
DWORD(32ビット)値 32bit符号なし整数値(リトルエンディアン)
REG_DWORD_BIG_ENDIAN ー※2 32bit符号なし整数値(ビッグエンディアン)
REG_QWORD/
REG_QWORD_LITTLE_ENDIAN※1
QWORD(64ビット)値 64bit符号なし整数値(リトルエンディアン)
REG_LINK リンク。データを他のキーへのパスとして解釈
REG_NONE タイプなし
REG_RESOURCE_LIST リソースリスト
REG_FULL_RESOURCE_DESCRIPTOR リソース記述子
REG_RESOURCE_REQUIREMENTS_LIST リソース要求リスト

※1:形式としては同一、※2:非リトルエンディアンのシステムで利用

 同一親キーのもとでは、同じ名前を持つ「値」は1つしか存在できないが、親キーが違うなら、同名の「値」は登録可能だ。また、すべてのキーは「(既定)」という名前の「値」を持ち、「種類」は「文字列値」に固定されていて、この名前の「値」をユーザーがあとから作成することはできない。なお、名前には、日本語を含む任意の「文字」が利用できるが、長さは255文字以下となっている。

 データは「種類」に応じたものが格納される。文字列の長さはAPIの仕様上は32bit値で表現(4ギガバイト)されるが、実際に扱える長さは、システムのメモリなどの状態で決まる。逆にいうと、扱える長さは、システムによって違う。レジストリの値は巨大なデータを扱うためには作られておらず、大きなデータを登録することは、システム性能の低下につながる。なお、マイクロソフトでは、2048バイト以上のデータは、ファイルに保存し、そのファイルパスをレジストリに登録することを推奨している。このため、実用上、データの長さは、2048バイト程度となる。

 「値」や「キー」は、ルートキーからの「パス」で指定する。ファイルパスと同様にルートキーから目的のキーまたは「値」まで、親キーを「\」でつないで表現する。レジストリのパスを文字として表現する場合、略号を使うことがある。たとえば、HKEY_LOCAL_MACHINEは、HKLMと表現される。ただし、これは、あくまでも書籍やプログラム表示上の表記方法であって、レジストリエディタなどがインポート/エクスポートするテキストファイルなどでは、省略しない表記方法が必要となる。

 レジストリのうち、ファイルに情報が記録されているキーを「ハイブ」という。レジストリの一部は、このハイブからできている。具体的には、各ユーザーの情報(HKEY_USERS)のサブキーは、それぞれがハイブになっている。また、HKEY_LOCAL_MACHINEのサブキー(HARDWAREを除く)もハイブだ。

 ハイブに対応するファイルの形式は、正式には公開されていないが、インターネットなどでは解析した結果が公開されており、C#などからファイルを操作するためのライブラリなども作られているようだ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン