判断 Windows 是否处于安全模式
一、前言
在开发驱动的时候,在有的情况下需要查看操作系统是不是运行在安全模式下。比如我们如果判断出系统正处于安全模式下,就不让驱动程序加载成功。
二、原理
微软以及估计到了开发中有这样的需求,在 Windows 操作系统核心中导出了一个指针变量,它保存了一个声明为 ULONG 类型的数据,这个指针变量被命名成 InitSafeBootMode 。这个变量保存着现在操作系统的安全模式情况的值。在设备驱动中,可以检查这个变量的值来判断 Windows 操作系统是否处于安全模式。
InitSafeBootMode 取值情况如下:
值 | 模式 |
0 | 操作系统不是处于安全模式中 |
1 | SAFEBOOT_MINIMAL |
2 | SAF E B O O T _ N ET W O R K |
3 | SAF E B O O T _ DS R EP A I R |
注:值 3 只适用于 Windows 域控制器版本。
三、使用方式
为了使用这个变量,需要先声明这个变量:
extern PULONG InitSafeBootMode;
在声明了 InitSafeBootMode 变量后,就可以按照下面的方式来使用这个变量:
i f ( * In i t S af e B o ot M o d e > 0 )
{
/ / 操作系统现在处于安全模式中,可以采取相应的行动
//
}
四、使用注意
为了阻止在安全模式下对驱动进行操作,根据不同的驱动类型按照下面的列表的使用建议进行处理:
1. 功能驱动
如果驱动的服务启动类型是 SER V I CE_ BOO T_ ST AR T ,在功能驱动的AddDevice 例程中检查InitSafeBootMode 的值。如果系统处于安全模式下,则返回错误。
注:在DriverEntry 例程中,返回值一定不能为错误。
2. 过滤驱动
如果驱动是过滤驱动,则在系统启动过程中在 AddDevice 例程中检查InitSafeBootMode 的值。如果操作系统处于安全模式下,则:
1) 不要附加过滤设备到设备堆栈上去
2) 在过滤驱动的 AddDevice 例程中返回成功。
3. 其他驱动
对于其他驱动,在驱动的 DriverEntry 例程中检查 InitSafeBootModed 的值。如果系统处于安全模式,则返回表示错误的代码。