2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WinPE環境で使えるGUIのディスクイメージングツールを作った

2
Posted at

はじめに

PC キッティングや展開作業をやっていると、WinPE 上での作業が避けて通れません。DISM でイメージをキャプチャして、diskpart でパーティションを切って、イメージを戻して、bcdboot でブート構成を作って……。

やること自体はシンプルなのに、毎回コマンドを手打ちするのは面倒だし、打ち間違いも怖い。特に diskpart は一歩間違えると別のディスクを初期化してしまうリスクがあります。

「GUIでポチポチ選ぶだけで、ディスク初期化から復元、ブート構成まで一発で終わるツールがほしい」

そう思って作ったのが WinPE Image Tool です。

なにができるの?

ざっくり言うと、WinPE 上でのイメージ展開作業を GUI 化したツールです。

1000009394.png

マスターイメージを作成したPCのボリュームを WIM 形式で保存できます。圧縮率も選べます。

1000009395.png

ここが一番のポイントです。以下をチェックボックス一つで連続実行できます。

  • diskpart によるディスク初期化(GPTパーティション自動作成)
  • DISM によるイメージ展開
  • bcdboot による UEFI ブート構成

つまり、WIM ファイルを選んで対象ディスクを選んで「復元開始」を押すだけで、空のディスクが起動可能な Windows マシンになります。

1000009396.png

EFI / MSR / 回復 / Windows の各パーティションをサイズ指定で自動作成します。デフォルトでは以下のレイアウトになります。

  • EFI System パーティション — FAT32 / 512 MB
  • MSR パーティション — 128 MB
  • 回復パーティション — NTFS / 3,072 MB(作成有無を選択可)
  • Windows パーティション — NTFS / 残り全容量

各サイズはUIから自由に変更できます。

1000009397.png

WIM ファイルの中身(インデックス一覧、名前、サイズなど)をワンクリックで確認できます。

なぜ C++ / Win32 API なの?

WinPE 環境でGUIツールを動かすとなると、選択肢がかなり限られます。

  • C# / .NET → WinPE に .NET ランタイムが入っていない。追加パッケージを入れれば動くが、イメージが肥大化する
  • HTA → IE エンジン依存で CSS も JavaScript も癖が強い。レイアウトが崩れやすい
  • AutoIt3 → 手軽だがランタイムが必要

結局、WinPE に最初から入っている DLL だけで動くのは C/C++ のネイティブ EXE だけでした。Win32 API を直接叩いて、静的リンクでビルドすれば、ランタイムなしの単一 EXE が完成します。

実際の EXE は 200KB 程度で、WinPE イメージのサイズにほぼ影響しません。

工夫したところ

ディスク選択をわかりやすく

diskpart で手打ちする場合、どのディスクが何番なのかを毎回 list disk で確認する必要がありました。

このツールでは Windows API で物理ディスクを直接列挙して、モデル名と容量をドロップダウンに表示しています。
1000009398.png

ディスク 0: Samsung SSD 870 (476.9 GB)
ディスク 1: WD Elements (931.5 GB)

これなら間違えようがありません。

DISM のコマンドライン引数問題

開発中に一番ハマったのが、DISM のコマンドライン引数のクォーティングです。

dism.exe /Capture-Image /CaptureDir:"C:\" /Name:"Windows Image"

このコマンド、一見正しそうに見えますが、末尾の \" がエスケープされた引用符として解釈されてしまい、後続の引数がすべて壊れます。

結局、スペースを含まないパスはクォートしない、末尾がバックスラッシュの場合は二重にする、というヘルパー関数を書いて対処しました。地味ですが、これがないと実用にならなかったポイントです。

diskpart はスクリプトファイル方式

diskpart の自動化には echo でパイプする方式と、スクリプトファイル方式があります。

前者はコマンドが複雑になると不安定なので、後者を採用しました。一時ファイルにスクリプトを書き出して実行し、終了後に削除する方式です。

diskpart /s disksetup.txt

スクリプトの中身はこんな感じになります。

select disk 0
clean
convert gpt
create partition efi size=512
format quick fs=fat32 label="System"
assign letter="S"
create partition msr size=128
create partition primary
format quick fs=ntfs label="Windows"
assign letter="W"

日本語UIとフォント問題

WinPE 環境では利用可能なフォントが限られています。日本語フォントパッケージの有無も環境によって異なります。

そこで起動時に以下の順でフォントの存在確認を行い、最初に見つかったものを使用するようにしました。

  1. Meiryo UI
  2. Yu Gothic UI
  3. MS UI Gothic
  4. Segoe UI(フォールバック)

日本語パッケージが入っていない場合でも、Segoe UI にフォールバックして表示が崩れることはありません。

導入方法

WinPE のイメージ(boot.wim)に EXE をコピーして、startnet.cmd に一行追加するだけです。

wpeinit
start WinPE-ImageTool.exe

WinPE 起動時にツールが自動的に立ち上がり、コマンドプロンプトも同時に使える状態になります。

実際の使い方

フルデプロイ(ディスク初期化 → 復元 → ブート構成)

  1. 復元タブを開く
  2. WIM ファイルを選択し、イメージ番号を指定
  3. 「復元前にディスクを初期化する」にチェック
  4. 対象ディスクをドロップダウンから選択
  5. 「復元開始」をクリック

あとは自動で diskpart → DISM → bcdboot が順番に実行されます。途中でエラーが出た場合は自動的に中断されます。

キャプチャ(マスターイメージ作成)

  1. キャプチャタブを開く
  2. ソースボリュームを選択
  3. 保存先のパスを指定
  4. 「キャプチャ開始」をクリック

技術的な話

興味がある方向けに、技術的なポイントをまとめておきます。

  • 言語 — C++17 / Win32 API
  • 外部依存 — なし(OS標準DLLのみ)
  • ビルド — MSVC + /MT フラグで静的リンク
  • UI — Win32 Common Controls(Tab、ComboBox、ProgressBar)
  • バックエンド — DISM.exe、diskpart.exe、bcdboot.exe、wpeutil.exe をCreateProcessWで呼び出し
  • ディスク列挙 — DeviceIoControl で物理ディスクのモデル名・容量を取得
  • 進捗表示 — DISM の stdout をパイプでキャプチャし、パーセンテージを正規表現で抽出

ソースコードは単一ファイル(main.cpp)で約 1,200 行です。Win32 API を使った GUI アプリの実例としても参考になるかもしれません。

今後の予定

現時点で実運用に必要な機能は一通り揃っていますが、いくつか追加したい機能があります。

  • WIM インデックスをドロップダウンで選択可能にする
  • キャプチャ時の除外フォルダ指定
  • 操作履歴のログファイル出力

おわりに

WinPE 上のイメージ展開は、やることは決まっているのに毎回コマンドを打つのが面倒な作業の代表格だと思います。このツールで少しでも楽になれば幸いです。

ソースコードは GitHub で公開しています。MIT ライセンスなので、自由に使って改変してもらって大丈夫です。

GitHub: https://github.com/potato1523/Windows-PE-image-backup-software

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?