这个话题描述了一个设备驱动怎么确定正在运行的操作系统是否开始于安全模式(started in Safe Mode),并且描述了如何阻止驱动在安全模式下运行。
Windows 操作系统内核导出(export)了一个指向类型为ULONG, 名为InitSafeBootMode变量 的指针。InitSafeBootMode 变量包含当前安全模式下的各种配置信息。设备驱动可以通过检测这个变量来确定操作系统是否运行在安全模式。
下面列出关于InitSafeBootMode的值与模式对应表:
value mode
0 the operating system is mot in safe mode
1 safeboot_minimal
2 safeboot_network
3* safeboot_dsrepair
注意 :只有系统主要控制者(windows domain controllers) 可以使用值3。
要使用InitSafeBootMode变量,首先必须在你的驱动里对它进行声明,如下:
extern PULONG IintSafeBootMode;
声明之后,可以参照下面的例子来确定操作系统是否运行在安全模式下:
if(*InitSafeBootMode>0)
{
//the operating system is in safe mode.在安全模式下
//take appropriate action.采取合适的措施
}
使用下面的技巧,根据你的驱动类型来阻止它运行在安全模式下:
*功能型驱动(function drivers)
如果你的功能驱动有一个开始类型(start type)为SERVICE_BOOT_START(在系统启动时开始),在驱动的 AddDevice 例程里检测InitSafeBootMode 的值。如果系统运行在安全模式下,返回一个失败状态(failure status)。
注意: 你一定不要再DriverEntry 例程里返回一个失败。(You must never return failure from the DriverEntry routine.)
*过滤型驱动(filterdrivers)
如果你的过滤驱动在系统开始(system startup),在驱动的 AddDevice 例程里检测InitSafeBootMode 的值,如果系统运行在安全模式下,进行以下操作:
1.不要将过滤设备对象附加到(attach to) 设备栈
2.在过滤驱动的AddDevice例程里返回成功。
*其他类型驱动(other drivers)
除了功能型和过滤型的驱动,其他类型的在DriverEntry例程里检测InitSafeBootMode的值 。如果操作系统运行在安全模式下,返回一个失败状态。