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#などからファイルを操作するためのライブラリなども作られているようだ。

この連載の記事
-
第512回
PC
WindowsのPowerShellにおけるワイルドカード -
第511回
PC
TFS/ReFS/FAT/FAT32/exFAT/UDF、Windows 11で扱えるファイルシステムを整理する -
第510回
PC
PowerShellの「共通パラメーター」を理解する -
第509回
PC
Windowsにも実装された、生成AIと他のシステムを接続するためのプロトコル「MCP」とは何か? -
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す - この連載の一覧へ











