オペレーティング システムがセーフ モードで実行されているかどうかの判断

このトピックでは、デバイス ドライバーが実行されているオペレーティング システムが セーフ モードで起動されたかどうかを判断する方法について説明します。 このトピックでは、ドライバーがセーフ モードで動作しないようにする方法についても説明します。

Microsoft Windows オペレーティング システム カーネルは、InitSafeBootMode という名前のポインターをエクスポートします。 InitSafeBootMode は、現在有効なセーフ モード設定を格納する ULONG 変数を指します。 デバイス ドライバーは、これらの設定を調べることで、オペレーティング システムが セーフ モードで実行されているかどうかを判断できます。

次の表に、InitSafeBootMode 変数の値とそれに対応する各モードを示します。

モード

0

オペレーティング システムはセーフ モードではありません。

1

SAFEBOOT_MINIMAL

2

SAFEBOOT_NETWORK

3*

SAFEBOOT_DSREPAIR

: * 値 3 は Windows ドメイン コントローラーにのみ適用されます。

InitSafeBootMode 変数を使用するには、次のコード例に示すように、ドライバーで宣言します。

extern PULONG InitSafeBootMode;

InitSafeBootMode を宣言した後、次のコード例を使用して、オペレーティング システムがセーフ モードで実行されているかどうかを確認できます。

if (*InitSafeBootMode > 0) {
    // The operating system is in Safe Mode.
    // Take appropriate action.
    //
}

ドライバーがセーフ モードで動作するのを防止するには、ドライバーの種類に応じて、次の手法を使用します。

  • ファンクション ドライバー

    ファンクション ドライバーのサービス開始の種類が SERVICE_BOOT_START の場合は、ファンクション ドライバーの AddDevice ルーチンで InitSafeBootMode の値をチェックします。 システムがセーフ モードの場合は、エラー状態を返します。

    : DriverEntry ルーチンからエラーを返さないでください。

  • フィルター ドライバー

    システムの起動時にフィルター ドライバーが起動する場合は、フィルター ドライバーの AddDevice ルーチンで InitSafeBootMode の値をチェックします。 オペレーティング システムがセーフ モードの場合は、次の操作を行います。

    1. フィルター デバイス オブジェクトをデバイス スタックにアタッチしないでください。
    2. フィルター ドライバーの AddDevice ルーチンから成功を返します。
  • その他のドライバー

    ファンクション ドライバーまたはフィルター ドライバー以外のドライバーの場合は、ドライバーの DriverEntry ルーチンで InitSafeBootMode の値をチェックします。 オペレーティング システムがセーフ モードの場合は、エラー状態を返します。