システムドライブ (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.システムを再起動し、設定を適用します。