确定操作系统是否在安全模式下运行

本主题介绍设备驱动程序如何确定其上运行的操作系统是否已在安全模式下启动。 本主题还介绍如何防止驱动程序在安全模式下运行。

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 的值。 如果操作系统处于安全模式,则返回失败状态。