日本語に対応したWindows PE 5.1を作る

日本語の表示、IMEを備えたWindows PE 5.1のブータブルメディアを作成します。Windows PE 4.0以降はIMEの組み込みがサポートされなくなったため、こちらを参考にWindows 7のIMEを組み込んでいきます。
32bit/64bitのデュアルブートと、Explorer++を組み込んでファイルのバックアップもできるようにします。

使用したソフト

事前準備

仮想マシン上ですべての作業を完結させても良いのですが、サポートが終わったOSをネットに繋ぐことに抵抗があるため、ホストOS上で必要なファイルを揃えて共有フォルダー機能で仮想マシン上からアクセスします。

仮想マシンとファイルをやり取りする VMShare フォルダーを作り、その下にWindows 7のIMEで使われるファイルを展開する Win7_IME フォルダーを作ります。(後々VirtualBoxが作る仮想マシンのフォルダーに移動しました。)

PS> mkdir C:\VMShare\Win7_IME

Windows 7のISOファイルを7-Zipで開き、 sources\install.wim\Windows へアクセスします。 IME フォルダーと System32 フォルダー、 SysWOW64 フォルダーのデータが必要になるので、 Win7_IME に展開します。

PS> Show-Tree C:\VMShare -MaxDepth 2
+---Win7_IME
|   +---IME
|   +---System32
|   +---SysWOW64

Explorer++も組み込むので、フォルダーを作って展開していきます。explorer++_1.3.5_translations.zip の中にある Explorer++JA.dllExplorer++.exe と同じフォルダーに設置すれば日本語化できます。32bit環境と64bit環境のデュアルブートをするので、それぞれに対応したアプリが必要になります。
最後にダウンロードしたWindows ADKを移動して準備完了です。

PS> (ls).Name
Win7_IME
WinPE_Custom_x64
WinPE_Custom_x86
Windows_8.1_ADK_6.3.9600.16384.zip

PS> (tree /F WinPE_Custom_x64)[2..9]
C:\VMSHARE\WINPE_CUSTOM_amd64
└─Program Files
    └─explorer++_1.3.5_x64
            Explorer++.exe
            Explorer++JA.dll
            History.txt
            License.txt
            Readme.txt

PS> (tree /F WinPE_Custom_x86)[2..9]
C:\VMSHARE\WINPE_CUSTOM_X86
└─Program Files
    └─explorer++_1.3.5_x86
            Explorer++.exe
            Explorer++JA.dll
            History.txt
            License.txt
            Readme.txt

環境構築

  1. VirtualBoxとVirtualBox Extension Packをインストール
    VirtualBox 7からGUI上でも自動インストール機能(Unattended Install)を利用できるようになり、構築が容易になりました。

  2. VirtualBoxで仮想マシンを作成し、Windows 8.1をインストール
    初期状態ではメモリやCPUが最低限しか割り当てられないので、使っているパソコンの性能に合わせて適宜変更してください。VHDの容量はデフォルトの40GBで十分足りました。

  3. 言語設定を変更
    Unattended Install を利用してセットアップした場合、別途言語設定の変更が必要になります。Unicode 対応ではないプログラムの言語 日本語(日本) に変更して再起動します。

  4. Guest Additionsをインストール
    [デバイス] [Guest Additions CD イメージの挿入] で仮想ドライブにGuest Additions CDをマウントしてインストールします。

  5. 共有フォルダーを設定
    [デバイス] [共有フォルダー] [共有フォルダー設定] で共有フォルダーを設定します。事前準備で作った VMShare フォルダーを Z:\ にマウントしました。

  6. Windows ADK for Windows 8.1をインストール
    Zドライブを開くと先ほど用意したファイルにアクセスできます。 Windows_8.1_ADK_6.3.9600.16384.zip を展開してインストーラーを起動し、 Windows パフォーマンス ツールキットWindows 評価キット のチェックを外してWindows ADKをインストールします。

  7. Windows ADKのパスを通す
    デフォルトでは C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Windows Preinstallation Environment にインストールされるので、システム環境変数の Path にこの場所を追加します。

管理者権限でコマンドプロンプトを開き、以下のコマンドを順に実行してエラーが出なければ構築完了です。

> "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\DandISetEnv.bat"
> copype amd64 C:\WinPETest
> MakeWinPEMedia /ISO C:\WinPETest C:\WinPETest\winpe.iso

ビルド

下記のコードをバッチファイルとして保存し、管理者権限で実行します。ビルドが完了したら、コード内の ARCH=amd64ARCH=x86 に変更して再度実行します。

@echo off
rem 環境変数のセット
Call "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\DandISetEnv.bat"

rem 32bit環境でビルドする場合は ARCH=x86 に書き換える
set ARCH=amd64
set WINPE_DIR=C:\WinPE_%ARCH%
set MOUNT_DIR=%WINPE_DIR%\mount
set ADK_PACKAGE=C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Windows Preinstallation Environment\%ARCH%\WinPE_OCs

If %ARCH%==amd64 (
    set SYSTEM_DIR=System32
) Else (
    set SYSTEM_DIR=SysWOW64
)

rem ビルド環境をコピーしてイメージファイルをマウントする
Call copype %ARCH% %WINPE_DIR%
Dism /Mount-Image /ImageFile:"%WINPE_DIR%\media\sources\boot.wim" /Index:1 /MountDir:%MOUNT_DIR%

rem 日本語パッケージを適用して、言語、キーボード配列、タイムゾーンを変更する
Dism /Image:%MOUNT_DIR% /Add-Package /PackagePath:"%ADK_PACKAGE%\WinPE-FontSupport-JA-JP.cab" /PackagePath:"%ADK_PACKAGE%\ja-jp\lp.cab"
Dism /Image:%MOUNT_DIR% /Set-Allintl:ja-jp
Dism /Image:%MOUNT_DIR% /Set-InputLocale:0411:00000411
Dism /Image:%MOUNT_DIR% /Set-LayeredDriver:6
Dism /Image:%MOUNT_DIR% /Set-TimeZone:"Tokyo Standard Time"

rem IMEのファイルをコピー
set WIN7_DIR=Z:\Win7_IME
xcopy /e "%WIN7_DIR%\IME" "%MOUNT_DIR%\Windows\IME\"
xcopy /e "%WIN7_DIR%\%SYSTEM_DIR%\IME" "%MOUNT_DIR%\Windows\System32\IME\"
copy "%WIN7_DIR%\%SYSTEM_DIR%\IMJP10.IME" "%MOUNT_DIR%\Windows\System32\"
copy "%WIN7_DIR%\%SYSTEM_DIR%\IMJP10K.DLL" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\ctfmon.exe" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\MsCtfMonitor.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\msctfime.ime" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\msutb.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\ja-jp\msutb.dll.mui" "%MOUNT_DIR%\Windows\System32\ja-jp\"

rem IMEのレジストリを登録するバッチファイルを作成
set IME_REG=%MOUNT_DIR%\Windows\System32\IME_REG.CMD
echo @echo off >"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\MSUTB.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\MsCtfMonitor.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IMJP10K.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\shared\IMETIP.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\shared\IMEAPIS.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\shared\IMJKAPI.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\shared\MSCAND20.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\IMEJP10\IMJPTIP.DLL >>"%IME_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\IME\IMEJP10\IMJPAPI.DLL >>"%IME_REG%"
echo REG ADD "HKLM\Software\Microsoft\IMEJP" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKLM\Software\Microsoft\IMEJP\10.0" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKLM\Software\Microsoft\IMEJP\10.0\directories" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKLM\Software\Microsoft\IMEJP\10.0\directories" /v "DictionaryPath" /t REG_EXPAND_SZ /d %%WINDIR%%\IME\IMEJP10\DICTS /f ^> nul >>"%IME_REG%"
echo REG ADD "HKLM\Software\Microsoft\IMEJP\10.0\directories" /v "ModulePath" /t REG_EXPAND_SZ /d %%WINDIR%%\System32\IME\IMEJP10 /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\LangBar" /v "ExtraIconsOnMinimized" /t REG_DWORD /d "0" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\LangBar" /v "Label" /t REG_DWORD /d "0" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\LangBar" /v "ShowStatus" /t REG_DWORD /d "0" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\LangBar" /v "Transparency" /t REG_DWORD /d "255" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\TIP\{03B5835F-F03C-411B-9CE2-AA23E1171E36}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\TIP\{03B5835F-F03C-411B-9CE2-AA23E1171E36}\LanguageProfile" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\TIP\{03B5835F-F03C-411B-9CE2-AA23E1171E36}\LanguageProfile\0x00000411" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\TIP\{03B5835F-F03C-411B-9CE2-AA23E1171E36}\LanguageProfile\0x00000411\{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\TIP\{03B5835F-F03C-411B-9CE2-AA23E1171E36}\LanguageProfile\0x00000411\{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}" /v "Enable" /t REG_DWORD /d 1 /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000" /v "CLSID" /d "{03B5835F-F03C-411B-9CE2-AA23E1171E36}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000" /v "Profile" /d "{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000" /v "KeyboardLayout" /t REG_DWORD /d 0 /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\SortOrder\Language" /v "00000000" /d "00000411" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\HiddenDummyLayouts" /v "00000411" /d "00000411" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\Assemblies\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}" /v "Default" /d "{03B5835F-F03C-411B-9CE2-AA23E1171E36}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\Assemblies\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}" /v "Profile" /d "{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}" /f ^> nul >>"%IME_REG%"
echo REG ADD "HKCU\Software\Microsoft\CTF\Assemblies\0x00000411\{34745C63-B2F0-4784-8B67-5E12C8701A31}" /v "KeyboardLayout" /t REG_DWORD /d "04110411" /f ^> nul >>"%IME_REG%"
echo Start %%WINDIR%%\System32\ctfmon.exe >>"%IME_REG%"

rem 言語バーの表示とNumLockオン
REG LOAD HKLM\PETEMP "%MOUNT_DIR%\Windows\System32\config\DEFAULT"
REG ADD "HKLM\PETEMP\Control Panel\Desktop" /v "UserPreferencesMask" /t REG_BINARY /d "9e1e078010010000" /f
REG ADD "HKLM\PETEMP\Control Panel\Keyboard" /v "Initialkeyboardindicators" /t REG_SZ /D "2" /f
REG UNLOAD HKLM\PETEMP

rem Explorer++のファイルをコピー
set CUSTOM_DIR=Z:\WinPE_Custom_%ARCH%
xcopy /e "%CUSTOM_DIR%" "%MOUNT_DIR%\"

rem Explorer++の動作に必要なフォルダーの作成
mkdir "%MOUNT_DIR%\Windows\System32\config\systemprofile\Desktop"

rem プログレスバーのファイルをコピー
copy "%WINDIR%\%SYSTEM_DIR%\ExplorerFrame.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\shellstyle.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\ja-JP\explorerframe.dll.mui" "%MOUNT_DIR%\Windows\System32\ja-JP\"
copy "%WINDIR%\%SYSTEM_DIR%\en-US\shellstyle.dll.mui" "%MOUNT_DIR%\Windows\System32\en-US\"
copy "%WINDIR%\%SYSTEM_DIR%\actxprxy.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\chartv.dll" "%MOUNT_DIR%\Windows\System32\"
copy "%WINDIR%\%SYSTEM_DIR%\en-US\chartv.dll.mui" "%MOUNT_DIR%\Windows\System32\en-US\"

rem プログレスバーのレジストリを登録するバッチファイルを作成
set PROG_REG=%MOUNT_DIR%\Windows\System32\PROG_REG.CMD
echo @echo off >"%PROG_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\actxprxy.dll >>"%PROG_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\chartv.dll >>"%PROG_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\ExplorerFrame.dll >>"%PROG_REG%"
echo REGSVR32 /S %%WINDIR%%\System32\shellstyle.dll >>"%PROG_REG%"
echo REG ADD "HKLM\SOFTWARE\Classes\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}\InProcServer32" /ve /t REG_EXPAND_SZ /d "%%WinDir%%\System32\actxprxy.dll" /f ^> nul >>"%PROG_REG%"
echo REG ADD "HKLM\SOFTWARE\Classes\CLSID\{C90250F3-4D7D-4991-9B69-A5C5BC1C2AE6}\InProcServer32" /v "ThreadingModel" /t REG_SZ /d "Both" /f ^> nul >>"%PROG_REG%"

rem それぞれのバッチファイルを起動時に読み込むようにstartnet.cmdに登録
echo Call %%WINDIR%%\System32\IME_REG.CMD >>"%MOUNT_DIR%\Windows\System32\Startnet.cmd"
echo Call %%WINDIR%%\System32\PROG_REG.CMD >>"%MOUNT_DIR%\Windows\System32\Startnet.cmd"

rem イメージファイルのアンマウントとコミット
Dism /Unmount-Image /MountDir:%MOUNT_DIR% /Commit

以上で64bit版と32bit版のWindows PEが出来ました。

デュアルブート

C:\WinPE_dual に必要なファイルをコピーし、BCDエントリーを編集します。管理者権限でコマンドプロンプトを開いて操作していきます。

> xcopy /e C:\WinPE_x86 C:\WinPE_dual\
> ren C:\WinPE_dual\media\sources\boot.wim boot_x86.wim
> copy C:\WinPE_amd64\media\sources\boot.wim C:\WinPE_dual\media\sources\boot_x64.wim

ベースとなるオリジナルのBCDエントリーのGUIDを調べ、デフォルトのBCDエントリーを編集して、ブートマネージャーに boot_x86.wim を登録します。

> cd C:\WinPE_dual\media\Boot
> bcdedit /store BCD /enum | find "osdevice"
osdevice                ramdisk=[boot]\sources\boot.wim,{7619dcc8-fae-11d9-b411-000476eba25f}

> rem 調べたGUIDでデフォルトのエントリーを設定
> set ORG_ENTRY={7619dcc8-fafe-11d9-b411-000476eba25f}
> bcdedit /store BCD /set {default} device ramdisk=[boot]\sources\boot_x86.wim,%ORG_ENTRY%
> bcdedit /store BCD /set {default} osdevice ramdisk=[boot]\sources\boot_x86.wim,%ORG_ENTRY%
> bcdedit /store BCD /set {default} description "Windows PE 5.1 x86"

BCDエントリーをコピーします。コピーに成功すると結果として新しいエントリーのGUIDが返ってくるので、新しいエントリーを編集してブートマネージャーに boot_x64.wim を登録します。

> bcdedit /store BCD /copy {default} /d "Windows PE 5.1 x64"
エントリは {276cceb8-9d99-11ed-8256-08002709b76d} に正常にコピーされました。

rem 新しいGUIDでもう一つのエントリーを設定
> set NEW_ENTRY={276cceb8-9d99-11ed-8256-08002709b76d}
> bcdedit /store BCD /set %NEW_ENTRY% device ramdisk=[boot]\sources\boot_x64.wim,%ORG_ENTRY%
> bcdedit /store BCD /set %NEW_ENTRY% osdevice ramdisk=[boot]\sources\boot_x64.wim,%ORG_ENTRY%

起動時にOSを選択できるようデフォルトの bootmenupolicy の設定を変更します。ロケールも変更してOS選択画面を日本語表示に設定します。

> bcdedit /store BCD /set {default} bootmenupolicy legacy
> bcdedit /store BCD /set {bootmgr} locale ja-JP
> bcdedit /store BCD /set {default} locale ja-JP
> bcdedit /store BCD /set %NEW_ENTRY% locale ja-JP

以上でBIOS環境でのデュアルブートに対応しました。
同じ手順で C:\WinPE_dual\media\EFI\Microsoft\Boot\BCD を編集するとUEFI環境でのデュアルブートも出来るようになります。

書き込み

[スタート] → [すべてのアプリ] → [展開およびイメージング ツール環境] を起動させて MakeWinPEMedia を実行するとISOファイルが作成できます。

MakeWinPEMedia /ISO C:\WinPE_dual Z:\WinPE_dual.iso

USBメモリを挿して、VirtualBox のメニューバーにある [デバイス] → [USB] → [挿しこんだUSBメモリ] を選択すると仮想マシン上でUSBメモリを認識するので、ブータブルUSBも作成できます。

MakeWinPEMedia /UFD C:\WinPE_dual D:

動作確認

VirtualBoxで新しく仮想マシンを作成して、作成したWindows PEが正常に動作するか確認します。VHDは追加しなくても問題ないです。
作成したISOファイルをマウントするか、ブータブルUSBを USB デバイスフィルター に追加して起動します。

ISOファイルから起動させる場合
ブータブルUSBから起動させる場合

起動するとOSの選択画面が表示されます。エラーが表示される場合はBCDエントリーの編集をミスってます。

OS選択画面

OSを選択すると無事Windows PEが起動します。起動に失敗する場合はビルド時にカスタムした内容が原因です。

Windows PEの起動画面
組み込んだIMEは正常に機能
Explorer++の起動やファイルコピー時のプログレスバーも動作

おわりに

今回はUEFI環境でのデュアルブート設定で躓きました。BCDがBIOS環境とUEFI環境とで別々に用意されていることを知らず、UEFI環境だけ起動出来なくて半日ほど潰しました。OSのブートについてきちんと理解しないといけないです。

参考にしたサイト

いいなと思ったら応援しよう!