Bug Check 0x9F/hang when shutting down

Last Update: feedback 共有

本記事はマイクロソフト社員によって公開されております。

こんにちは、Windows サポートチームの栗木です。
本記事では、Cドライブにページング ファイルを配置していない環境で稀にシャットダウン時に BSoD (ブルースクリーン) またはハングが発生する事象とその対応策をご紹介します。

適用対象の OS

  • Windows 8.1
  • Windows 10
  • Windows Server 2012
  • Windows Server 2012 R2
  • Windows Server 2016
  • Windows Server 2019

現象

OS をシャットダウンまたは再起動する際、「シャットダウンしています」または「再起動しています」が表示された状態のまま先に進まず、BSoD (Bug Check Code 0x9F) が発生する、あるいはいつまで待ってもシャットダウンが完了しない。

要因

ページング ファイルが Cドライブ(Windows フォルダーが存在するドライブ)に配置されていないことに起因します。

シャットダウンが開始されるとページング ファイルが配置されていないドライブのディスクは他のデバイスよりも優先して電源が落とされます。すでに Cドライブのディスクの電源が落とされている状態で、シャットダウン処理に必要なドライバーのコード領域がページ アウトされていると、ドライバーのコードを物理メモリへ読み出すための Read 要求が処理できなくなります。これにより、処理が完了しないことをシステムが検知して BSoD (Bug Check Code 0x9F) を発生させる、または処理が完了しないためシャットダウンがいつまで待っても終わらない現象が発生します。

対応策

Cドライブにページング ファイルを配置する方法とドライバーのコード領域をページアウトさせないように設定する方法のいずれかで対応が可能です。Cドライブにページング ファイルを配置する方法は、デメリットはありませんが、ドライバーのコード領域をページアウトさせないように設定すると、物理メモリに余裕のないシステムでは、動作が遅くなる可能性があります。そのため、特別な理由がなければ、Cドライブにページング ファイルを配置する方法を推奨いたします。

1. Cドライブにページング ファイルを配置

本事象は、ページング ファイルのサイズには依存しないので、Cドライブに作成するページング ファイルのサイズは、仕様上の最小値である 16MB で問題ありません。ただし、Cドライブのページングファイルが小さいと、システムが BSoD(ブルースクリーン)時にメモリダンプが作成されない可能性があるため、レジストリ エディターで優先度を変更する必要がございます。

  1. スタート ボタンを右クリックし、ファイル名を指定して実行 を実行します。

  2. Regedit と入力し、OK をクリックします。

  3. 以下のレジストリ サブキーを探し、選択します。

    1
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management
  4. PagingFiles をダブルクリックします。

  5. 値のデータ にて、優先したいドライブの pagefile.sys が一番上に来るように編集します。
    Dドライブに十分な空き容量があり、Cドライブの空きが少ない場合は、Dドライブのページング ファイルを大きくしてメモリ ダンプの採取に備えると共に、本現象の対策のため Cドライブには最小のサイズ 16MB のページングファイルを作成します。そして、Dドライブがメモリダンプの出力に使われるよう、優先度を高く(先頭に来るように)設定します。Dドライブである必要はありませんので、環境に合わせて任意のドライブを選択してください。

    以下のように設定すると、Dドライブに 8592MB、Cドライブに 16MB を設定し、8GB の物理メモリを搭載しているシステムで完全メモリ ダンプがDドライブに出力されるようになります。完全メモリ ダンプに必要なページング ファイルのサイズは、搭載している物理メモリ量 + 400MB なりますので、環境に合わせて、8592 の部分は変更してください。

    1
    2
    d:\pagefile.sys 8592 8592
    c:\pagefile.sys 16 16

  6. レジストリ エディターを終了し、変更を反映するために OS を再起動します。

2. ドライバーのコード領域をページアウトさせないように設定

ドライバーのコード領域がページ アウトさせないようにレジストリ DisablePagingExecutive の値を変更します。

  1. スタート ボタンを右クリックし、ファイル名を指定して実行 を実行します。

  2. Regedit と入力し、OK をクリックします。

  3. 以下のレジストリ サブキーを探し、選択します。

    1
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management
  4. DisablePagingExecutive をダブル クリックします。

  5. 値のデータ を1(ページ アウトさせない)に変更します。

  1. レジストリ エディターを終了し、変更を反映するために OS を再起動します。

コマンドによる設定方法

ご紹介した設定は、次のコマンドをコマンドプロンプト(管理者権限)により設定が可能です。いずれかを環境に合わせて設定し、変更を反映するために OS を再起動してください。

1
2
3
4
5
# Cドライブにページング ファイルを配置
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles /t REG_MULTI_SZ /d "d:\pagefile.sys 8592 8592\0c:\pagefile.sys 16 16" /f

# ドライバーのコード領域をページアウトさせないように設定
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v DisablePagingExecutive /t REG_DWORD /d 1 /f

参考 URL

変更履歴

  • 2021/11/04: 本 Blog の公開