システムドライブ (C:) 以外 や ページングファイル が非設定ドライブに、サードパーティー製 の Windows サービス の実行ファイルやDLLが存在する場合に、アプリケーションエラーが発生するシナリオについて
Windowsプラットフォームサポートの平井です。
本記事では次の条件がすべて当てはまった場合に、サードパーティー製のWindowsサービスがc0000005(STATUS_ACCESS_VIOLATION)やc0000006(STATUS_IN_PAGE_ERROR)のアプリケーションエラーで異常終了するシナリオについて解説します。尚、この事象はPCのシャットダウン後の次回起動時に発生します。
条件は次の通りです。
条件1:高速スタートアップが有効な場合
条件2:対象のサードパーティー製Windowsサービスの実行ファイルやDLLがデータボリューム(C:以外)に存在する場合
条件3:対象のボリュームにページングファイルが非設定である場合
条件4:対象のドライブにBitLockerの構成がデバイス暗号がオン、保護状態がオフの状態の場合
本事象が発生する理由は次の通りです。
高速スタートアップが有効の場合にPCをシャットダウンした場合、Windowsサービスのプロセスはメモリ上に残った状態で休止状態となります。
この際、BitLockerの構成がデバイス暗号がオン・保護状態がオフの状態である場合、次回起動時にデータボリュームのデータを暗号化するためのキーを初期化する処理が発生し、BitLockerの仕様上ボリュームのディスマウントが必要となります。
ボリュームのディスマウントが発生した結果、メモリ上にマッピングされたWindowsサービスのプロセスの実行ファイルやDLLの情報に不整合が発生し、c0000005(STATUS_ACCESS_VIOLATION)やc0000006(STATUS_IN_PAGE_ERROR)等のアプリケーションエラーで異常終了する状況が発生します。
もし、上述の条件がすべて合致する環境にて、同様の問題を検出された場合、次の対応が必要となります。
対応1:サードパーティー製Windowsサービスの実行ファイルやDLLをシステムドライブ(C:)配下にインストールする
Windowsでは既定で、ページングファイルはシステムドライブ配下に保持されます。Windowsはページングファイルが存在するボリュームに対してディスマウントは発行しないため、本事象は発生しません。
対応2:高速スタートアップを無効化する
高速スタートアップが無効の場合にPCをシャットダウンした場合、Windowsサービスのプロセスは完全に停止し、メモリ上にプロセスに紐づく情報は残りません。
対応3:BitLockerをデバイス暗号化/保護状態が共にオンに構成する
BitLockerの設定がデバイス暗号化/保護状態が共にオンの場合、データボリュームの暗号化キーを初期化する処理が発生いたしません。このため、ボリュームのディスマウント処理が発生しないため、本事象は発生いたしません。
対応4:ページングファイルをデーターボリュームにも配置する
Windowsはページングが有効になったボリュームに対してディスマウント処理を発行しないため、本事象は発生いたしません。
例としてD:ドライブにページングファイルを配置する場合についての手順は次の通りです。
1.コントロールパネル\システムとセキュリティ\システムから、[システムの詳細設定]を開きます。
2.[システムのプロパティ] > [詳細設定]タブを開き、[パフォーマンス]セクション配下の[設定]を選択します。
3. [詳細設定]タブを開き[仮想メモリ]セクション 配下の、[変更]を選択します。
4.[すべてのドライブのページングファイルのサイズを自動的に管理する]のチェックボックスが有効の場合は、外します。
5.D:ドライブを選択し、[システム管理サイズ] > [設定]を選択し、[OK]を選択します。
6.システムを再起動し、設定を適用します。