なーたのおぼえがき

なーたのおぼえがき

つくったものとか

レジストリ② HKEY_LOCAL_MACHINEとHKEY_CURRENT_CONFIG

ということでレジストリキー第二弾。今回はHKEY_LOCAL_MACHINEとHKEY_CURRENT_CONFIGについて。
前回の①にも詳細情報というかサブキーの解説を追加しました。間違ってたら教えて。

前回のあらすじ

レジストリってなんやねん?
いろんな情報がまとまったデータベースだよ
ルートキー2つ(HKEY_CURENT_USERとHKEY_USERS)説明したよ
Windowsのマルチユーザ機能の仕組みをざっくりまとめたよ
これを書き始めた時点で編集してちょっと詳しくなったから良かったら確認してね
clairdeluna-eve.hatenablog.com

HKEY_LOCAL_MACHINE

システム全体・ハードウェアに関する情報を持っているキー。例えばハードウェアの構成、ドライバ情報、プラグアンドプレイ(接続したらすぐ使える)に関する情報などなど。略称は「HKLM」。
前回説明したHKU、HKCUはユーザーレベル(Windowsにログインするユーザー固有のもの)の情報を持っていたけれど、こっちはシステムレベル(ユーザーから見ると共通の設定)の情報を持ってる。ちょうど対になる感じ。
このキーが死ぬ(破損する)とWindowsが起動できなくなるよ。

サブキーは

BCD00000000 ブート構成情報(BCD:Boot Configuration Database)で使われる
HARDWARE ハードウェアの構成情報。システムが起動するたびに生成される実体のない揮発性のキー
COMPONENTS OEM構成情報。CBS(Component Based Servicing)とかで使われる
SYSTEM システム起動に必要な構成情報。起動するサービスやロードするドライバなど
SOFTWARE ソフトウェアの構成情報。システムブートに使用されないソフトウェア(完了後に実行されるもの)から参照される
SAM SAM(Security Accounts Manager)のデータベース。中身はSECURITYのSAMへのリンク
SECURITY セキュリティポリシーやユーザの権限の情報。一般ユーザや管理者権限ではアクセスできない

ここのサブキーは全部それぞれが独立したHive(ハイブ。グループを形成し個別の独立したファイルに保存される)になってるよ。
ちなみにウイルスが標的にする(書き換えを行う)ことが多いのはHKCUとHKLMのSOFTWAREだよ。

HKEY_CURRENT_CONFIG

現在使用されているハードウェア設定。と言いつつ実際はただのショートカット(ポインタ)です。中身はHKLMのSYSTEMにあるCurrentへのリンク。
XP?2000?くらいまではディスプレイ解像度情報とかをDisplayってキーで管理してたらしいけど、すでにキーがねえな。あとハードウェアプロファイルを選択する機能もXPくらいで廃止されてる(多分)。

サブキーは

Software 表示フォントとかの情報
System プリンターとかの情報

めっちゃ雑なのは仕様です。そうとしか書きようがないんじゃ。

WindowsNT起動の仕組み

実は大した理由なく前回と合わせとこっかなみたいなノリ。WindowsNTって呼称するときは特定のOSをさしてるから注意。そして起動フェーズに関して資料とかその他諸々が足りんのでNTの起動について(さらっと軽く)と各用語の解説的な何かを書くよ。起動の方法が全部変わってるわけではないと思うから現在の起動手順の参考にはなるんじゃないかな??
現在のWindowsはいわゆるNT系と呼ばれるやつ。NT系、というかWindows10の内部バージョンは10.0。Windows3.1以来の内部バージョンと呼称の一致だね。
ちなみに今回の起動の仕組みは前回のマルチユーザ機能の前段階。そりゃそうだけど。

WindowsNTの起動は8段階。

  1. ファームウェア実行
  2. OSローダー
  3. カーネルの起動
  4. 構成マネージャの初期化
  5. Executiveローダー
  6. ローダーブロックの解放
  7. セッションマネージャ
  8. サービスコントローラ
1. ファームウェア実行

ファームウェアfirmware)っていうのはハードウェアを動かすためのソフトウェア。ROM(読み出し専用メモリ)に入っていてほとんど更新されない固定的なソフトウェアのこと。PCでいうとBIOSが該当するよ。UEFIBIOSの一種とかいう人いるけどそんなわけないので。別物だけど通称的に用いられることは個人的には許容する。UEFIは仕様であってファームウェアじゃ無いから。日本語警察だわーい。
PCの電源が入れられたらまずはBIOSに通電して、ブートROMが実行されます。ブートROMは起動するのに必要なソフトウェアで、メモリのサイズや正常に動作しているか、バスの検出、初期設定をするもの。バスは道路走ってるやつじゃなくて、データ交換をする経路のことね。
次にハードディスクからブートセクタ(ブートブロックとも。ハードディスクの中でブートプログラムを格納してるとこ。確かパーティションの最初のセクタ)を読み込んで実行する。
ブートセクタも種類とかあって奥が深いけどよく知らんので気が向いたら。

2. OSローダー

OSローダーとは、OSをロードするための最小限のプログラムのことである!
そのまんまだね。これも種類があって二次とかフラッシュとか色々。
OSはハードディスクとか記憶媒体に入っているわけなんだけど、実行するプログラムはメモリにいないといけない(いないと実行できない)つまり「OSを実行するためにはメモリにOSがいないといけない」。無理じゃん?無限後退になるわけで。それを解決するのがOSローダー。別名ブートローダ。複雑な動きはできないけど、OSを読み込んで構築する位は充分できる。
そうだなー熟睡してるOSを叩き起こす目覚まし時計みたいな?
WindowsXPまではNTLDRが、Vista以降はWindows Boot Managerがブートローダーとして入ってるよ。
で、こんな感じで動く。

  1. バスからハードウェアの構成を取得し、メモリに情報を構築
  2. ローダーブロックを生成し1へのポインタを設定
  3. カーネルやHAL、ブートに必要なデバイスドライバファイルシステムのドライバを読み込む

ローダーブロックは物理メモリ上のいわゆる非ページプールメモリの情報構造になる。
非ページプールメモリ領域はずっとメモリ上に存在しないといけないものを置いておくページスワップ不可能な領域のこと。
通常メモリ上のプログラムやアプリケーションは使わなかった順や最後に使ってから時間が長い順とかで入れ替わっていくんだけど、OSとかドライバとかが入れ替わってたら使いにくいよね。だから入れ替わりの発生しない場所を作成してずっとそこにいてもらうわけです。

3でロードされるドライバーはいわゆるstartキーに0x00が設定されているものです。
startキーっていうのはHKEY_LOCAL_MACHINE\CurrentControlSet\Servicesのドライバ名がついたサブキーのこと。ここの値でドライバを読み込んだり初期化したりするタイミングが決定されます。
値と定義はこんな感じ

定義 種類 タイミング
0x00 SEVICE_BOOT_START ブート OSローダー
0x01 SEVICE_SYSTEM_START システム Executiveローダー
0x02 SEVICE_AUTO_START 自動 サービスコントローラー
0x03 SEVICE_DEMAND_START 手動 手動で開始
0x04 SEVICE_DISABLED 無効 ロードしない
3. カーネルの起動

Windowsまじでデータが少ないよう…。ここからどんどん書けることが減っていく。
レジストリからロードを制御するための情報が読み込まれて、仮想メモリを制御するパラメータ(非ページプールやページテーブルエントリなど)を設定する。いわゆるカーネルメモリの設定ですね。
カーネルメモリっていうのは、Windowsシステムの基本的な機能を実行するというかWindowsOSそのものであるカーネルを駐在させておくメモリ領域のこと。物理メモリ上に非ページプール、仮想メモリ上にページプールと呼ばれる部分に分かれています。
仮想メモリのと物理メモリので中身は別だからね。物理メモリは固定されてて仮想メモリは固定されてません。つまり仮想の方は入れ替えができるよ。
あとここで頻繁に使われるレジストリ用にメモリを設定したりします。
詳しいこと知ってる人いたら教えて…‼︎

4. 構成マネージャの初期化

カーネルによって初期化処理が行われる。まずはHKLMのHARDWARとSYSTEMのサブキーを初期化します。
この時点ではこの2つしかアクセスできないんだけど、初期化後にレジストリAPIが有効になるからアプリケーションレベルのアクセスはこの後。CurrentControlSetへのリンク確立も行われるよ。

5. Executiveローダー

Windows NT Executiveの残りのコンポーネントが初期化されてロードされる。ここで0x01を設定されたドライバが読み込まれて初期化処理されます。ここのドライバの初期化に失敗すると次に進めないし、下手するとOS再インストールになるよ。

6. ローダーブロックの解放

物理メモリのローダーブロックが解放されるよ。で、HKLMのSYSTEMのコピーが破棄されます。HARDWAREはまだ破棄しないよ。
マジで書けることがねえですわ。

7. セッションマネージャ

System32の下にあるsmss.exeがこれ。で、smss.exeはwinlogin.exeを呼ぶ。つまりWindowsにログインするアプリケーションを呼び出します。ウイルスが好むから気をつけましょう。だからと言ってむやみに消していいわけじゃないよ。
えー、ここで残ってたレジストリが初期化されて全てのレジストリエントリが使用可能になります。
今までのレジストリの書き込み要求の一部は遅延されてて、ここでまとめて書き込むよ。

8. サービスコントローラ

start値が0x02のドライバを読み込んで初期化します。ここでは失敗しても特に問題ないけど、エラーの時は(設定によるけど)警告が出るよ。
ちゃんとできるとシステムが正常起動したことになるから、前回の正常起動としてHKLMのSYSTEMにあるLastKnownGoodに設定されるよ。
Windows起動→ブルースクリーンを繰り返す時にやる「前回の正常起動時の構成を使う」の時の構成がこれ。
この保存って起動時かシャットダウン時かちょーっと曖昧なんだけど、なんとなくシャットダウンだったような??うーん、NTもふわっと最近のもふわっとしか分からないから気になる人は調べてね。

これでブート処理は完了。WindowsNTはこんな感じですね。現在は高速スタートアップとか色々あってよくわかんない。まず資料が見つからんし。