エロゲインストールバトルに勝利
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自身によって管理されているということであるから、システムファイルの破損チェックで改竄を確認できるはずである。
そこで、以下のページを参考にシステムファイルのチェックを行った。
具体的な破損ファイルの内容を確認する。
メッセージとMicrosoftのこのページの『システム ファイル チェッカーの処理の詳細を表示する方法』セクションに従い、C:¥Windows¥Logs¥CBS¥CBS.logを確認する。
[SR]
(正規表現ではない)を含む箇所が関連部分らしい。
Microsoftのページではfindstr
を使っているが、UNIXならgrep
でも使った方が楽かもしれない。
まあどちらにせよ同じことだが。
この出力を見る限りでは、以下の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
であった。
(なんだ、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。
権限を元に戻せば、作業は完了[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 へのアップデートで問題として現れたということなのだろう。