エロゲインストールバトルに勝利

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公式のものに上書きしてやれば元に戻るであろうと考えた。

VitualBox Guest Additionsインストーラの図
Guest Additionsで強制的に有効化されてしまうDirect3D Support

DirectX破損確認

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

そこで、以下のページを参考にシステムファイルのチェックを行った。

`sfc /scannow` コマンド実行完了の図
          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
        

関係ありそうな部分のみ抜粋。『...』と前後の空行は省略部分。

C:¥Windows¥Logs¥CBS¥CBS.log

この出力を見る限りでは、以下の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.dllSysWOW64/d3d9.dllって全く同じだったのか……)

これらの3ファイル(実質2ファイル)を置き換えればミッション達成となる。 しかし実はこういった重要なファイルはAdministrator権限でもっても通常の手段では削除等できなかったりするため、上述のページの『破損したシステム ファイルを、正常なコピーであることが判明しているファイルに手動で置き換える方法』セクションに従って所有権の変更等を行い、然る後にファイルをコピー(上書き)する。

具体的な方法
  1. 管理者権限でコマンドプロンプトを開く
  2. 以下のことを3つのファイルに大して繰り返す
    1. takeown /f ファイル名 を実行
    2. icacls ファイル名 /grant administrators:F を実行
    3. 正常なファイルで破損したファイルを上書きコピーする。 copy 正常なファイルのファイル名 破損したファイルのファイル名 を実行することで可能だが、管理者として実行したエクスプローラを使うこともできるかもしれない(やってないので知らない)。
管理者権限のコマンドプロンプトでファイルの権限の変更を行った図
管理者権限のコマンドプロンプトでC:\Windows\SysWOW64\d3d9.dllの権限の変更を行った図

コピーできたら、[Guide] How to Restore “TrustedInstaller” as Default Owner of a File, Folder or Registry Key in Windows? - AskVGで紹介されている手順(なお、手順3は自分のWindowsバージョンに合わせたものを見ること)に従って、ファイル権限を元に戻す。

具体的な方法
  1. 以下の手順を、3つのファイルそれぞれに繰り返す
    1. エクスプローラでファイルを選択し、右クリック→「プロパティ」を選択
    2. 「セキュリティ」タブの、「アクセス許可を変更するには[編集]をクリックします。」の右にある「編集(E)...」ボタンをクリック。 「続行しますか?」のダイアログでは「はい」を押す

      権限変更前の「セキュリティ」タブの図
      権限変更前の「セキュリティ」タブの様子
      「編集」ボタンを押して出るダイアログの図
      「編集」ボタンを押して出るダイアログ
    3. 「Administrators」の権限を「読み取りと実行」「読み取り」のみ有効にし、他のもの(「フル コントロール」「変更」「書き込み」「特殊なアクセス許可」)を無効化し、「OK」で反映する

    4. 「詳細設定」ボタンを押して所有者の「変更」ボタンを押す

      「詳細設定」ボタンを押して出るウィンドウの図
      「詳細設定」ボタンを押して出るウィンドウ
    5. 「選択するオブジェクト名を入力してください」のテキストボックスに NT SERVICE\TrustedInstaller と入力し、「名前の確認」ボタンを押す

      所有者の「変更」ボタンを押して出るダイアログの図
      所有者の「変更」ボタンを押して出るダイアログに名前を入力したところ
      「名前の確認」ボタンを押した後の図
      名前を入力し「名前の確認」を押した後の状態
    6. 「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 へのアップデートで問題として現れたということなのだろう。