エロゲインストールバトルに勝利
TL;DR
VirtualBox Guest Additions (4.1.8 未満、大昔のバージョン)のDirect3D Support (Experimental)はWindows標準のDirectXライブラリを上書きするが、そのせいで一部ゲームでエラーが出て起動できなくなることがある。 これは、書き換えられてしまったDirectXの一部ファイルを本来のファイルで上書きしてやることで解決可能である。
問題遭遇編はエロゲインストールバトルを参照。
バグの詳細は追記を参照。
環境
環境はエロゲインストールバトル実行時と同様である。
調査
ネイティブ環境のWindows 10で起動するとされていることと、DirectX 9のDLLでエラーが出ていることから、原因はVirtualBox特有でDirectX関連部分、すなわちVirtualBox Guest Additions(以下Guest Additions)によるDirect3D Support (Experimental)であろうと予想した。 よって、Guest Additionsにより上書きされたであろうDirectX関連ファイルをMicrosoft公式のものに上書きしてやれば元に戻るであろうと考えた。

DirectX破損確認
普通のライブラリであればアンインストールするところだが、WindowsではDirectXのアンインストールは普通の手段ではできないことになっている[0]。 ということはこのファイルはWindows自身によって管理されているということであるから、システムファイルの破損チェックで改竄を確認できるはずである。
そこで、以下のページを参考にシステムファイルのチェックを行った。

C:¥Users¥user1>sfc /scannow システム スキャンを開始しています。これにはしばらく時間がかかります。 システム スキャンの検証フェーズを開始しています。 検証 100% が完了しました。 Windows リソース保護により、破損したファイルが見つかりましたが、それらの 一部は修復できませんでした。詳細は CBS.Log windir¥Logs¥CBS¥CBS.log に 含まれています。例: C:¥Windows¥Logs¥CBS¥CBS.log。ただし、オフライン サービス シナリオでのログの記録は現在サポートされていません。 C:¥Users¥user1>
具体的な破損ファイルの内容を確認する。
メッセージとMicrosoftのこのページの『システム ファイル チェッカーの処理の詳細を表示する方法』セクションに従い、C:¥Windows¥Logs¥CBS¥CBS.logを確認する。
[SR]
(正規表現ではない)を含む箇所が関連部分らしい。
Microsoftのページではfindstr
を使っているが、UNIXならgrep
でも使った方が楽かもしれない。
まあどちらにせよ同じことだが。
... 2016-06-20 13:31:37, Info CSI 000014b1 [SR] Beginning Verify and Repair transaction 2016-06-20 13:31:39, Info CSI 000014b3 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch amd64, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:31:41, Info CSI 000014b9 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch amd64, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:31:41, Info CSI 000014ba [SR] This component was referenced by [l:169]"Microsoft-Windows-Client-Features-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-Package-AutoMerged-windows-Deployment" 2016-06-20 13:31:41, Info CSI 000014bd [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\System32"\[l:8]"d3d9.dll"; source file in store is also corrupted 2016-06-20 13:31:43, Info CSI 00001521 [SR] Verify complete ... 2016-06-20 13:46:51, Info CSI 00004bea [SR] Beginning Verify and Repair transaction 2016-06-20 13:46:52, Info CSI 00004bec [SR] Cannot repair member file [l:8]"d3d8.dll" of Microsoft-Windows-DirectX-Direct3D8, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:46:53, Info CSI 00004bee [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:46:57, Info CSI 00004c21 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:46:57, Info CSI 00004c22 [SR] This component was referenced by [l:181]"Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows-Deployment" 2016-06-20 13:46:57, Info CSI 00004c25 [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\SysWOW64"\[l:8]"d3d9.dll"; source file in store is also corrupted 2016-06-20 13:46:57, Info CSI 00004c33 [SR] Cannot repair member file [l:8]"d3d8.dll" of Microsoft-Windows-DirectX-Direct3D8, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:46:57, Info CSI 00004c34 [SR] This component was referenced by [l:181]"Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows-Deployment" 2016-06-20 13:46:57, Info CSI 00004c37 [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\SysWOW64"\[l:8]"d3d8.dll"; source file in store is also corrupted 2016-06-20 13:46:57, Info CSI 00004c61 [SR] Verify complete ... 2016-06-20 13:49:23, Info CSI 0000576b [SR] Repairing 3 components 2016-06-20 13:49:23, Info CSI 0000576c [SR] Beginning Verify and Repair transaction 2016-06-20 13:49:23, Info CSI 0000576e [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch amd64, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 00005770 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 00005772 [SR] Cannot repair member file [l:8]"d3d8.dll" of Microsoft-Windows-DirectX-Direct3D8, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 00005775 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 00005776 [SR] This component was referenced by [l:181]"Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows-Deployment" 2016-06-20 13:49:23, Info CSI 00005779 [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\SysWOW64"\[l:8]"d3d9.dll"; source file in store is also corrupted 2016-06-20 13:49:23, Info CSI 0000577d [SR] Cannot repair member file [l:8]"d3d8.dll" of Microsoft-Windows-DirectX-Direct3D8, version 10.0.10586.0, arch x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 0000577e [SR] This component was referenced by [l:181]"Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-WOW64-Package-AutoMerged-windows-Deployment" 2016-06-20 13:49:23, Info CSI 00005781 [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\SysWOW64"\[l:8]"d3d8.dll"; source file in store is also corrupted 2016-06-20 13:49:23, Info CSI 00005785 [SR] Cannot repair member file [l:8]"d3d9.dll" of Microsoft-Windows-DirectX-Direct3D9, version 10.0.10586.0, arch amd64, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch 2016-06-20 13:49:23, Info CSI 00005786 [SR] This component was referenced by [l:169]"Microsoft-Windows-Client-Features-Package-AutoMerged-windows~31bf3856ad364e35~amd64~~10.0.10586.0.Microsoft-Windows-Client-Features-Package-AutoMerged-windows-Deployment" 2016-06-20 13:49:23, Info CSI 00005789 [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\System32"\[l:8]"d3d9.dll"; source file in store is also corrupted 2016-06-20 13:49:24, Info CSI 0000578b [SR] Repair complete 2016-06-20 13:49:24, Info CSI 0000578c [SR] Committing transaction 2016-06-20 13:49:24, Info CSI 00005791 [SR] Verify and Repair Transaction completed. All files and registry keys listed in this transaction have been successfully repaired
関係ありそうな部分のみ抜粋。『...
』と前後の空行は省略部分。
この出力を見る限りでは、以下の3つのファイルが本来のものと異なっているようである。
- C:¥Windows¥System32¥d3d9.dll
- C:¥Windows¥SysWOW64¥d3d8.dll
- C:¥Windows¥SysWOW64¥d3d9.dll
やはり、DirectX関係のファイルが上書きされていたようだ。 予想通りであれば、これらを本来の(Microsoft純正の)ファイルに戻してやれば、トラブルを解決できるはずだ。
解決
オリジナルのDirectXファイル
さて、どこから純正のファイルを持ってくるか。 DirectXのインストーラ[1]から持ってこられればそれが楽なのだが、どうも実はこの中にあるcabファイルのどれを展開してもd3d9.dllが存在しなかったのである。 そんなわけで、手っ取り早く他のWindows 10[2]から持ってくるのが楽であろう。
……というわけで持ってきた。
ファイルのバージョン(「プロパティ」から確認できる)は10.0.10586.0
であった。
c464f345818ad873cc5934fbcc9e47e47ac89f72ec7c4b17574097ab31c1153b1e8586cb346be05385a59e0b00197bced4a2c918947503ab1301517a522ac150 System32/d3d9.dll 5c32717d294526fc9c11e84cb7c39252d702ad4b6f406d882a37df6249722abbc673db4ac0cb8c3cafc5815cace0551805321cc8347862f2a1f0919c4bce076d SysWOW64/d3d8.dll c464f345818ad873cc5934fbcc9e47e47ac89f72ec7c4b17574097ab31c1153b1e8586cb346be05385a59e0b00197bced4a2c918947503ab1301517a522ac150 SysWOW64/d3d9.dll
10.0.10586.0
の該当DirectXのDLLのsha512ハッシュ(なんだ、System32/d3d9.dllとSysWOW64/d3d9.dllって全く同じだったのか……)
これらの3ファイル(実質2ファイル)を置き換えればミッション達成となる。 しかし実はこういった重要なファイルはAdministrator権限でもっても通常の手段では削除等できなかったりするため、上述のページの『破損したシステム ファイルを、正常なコピーであることが判明しているファイルに手動で置き換える方法』セクションに従って所有権の変更等を行い、然る後にファイルをコピー(上書き)する。
具体的な方法
- 管理者権限でコマンドプロンプトを開く
-
以下のことを3つのファイルに大して繰り返す
takeown /f ファイル名
を実行icacls ファイル名 /grant administrators:F
を実行-
正常なファイルで破損したファイルを上書きコピーする。
copy 正常なファイルのファイル名 破損したファイルのファイル名
を実行することで可能だが、管理者として実行したエクスプローラを使うこともできるかもしれない(やってないので知らない)。

コピーできたら、[Guide] How to Restore “TrustedInstaller” as Default Owner of a File, Folder or Registry Key in Windows? - AskVGで紹介されている手順(なお、手順3は自分のWindowsバージョンに合わせたものを見ること)に従って、ファイル権限を元に戻す。
具体的な方法
-
以下の手順を、3つのファイルそれぞれに繰り返す
- エクスプローラでファイルを選択し、右クリック→「プロパティ」を選択
「セキュリティ」タブの、「アクセス許可を変更するには[編集]をクリックします。」の右にある「編集(E)...」ボタンをクリック。 「続行しますか?」のダイアログでは「はい」を押す
権限変更前の「セキュリティ」タブの様子 「編集」ボタンを押して出るダイアログ 「Administrators」の権限を「読み取りと実行」「読み取り」のみ有効にし、他のもの(「フル コントロール」「変更」「書き込み」「特殊なアクセス許可」)を無効化し、「OK」で反映する
「詳細設定」ボタンを押して所有者の「変更」ボタンを押す
「詳細設定」ボタンを押して出るウィンドウ 「選択するオブジェクト名を入力してください」のテキストボックスに NT SERVICE\TrustedInstaller と入力し、「名前の確認」ボタンを押す
所有者の「変更」ボタンを押して出るダイアログに名前を入力したところ 名前を入力し「名前の確認」を押した後の状態 「OK」ボタンでダイアログを閉じ、「セキュリティの詳細設定」のウィンドウの「適用」ボタンを押す。 途中でダイアログが出るかもしれないが、「OK」を押しておけばおk。
所有者の変更後に出るダイアログ 作業完了後の「セキュリティの詳細設定」の状態。所有者が「TrustedInstaller」になっているのがわかる
権限を元に戻せば、作業は完了[3]だ。 念のため再起動してからDirectXインストーラをもう一度くらい起動するのもアリかもしれない。 何か効果があるのかは知らないが。
結果
-
ものべのをはじめとする各ゲームの起動時のエラーは出なくなった
- いずれも無事に起動できるようになった
- しかし、あなオトのOPムービーでは音だけ再生され映像はブラックアウトした。まあひとまず本編は問題ないので良しとしよう。
- あなオトのautorunのエラーは相変わらず出る。DirectXが原因ではないのかもしれない。


付記
追記(2017-05-17): 大昔に修正されたバグだった模様
virtualbox.org • View topic - error SfmDxGetSwapChainStats could not be located in dynamic link library C:\WINDOWS\SYSTEM32\d3d9.d によると、 VirtualBox 4.1.8 にてバグとして修正され[4]、それによって元の DLL ファイルを上書きしてしまう挙動はなくなったらしい。 ただし、既に上書きされてしまったファイルを修正することはできないとのことなので、その場合は上記の手順やフォーラムに書かれた手順で修正する必要がある。
私の Windows 10 環境は、 Windows 7 時代から丹精込めて育て上げたものだったので、その昔 VirtualBox 4.1.8 未満で Guest Additions の Direct3D Support を有効にしたとき以降ずっとファイルが壊れていて、それが Windows 10 へのアップデートで問題として現れたということなのだろう。