さるもすなるぷろぐらむW  USB-Boot

■USBストレージからWindowsを起動する
  ための無駄知識(既に時代はVista?)

<内容>
 ●ブートシーケンス
 ●OSローダ以前について
 ●Boot.iniの内容
  ◆ARCパス名について
  ◆OS起動オプションについて
 ●ntldr以降の動き(想像)
 ●ドライブ名(レター)を変更する方法
 ●PageFile関連
 ●USBストレージから起動するには(想像)



注)レジストリの変更など、ツール/ユティリティを必要とする設定内容が記述されている 場合があるが、それらに関しては特に言及しない。知っている人を前提に記述しています。
また、このサイトで説明しているのは、WindowsXP、2000のことです。Vistaには合ってません。


●ブートシーケンス
DOS/V系PC-WindowsのOS起動のシーケンスは以下のようになっている。

BIOS-IPL => MBR => BR => OSローダ => OSカーネル => ・・・・・

1)BIOS
BIOS-ROMから読込まれて、各種ハードの動作設定を行い、ブートデバイスとして 設定されているハードデバイス(通常IDE-HDD)の先頭セクタ(MBR)を読込み、 その中のプログラムを起動する。MBRのロード先は7C00h番地でその先頭にJUMPする。
ブートデバイスはBIOSにより有効なMBRが検出された時点で番号80Hとして識別され 基本的にはINT13でアクセスできるようになっている。

たとえば、USBをサポートしているBIOSでブートデバイスの優先順位が、
 @FDD、ACD-ROM、BUSB-HDD、CIDE-HDD
となっていた場合、FDD、CD-ROMの順でBootableなメディアがセットされているかを 検索し、なければUSB-HDDをアクセスしてみる。USB-HDDが接続されて有効なMBRが存在 すると、以降USB-HDDがINT13-DL:80Hでアクセスできるようになる。USB-HDDがなければ、 IDE-HDDからMBRを検索する。

※BIOS毎にNetworkBootなどの機能もあり、ユニークな部分もあるため、詳細はボード、 BIOSメーカに問い合わせないと分からない。

2)MBR
ブートデバイスの先頭セクタ(512byte)を言う。BIOSによりロードされてCPU制御を 渡される。
内容は、

@マスタブートプログラム(〜1b7h)
自身を7C00h番地以外に移動し、その後パーティションテーブルをチェックし、 ACTIVEなパーティション検出すると、その先頭のセクタ:BRを7C00hにロードし JUMPする。BRのロードには基本的にINT13(Extendedも含む)を使用する。
ADiskSignature(1b8h:4byte)
OS側では「ディスク署名」とか呼んでいるのが、多分ここの固有な番号。中身 自体は意味不明。boot.iniでARC名のsignature()で記述されるのが、ここで、ディ スクを識別するために使用しているらしい。
Bパーティションテーブル(1beh:48byte)
ディスク内を(論理)ドライブとして使用するための区画。詳細は、別途メモにて。
CSignature(1feh:2byte:55h-AAh)
ブートセクタであることを識別するためのID(固定値:55h-AAh)。BRにもある。

3)BR
MBR、あるいはBIOSによってロードされるセクタ(512byte)。FDなどの場合は、BRが  先頭セクタにあるため、BIOSが直接ロードする。パーティションで区切るディスクでは、 各パーティションの先頭にある。
内容は、

@JUMP命令、OS名、OSバージョン(〜0ah)
ロード時にBブートプログラムにJUMPするための命令が先頭にあり、その後ろに メディアをフォーマットしたOS名、バージョンなどが記録されている。
ABPB:BIOSパラメータ・ブロック(〜3eh???)
そのパーティション(論理ドライブ)のフォーマットに関する情報。長さ/内容は フォーマット=ファイルシステム毎に異なる。
ただし、トラック当たりのセクタ数、ヘッド数、隠しセクタ数の格納位置は固定。
Bブートプログラム
OSのローダをロードするためのプログラム。フォーマッタ毎に内容は異なる。
OSローダのロードには、基本的にINT13(Extendedも含む)を使用する。
BPB内の「隠しセクタ数」(オフセット:1ch)で自分の属するパーティション位置 を認識し、さらにそこからOSローダ(NTLDRなど)を検索しロードする。
CSignature(1feh:2byte:55h-AAh)

4)OSローダおよびカーネル
当然のことながら、デイスク内の格納位置、内容に関してはOSごとに異なる。
WindowsNT以降(98/ME系以前を除く)Windowsの最初のローダはntldrと言うファイル で、ブートデバイスの(Diskの場合)activeパーティションのルートディレクトリ下 に存在する。起動するOSはboot.iniファイル内に書かれている情報を元にする。
以下のファイルがルートにあることが動作の前提となる。
・ntldr
・boot.ini
・ntdetect.com
・bootfont.bin
・ntbootdd.sys(boot.ini内に起動ドライブ:scsi()...が存在する場合にのみ必要。
          実際は、scsi miniportドライバをリネームして置くらしい。)

NTLDRは、BR(BPB)情報を基に自パーティション位置を決め、他のブート用ファイルを  ロードする。よってBPB内の隠しセクタ数値を他のパーティション位置に変更すると  boot.iniをそこから検索する。



●OSローダ以前について
ローダに辿り着くまでは、DOS以降ずっと同じで、若干BIOSがOSの追加、サポートデバイス の増加、パワーマネージメント関連で変化してきている。特にPCが、設定やPNPデバイスの 出現で都度起動デバイスを変更できるようになったため、実際接続されているデバイスの 番号をどのように認識させるかということが、以降のOSの判断と絡んで、かなり難解に なったように思われる。

DOSの場合は、ルートディレクトリ下に格納されている以下のファイルが本来のOSファイル (実際は大文字ファイル名であるが、あえて小文字で表記する。)
・io.sys
多分ローダ的な役割を果たすのだとおもう。コンソール系デバイスの基本的なI/Oを 司るもの。DOSの場合このファイルが論理ドライブ内のファイル格納領域の先頭にな ければならない。(ハズ)
・msdos.sys
DOSのカーネル。
・config.sys
ドライバの起動、その初期設定パラメータ、起動シェルについて書かれている。 通常シェルはcommand.com
・autoexec.bat
シェル上で実行する初期設定バッチプログラム。CD-ROM装置へのドライブレターの割 当てなどはここでやっていたような。
WindowsNT以降(98/ME系以前を除く)のOSではブートシーケンスのntldr以降が結構分かり にくい、というより情報が少ない。よってこのメモも書き始めた。



●Boot.iniの内容
ちなみに、今使っているWindowsXP PCのルートにあるboot.iniは以下の内容。
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows・・・" /fastdetect
上記の中身の意味は、
・[boot loader]
:OS起動に関する基本動作を表すセクション。
・timeout
:選択する[operating system]内の選択肢(行)が複数あった場合に、それを選択 する待ち時間。秒単位で指定する。
・default
:起動するOSがどこに入っているかを示す記述。この記述をARCパ名と呼ぶらしい。
詳細は以下に。
・[operating systems]
:起動できるOSの一覧を表すセクション。
もしこのセクションで指定されているOS一覧から明示的にOSを選択しない場合は、 defaultで指定されたARC名に一致する最初のOS(ドライブ)が選択される。
・ARC名と表示テキストとオプション
:[operating systems]以下は起動できるOSの選択肢を表す。
  ARC名="表示OS名" /起動オプション /・・・・
の形式で指定する。
※“C:\doslike.bin=・・・・”などと指定すると、ローダとしてではなく、動作 プログラムとしてdoslike.binを起動する。
  
◆ARCパス名について
1)ARC名の最初の、multi()、scsi()、signature()は、ブードドライブをアクセスする ためのOSの正式なドライバが動作しだす前に何をつかって、ロードするかを示す。

・multi()
:BIOS−INT13を使う。従ってBIOSがサポートしているデバイスがブートデバイスで なければ指定できない。BIOSがサポートしていればいいと言うわけではないが、 ()内の番号は本来IDEアダプタの番号を表すようにできていたと思うが、現在の BIOSでは無意味なので、常に0。
・scsi()
:scsiディスクのような特殊なドライバが必要であることを示す。ドライバがブー トドライブのルートディレクトリ下にNTBOOTDD.SYSの名前で存在しなければなら ない。逆を返せば、選択するOSのARC名がmulti()のみならば、NTBOOTDD.SYSは不 要ということ。
()内の番号はSCSIアダプタの番号。PCIアダプタなら先に認識される方から0〜の 番号を振る。
・signature()
:前提としては、scsi()と同じで専用のドライバを必要とする。ただ、sigunature の場合、さらにMBRに含まれるDiskSignatureをチェックして、boot.iniが作成さ れたときのターゲットドライブがPNPのおかげで順番が違っていないかどうかを チェック検索するらしい。
()内には、DiskSignature(●ブートシーケンスの「MBR」の説明参照。)を記述 する。

2)2-3番目のdisk()、rdisk()は、ディスクの番号を表すものだが、どうもSCSI向けに 考えられているらしい。

・先頭がscsi()であれば、
disk()が「target」番号(SCSI-ID:例えば、アダプタ(initiator)がID7で、それに ID2とID6のデバイス(target)が接続されていれば、target番号は0と1に割当たる)で、 rdisk()が「LUN」(論理ユニット番号:通常0)を表す。
・一方、multi()であれば、
BIOS側は2段階認識になっていない(単純に80h,81h・・・・と番号付ける)ので、 disk()は常に0、rdisk()のみ0〜の番号を付ける。
簡単に言ってしまえば、ntldr?か、NTBOOTDD.SYSドライバが、複数ある(自分がアク セスできる)デバイスをどういう番号付けでアクセスするかを表す。

・signature()の場合は、
不明。たぶんNTBOOTDD.SYSしだいということになる。

3)最後のpartition()は、文字通り指定されたディスク内のパーティションの番号 (1〜)を表す。ただし、MBRのパーティションテーブル内のプライマリ(基本) パーティションに先に1からの番号を付けて、拡張パーティション内の掘り下げは その後になる。従って、基本1区画、拡張1区画(内2区画)、基本1区画と分けら れていた場合、拡張内の2番目の区画(論理ドライブ)は、4で表される。


◆OS起動オプションについて
「ARC名=表示名」の後ろに、以下のような“/....”でOS起動オプションを指定できる。
例えば、
・問題判別などの理由で、頻繁にセーフモードなどを使用する場合
・デバックターミナルと接続してカーネルデバッカでテスト・デバックしたい場合
F8 キーを押さなくてもいいように、拡張オプション付きのメニューを表示させること ができる。

 オプションの種類のだいたいの意味は、以下。
<通常入るもの>
▼/FASTDETECT={com1|com2|comx,y,z...}
ntdetect.com内でのシリアル/バスマウス検出を止める。これら以外のマウスを 起動時に接続している場合に使用する。ポートを特定せずにこのオプションを 使用すると、全てのポート上でシリアルマウスの検出を禁止する。

<カーネルデバッカ関係>
▼/DEBUG
カーネルデバッカ(デバッグモード)で起動して、ターミナル装置(COMなどで接続 した別PC)からのデバックを可能にする。
 
▼/DEBUGPORT={com1|com2|1394}
デバックモード時のターミナル装置との接続ポートを指定する。
▼/BAUDRATE=xxxx
上記で指定したターミナル装置間との通信速度を指定する。
デフォルトは9600bps
▼/CHANNEL=nn
  /debugport=1394と指定した際のIEEE1394の使用チャネルを0〜62で指定する。デフォル   トは0。Windows XP以降で使用できる。
▼/NODEBUG
カーネルデバックを禁止する。・・・必要?
▼/BREAK
HALの初期化時にブレークポイントを有効にする。HALはカーネルデバッガが接続する まで待ちます。/debugスイッチと併用すると、0x00000078 (PHASE0_EXCEPTIN) の ブルースクリーンを表示して停止する。
▼/CRASHDEBUG
OSを起動したが、停止メッセージエラーが発生するまでinactiveのままであるよう なとき、カーネルデバッカを起動する。不定期に発生するカーネルエラーなどが ある場合に有効。

<セーフモード関係>
▼/SAFEBOOT:parameter
セーフモードで起動する。parameterは以下が指定できる。
 ・MINIMAL:セーフモード
 ・NETWORK:セーフモードとネットワーク
 ・MINIMAL(ALTERNATESHELL):セーフモードとコマンドプロンプト
  HKML\SYSTEM\CurrentControlSet\Control\SafeBoot\AlternateShell
  で指定されたシェルを使う。
 ・dsrepair:ディレクトリサービス復元モード
F8で表示するメニューと同じ効果にするには以下のような組合せで指定する。
 ・セーフモード
  :/safeboot:minimal /sos /bootlog /noguiboot
 ・セーフモードとネットワーク
  :/safeboot:network /sos /bootlog /noguiboot
 ・セーフモードとコマンドプロンプト
  :/safeboot:minimal(alternateshell) /sos /bootlog /noguiboot
▼/SOS
OS起動時にロードしているドライバの名前を画面に表示する。
OS起動途中でハングするような場合に使う。
▼/BOOTLOG
%systemroot%\Ntbtlog.txtとしてブートログを保存する場合に指定する。
▼/CMDCONS
回復コンソールを起動する。
▼/LASTKNOWNGOOD
F8で表示するメニューの「前回正常起動時の構成」と同じにシステムを起動します。

<ディスプレイ/表示関係>
▼/BASEVIDEO
起動後の画面をVGAモード(640X480 16色)で表示する。
ディスプレイドライバの誤設定で画面が出なくなったような場合に使用する。
 
▼/NOGUIBOOT
ログオンプロンプト前の(プログレスバー表示時)のビットマップ表示を禁止する。
▼/BOOTLOGO
XP以降で利用できるオプションで、ブート時に標準のWindowsロゴではなく、独自の ビットマップを表示します。ビットマップは、%SystemRoot%\Boot.bmpとして、VGA (640X480 16色)でなければならない。/noguibootと併用する。

<XP Embedded/旧OS関係>
▼/MININT
Windows PEで使用され、構成マネージャに対して、SYSTEMレジストリハイブを揮発性 ハイブとしてロードするように指示する。この場合、メモリ内の変更はハイブイメー ジに保存されない。
▼/SDIBOOT=ファイル名
Windows XP組み込みシステムで使用され、指定したSDIファイル内のRAMディスク イメージからWindowsをブートする。
▼/RDPATH=パス
ネットワーク上のブート用SDI (System Disk Image) ファイルのパスを指定する。
▼/RDIMAGEOFFSET=xxxxx
/RDPATH=と併用し、SDIファイル内のシステムイメージの開始オフセットを指定する。

▼/WIN95
bootsec.dosがロードされる。Windows 9xを起動する場合に使う。
▼/WIN95DOS
bootsec.w40がロードされる。Windows 9xをMS-DOSモードで起動する場合に使う。

<メモリアサイン関係>
▼/3GB
x86ベースシステムに対して、OSが仮想空間の3GByte(通常2GByte)をアプリケー ションに、1GByteをカーネルと他のコンポーネントに割り当てることを指定する。 アプリケーションが追加された仮想空間を利用できるようにデザインされて いなければならない。
▼/USERVA=
/3GBスイッチの使用時に、プロセスに割り当てるメモリ容量をカスタマイズする ために使用する。このスイッチにより、PTE(Page Table Entry) カーネルメモリを 増やすことができが、3GByteのプロセスメモリ領域のほとんどは引き続き維持される。
▼/MAXMEM=number
OSが使用できるRAMの最大容量を指定する。メモリチップの欠陥を探すような場合に 使用する。全体の使用物理メモリを指定して、エラーありなしを確認し、指定範囲を 超えた物理メモリ内での不良有無を判定できる。
▼/BURNMEMORY=number
性能やRAM不足に関連するような他問題を確認する際に指定するパラメタで、OSが 使用できない物理メモリの容量をMbyte単位で指定する
▼/PAE
4GBを超える物理メモリを搭載したシステムでx86 Windowsを使用するときだけ有効な スイッチ。64bit物理アドレスを提供するPAE対応のカーネルをロードする。セーフモード ではこのスイッチは無効。
▼NOLOWMEM
/paeスイッチが指定され、4GB以上の物理メモリを搭載したシステムだけで利用できる スイッチ。システム全体 (ドライバ、プール、プログラムなど) を4GBよりも上のメモリ 領域にロードさせる。
▼/NOPAE
PAE非対応のWindowsカーネルをロードします。

 <マルチCPU関係>
▼/NUMPROC=number
マルチCPUシステムで、使用するCPUを制限する場合に使用する。使用するCPU数を 指定する。
▼/CLKVL
x86マルチCPUシステムでHALのシステムクロックをエッジ動作ではなくレベル動作に する。
▼/KERNEL=xxxxxx
起動時にロードされるカーネルのファイル名を指定する。カーネルのテストで使用 する。また、マルチCPUモードとシングルCPUモードとを切り替えて起動する場合にも 利用できる。/KERNEL=ntkrnlmp.exeと指定すると、
%systemroot%\System32\Ntkrnlmp.exeがカーネルとしてロードされる。
▼/HAL=xxxxxx
起動時に読み込まれるHAL(Hard Abstraction Layer)ファイル名を指定する。
HALのテストで使用する。また、/kernelと組み合わせて使用することで、マルチCPU モードとシングルCPUモードとを切り替えて起動する場合にも利用できる。
▼/TIMERES=nnnnn
標準x86マルチCPU用HAL上のシステムタイマの精度を100ナノ秒単位で指定する。
ただし、実際はHALがサポートする近似値になる。
▼/INTAFFINITY
x86マルチCPU用HALの割り込み競合を調整し、番号の最も高いCPUだけが割り込みを受 信するように指定する。このスイッチを指定しない場合は、すべてのCPUが割り込みを 受信する。
▼/MAXPROCSPERCLUSTER
標準のx86マルチCPU用HALに対し、クラスタモードのAPIC (Advances Programmable Interrupt Controller) アドレッシングを強制的に有効にする。
▼/ONECPU
Compaq社製のHALの一部で、起動時に1つのCPUだけを使用するようにします。マルチ カーネル構成で単一のCPUを動作させる場合に利用します。

 <ハードリソース関係>
▼/PCILOCK
x86ベースシステムに対して、OSが、PCIデバイスに直接的にI/Oポート空間、IRQを割 当てるのを止める。BIOSの設定を有効にする。
▼/SCSIORDINAL
SCSIコントローラのSCSI IDをWindowsに通知する。
▼/YEAR=yyyy
このスイッチはY2Kテストのために用意されたもので、コンピュータのリアルタイム クロックが報告する年を無視して指定した年を使用するように指示する。

 <その他>
▼/NOEXECUTE=parameter
64bit Windowsの実行回避保護機能 (DEP) を有効にする。x64 CPUで動作し、かつ/PAE スイッチが有効となっている32bit Windowsでのみ有効なオプション。このスイッチは 64bit Windowsではデフォルトで有効になっている。
・OPTIN
:重要なWindowsのプログラムおよびサービスにのみDEPを有効とする。
・OPTOUT
:指定されたものを除くすべての実行イメージに対してDEPを有効にする。
・ALWAYSON
:特定のアプリケーションを排除する機能を持たないすべてのコンポーネ ントに対してDEPを有効にする。
・ALWAYSOFF
:DEPを無効にします。
▼/EXECUTE
実行回避保護機能を無効にする (/noexecuteの逆)。
▼/NOSERIALMICE:comx,...
Windows NTでのみ有効。指定したCOMポートのシリアルマウスチェックを無効にする。
複数のポートを無効にするには、各ポートをカンマで区切って指定する。
ポートを指定しなかった場合は、すべてのポートのシリアルマウスチェックが無効に なる。このスイッチは、シリアルポートに接続する無停電電源装置 (UPS) がシリアル マウスチェックにより意図しないシャットダウンモードに入ることを防ぐ。逆にシリ アルマウスを使っている場合は、そのポートのチェックから外す。

▼/REDIRECT
Windows Server 2003 Enterprise Editionベースのコンピュータ上で緊急管理サービス (EMS) を有効にするために使用する。
このスイッチを指定する場合は、[boot loader] の下に
  REDIRECT={COMx | USEBIOSSETTINGS}
  REDIRECTBAUDRATE=nnnnn
の2行を追加する。
nnnnnには、9600 (デフォルト)、19200、57600、115200のいずれかを指定する。



●NTDLR以降の動き(想像)
Windowsのブート時のシーケンスとして、ブートセレクタ画面(boot.iniに基づく)が表示 されるまでがひとつの区切りとなる。ブートセレクタで起動OSを選択してからは、OS固有の 動作になる。以降 多分に想像が含まれているが、WindowsNT以降のOSのおおよその起動の シーケンスである。

@ARC名がscsi()...のものが起動OSドライブとして指定された場合には、ntldrと同位置 (同じブート・ルートディレクトリ)からntbootdd.sysがロードされブートドライブの アクセスを受け持つ。

ANTDETECT.COMがハード情報(リスト)の収集に当たり、ntldrにその情報を返す。
ハードリストは、HKEY_LOCAL_MACHINEのハードウェア・ハイブ(Hardware Hive:ハード ウェアEnumリスト?)を構築するのに使うらしい。

BNTOSKERNEL.EXEが、NTDETECT.COM収集した情報を元にこの後の初期化を制御します。
ここまでを「ブートフェーズ」、この後を「ロードフェーズ」と呼んだりして区別する ようだ。ロードフェーズはさらに以下のサブフェーズに分けることができる。
 ・カーネルのロード
 ・カーネルの初期設定(HAL、ドライバのロード/初期化を含む)
 ・サービスのロード(F以降)
・サブシステムの開始

CHAL.DLL(ハード・アブストラクション・レイヤ)、kdcom.dll、bootvid.dllなどの 基本的なプログラム(ドライバ)を%systemroot%・・・\system32フォルダからロードする。

DSYSTEM:レジストリをロードする。system32\configの下にあり、HKEY_LOCAL_MACHINE\ SYSTEMに該当すると思われる。この後のロードするドライバとサービスはこの情報を元 に行う。

Eドライバをロードし、その初期化処理を実行する。
ブート時ロード(Start値0 *1)が指定されているドライバをServiceGroupOrder(*2) 指定に従いロードする。ファイルシステムもこの時点でロードされる。
各ドライバはロードと同時に初期化される。(ドライバの階層で下位:ハードに近い ところからのロードは言うまでもない。標準的ServiceGroupOrderは以下。) よって、ここでDisk番号(ドライブ番号)が決定されてしまう。

System Reserved -> Boot Bus Extender -> System Bus Extender
-> SCSI miniport -> Port -> Primary Disk -> SCSI Class
-> SCSI CDROM -> FSFilter Infrastructure -> FSFilter System
-> FSFilter Bottom

*1: ドライバ固有のレジストリに指定されているロードタイミングのパラメタ。
HKEY_LOCAL_MACINE\SYSTEM\CurrentControlSet\Service\xxxxx\Start
xxxxxはドライバの呼び名だと思っていい。Start値が0だとブート時ロード。
*2: ブート時のドライバのロード順がドライバグループの順番として記載されている。
HKEY_LOCAL_MACINE\SYSTEM\CurrentControlSet\ServiceGroupOrder
個々のドライバでの順番ではない。ドライバグループは、*1で説明した ドライバ固有のレジストリキーxxxxx内にGroupとして定義されている。
atapi.sysとかは“SCSI miniport”、USBSTORは通常指定なし。
*3: 同じStart/Group値を持つ場合は、xxxxx内のTag値で順番が決まる。

※USB-HDDなどの場合は、ドライバの構成上ATAPIより後に付く。というよりそもそも PnPデバイスなのでブート時には存在しない扱いになる。USBの場合、関連下位ドラ イバも含めて、上記レジストリ値を設定しなければならない。

ここで、INT13/ntbootdd.sysに頼っていたブートデバイスアクセスをドライバにバト ンタッチする。ARC名で指定されていたドライブがdisk.sys以下によってアクセスさ れる。このとき、BIOSでは8xh(rdisk(x))でアクセスできていたものが、Disk番号x でアクセスできなければ、おそらくエラーになる。

scsi()の場合も同じく、disk(x)でアクセスできていたものが、Disk番号xでアクセス できなければならない。

ドライブ名の決め方はあくまでも、OSインストール時のドライバの初期化順(デバイ スオブジェクトの作成順)で、初期状態は決まる。よって、システム・ドライブの クローンを作った場合、いくらrdisk(2)から起動しても、C:ドライブは、rdisk(0)の 第1パーティションになっている。
※システム/ブート/ページファイル・ドライブの変更の仕方は後述する。
 上記以外の通常のドライブ(パーティション)に関しては、OS付属のディスク管理  ツール(diskmgmt.msc)で変更可能。

FSMSS.EXE(セッションマネージャ)が開始される。セッションマネージャは
HKEY_ LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager下の BootExecuteに記述されているプログラム?を実行した後、ページファイル(pagefile) をセットアップする。さらに、CurrentControlSetのクローンをレジストリ内に作成し、 最後にサブシステムをロードする。

Gサブシステムの開始時にWINLOGON.EXEが起動され、LSASS.EXE(Local Security Authority)がダイアログを表示してCTRL+ALT+DEL入力を待つ。この時点で SCREG.EXE(Service Controler)が起動されて、ユーザ共通のサービス(プログラム)   を起動する。

HユーザID/パスワード入力を得てログオンまで行って初めてOS起動の完了です。



●ドライブ名(レター)を変更する方法
WindowsNT以降のOSでは、「ディスク管理」(systemroot\...\system32\diskmgmt.msc) などのユティリティを使用しても、ブートドライブ、システムドライブ(通常いずれもC:) のドライブレター(C:、D:、・・・・)を変更できない。
また、起動ドライブ(起動OSの格納先)を変更しても、元のドライブレターがそのまま 使用される。仕組みはよくわからない。

このドライブレターを記憶しているのが、以下のレジスタである。
 HKEY_LOCAL_MACINE\SYSTEM\MountedDevices キー下の
 \DosDevices\x: 値・・・・(xは、C〜Zのドライブレター)

“\DosDevices\x:”値は、
・デバイスがその時点で存在する場合は、
:先頭4バイトがDiskSignature(MBR)で、次の残り8byteは該当パーティションの開始 オフセットらしい(上位/下位逆なので注意)。ただし、先頭からのbyte単位で表 される。
・PNPでデバイスが存在しない場合は、
:スロット?のGUID?らしき名前

変更はこの内容を変更するだけであるが、実際にはレジストリ値(value)名を変更した 方が手っ取り早い。
例えば、C:とE:を交換したい場合は、
 @\Dos\Device\E:を空いている\Dos\Device\x:に変更し、
 A次に\Dos\Device\C:を\Dos\Device\E:に変更して、
 B\Dos\Device\x:を\Dos\Device\C:に変更する。



●PageFile関連
ページファイルは、
HKEY_LOCAL_MACINE\SYSTEM\CurrentControlSet\Control\Session Manager\
Memory Management キー下のレジストリでその作成場所、サイズ、スワップ動作などが 規定されている。
作成先ドライブとサイズは、上記キー内の
PagingFiles
で指定されているが、ここにリムーバブルデバイスのドライブを指定すると、実際には そこにpagefile.sysは作成されない。内蔵HDDの方に勝手に作成してしまう。

ページファイルの作成を禁止するには、上記キー内の
DisablePagingExecutive
の値を1に指定する。

シャットダウン時に作成したページファイルを削除したい場合は、
ClearPageFileAtShutdown
の値を1に指定する。

ページファイルの状態を見るには、
(1)コントロールパネルの「システム」のパフォーマンス関係の仮想メモリの設定で どういう割り当てがされているかは参照/変更できる。
(2)XPだと、コマンドラインで確認できる。以下のコマンドで参照/変更が可能らしい。
cd \WINDOWS\system32
cscript pagefileconfig.vbs
(3)アクセサリの中のシステムツールのシステム情報「システムの概要」の一番下に 実際に割当てられているページファイルが表示される。
msinfo32.exe
(おまけ)コマンドラインでプロセス一覧を出力する方法
tasklist /svc

※USB-HDDなどのリムーバブルディスクにページファイルが作成できない件は、以下の 状況が原因となっている。
ページング先デバイスとして利用可能かどうかを確認するリクエストに対して、 disk.sys 以上のどこかで、エラーIRP内のリターンコードを予めNOT_SUPPORTに 設定して下位ドライバに伝達している。下位ドライバは、可否に関するフラグはセット するものの、エラーコード自体を変更しない。従って、ページングできないデバイスと してマウントマネージャには認識されてしまう。

IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION
Parameters.UsageNotification.Type=DeviceUsageTypePaging
がページング先デバイスとしての確認のリクエスト。



●USBストレージから起動するには(想像)
以上、細かい説明をしたが、USBストレージでWindowsを起動するためには、
1)PC・BIOSが、USB-HDDをアクセス(int13)できること
2)USB-HDDにはMBRが書込まれていなければならない
内蔵HDDの場合は、「ディスクの管理」ユティリティでパーティションを作成 したときに書込まれるかと思うが、USB-HDDの場合は、書込まれない。
MBRは、HDDに書かれているMBRをコピーしても使えるはずです。
3)BRはパーティションをフォーマットすれば書込まれるので大丈夫
4)OSのインストールは通常の方法ではできないものだと思った方がいい
内蔵HDDの起動パーティションをコピーするのが早いと思います。
5)USB-HDDからMBRが読み込まれた場合、USB-HDDがmulti(0)
よって、boot.iniも含めて内蔵HDD(not SCSI)にインストールされたものの コピーでいいはず。ただし、OSの起動ドライブごとコピーする前に6)の 実施が必要です。
6)レジストリ:USB-HDD関係のドライバをブート時ロードにする
OHCI.sys、UHCI.sys、EHCI.sys、USBD.sys、USBHUB.sys、USBSTOR.sys とかのStart値を0にして、USBドライバスタックの順でTag値を設定すれば よい。内蔵HDDコピー前に実施し、コピー後に戻します。
7)パーティションごとコピーしたUSB-HDDはOSを起動可能なはず
BIOSの設定でブートデバイスとしてのUSB-HDDの優先順位をHDDより高位に 設定し、リブートさせます。
多分、USB-HDDから起動するはず。
8)起動したらドライブ名の設定(レジストリ)を変更
9)PageFileはどうしようもない
おそらく、ドライブ名変更後も元の内蔵HDDにPageFileを作成してしまう かと思います。
それを対策しようと思うならフィルタドライバを独自に開発し、組み込む他 ないかと。
以上、何の確証もない、「USBストレージからWindows起動する」設定方法で した。





<ご意見、ご質問は以下にお願いします。>
掲示板 メール
プライバシーポリシー

inserted by FC2 system