日本語に対応したWindows PE 5.1を作る
日本語の表示、IMEを備えたWindows PE 5.1のブータブルメディアを作成します。Windows PE 4.0以降はIMEの組み込みがサポートされなくなったため、こちらを参考にWindows 7のIMEを組み込んでいきます。
32bit/64bitのデュアルブートと、Explorer++を組み込んでファイルのバックアップもできるようにします。
使用したソフト
VirtualBox 7.0.6
Windows 8.1をVirtualBox上に展開して作業
リンク:https://www.virtualbox.org/wiki/DownloadsVirtualBox 7.0.6 Oracle VM VirtualBox Extension Pack
フォルダー共有や作成したブータブルUSBを起動するのに使用
リンク:同上Windows 8.1(日本語版・64bit)
リンク:https://www.microsoft.com/ja-jp/software-download/windows8ISOWindows ADK for Windows 8.1
配布が終了しているためInternet Archiveから入手
リンク:https://archive.org/details/win-8.1-adkWindows 7(日本語版・64bit)
8.1のようなダウンロードページが見つからないため、自力で用意7-Zip 22.01
Windows 7のISOファイルから必要なデータの抽出に使用
リンク:https://sevenzip.osdn.jp/Explorer++ 1.3.5
日本語定義ファイルが公開されているVer.1.3.5を使用
リンク:https://explorerplusplus.com/download
事前準備
仮想マシン上ですべての作業を完結させても良いのですが、サポートが終わった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.dll を Explorer++.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
環境構築
VirtualBoxとVirtualBox Extension Packをインストール
VirtualBox 7からGUI上でも自動インストール機能(Unattended Install)を利用できるようになり、構築が容易になりました。VirtualBoxで仮想マシンを作成し、Windows 8.1をインストール
初期状態ではメモリやCPUが最低限しか割り当てられないので、使っているパソコンの性能に合わせて適宜変更してください。VHDの容量はデフォルトの40GBで十分足りました。言語設定を変更
Unattended Install を利用してセットアップした場合、別途言語設定の変更が必要になります。Unicode 対応ではないプログラムの言語 を 日本語(日本) に変更して再起動します。Guest Additionsをインストール
[デバイス] → [Guest Additions CD イメージの挿入] で仮想ドライブにGuest Additions CDをマウントしてインストールします。共有フォルダーを設定
[デバイス] → [共有フォルダー] → [共有フォルダー設定] で共有フォルダーを設定します。事前準備で作った VMShare フォルダーを Z:\ にマウントしました。Windows ADK for Windows 8.1をインストール
Zドライブを開くと先ほど用意したファイルにアクセスできます。 Windows_8.1_ADK_6.3.9600.16384.zip を展開してインストーラーを起動し、 Windows パフォーマンス ツールキット と Windows 評価キット のチェックを外してWindows ADKをインストールします。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=amd64 を ARCH=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 デバイスフィルター に追加して起動します。
起動するとOSの選択画面が表示されます。エラーが表示される場合はBCDエントリーの編集をミスってます。
OSを選択すると無事Windows PEが起動します。起動に失敗する場合はビルド時にカスタムした内容が原因です。
おわりに
今回はUEFI環境でのデュアルブート設定で躓きました。BCDがBIOS環境とUEFI環境とで別々に用意されていることを知らず、UEFI環境だけ起動出来なくて半日ほど潰しました。OSのブートについてきちんと理解しないといけないです。
参考にしたサイト
win81-pe
http://hrn25.sakura.ne.jp/win/win81-pe/win81-pe.html「Win10のWindowsPEにWin7のIME」ペントードのブログ
https://minkara.carview.co.jp/userid/2475954/blog/43759478/WinPE Tweaks
http://mistyprojects.co.uk/documents/winpe_tweaks/readme.files/FileCopyDialog.htm