オペレーティング システムがセーフ モードで実行されているかどうかの判断
このトピックでは、デバイス ドライバーが実行されているオペレーティング システムが セーフ モードで起動されたかどうかを判断する方法について説明します。 このトピックでは、ドライバーがセーフ モードで動作しないようにする方法についても説明します。
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 の値をチェックします。 オペレーティング システムがセーフ モードの場合は、次の操作を行います。
- フィルター デバイス オブジェクトをデバイス スタックにアタッチしないでください。
- フィルター ドライバーの AddDevice ルーチンから成功を返します。
その他のドライバー
ファンクション ドライバーまたはフィルター ドライバー以外のドライバーの場合は、ドライバーの DriverEntry ルーチンで InitSafeBootMode の値をチェックします。 オペレーティング システムがセーフ モードの場合は、エラー状態を返します。