赞
踩
I/O系统的初始化是在内核的阶段1初始化过程中完成的。主要函数是Phase1InitializationDiscard,它调用IoInitSystem 来初始化I/O系统。
IoInitSystem 初始化工作:
WRK中的全局类型对象变量,如下表:
CmpKeyObjectType | ExWindowStationObjectType | ObpDeviceMapObjectType |
DbgkDebugObjectType | IoAdapterObjectType | ObpDirectoryObjectType |
ExCallbackObjectType | IoCompletionObjectType | ObpSymbolicLinkObjectType |
ExDesktopObjectType | IoControllerObjectType | ObpTypeObjectType |
ExEventObjectType | IoDeviceHandlerObjectType | PsJobType |
ExEventPairObjectType | IoDriviceObjectType | PsProcessType |
ExMutantObjectType | IoDriverObjectType | PsThreadType |
ExpKeyedEventObjectType | IoFileObjectType | SeTokenObjectType |
ExProfileObjectType | LpcPortObjectType | WmipGuidObjectType |
ExSemaphoreObjectType | LpcWaitablePortObjectType | |
ExTimerObjectType | MmSectionObjectType |
Windows 的每一个驱动程序(和服务)在安装是都被指定了一个启动类型,存放在注册表中。
启动类型如下:
- #define SERVICE_BOOT_START 0x00000000
- #define SERVICE_SYSTEM_START 0x00000001
- #define SERVICE_AUTO_START 0x00000002
- #define SERVICE_DEMAND_START 0x00000003
- #define SERVICE_DISABLED 0x00000004
在HKLM\System\CurrentControlSet\Serbices\<DriverName> 键的Start 值,表示启动类型。
4种类型的驱动程序的加载和初始化过程。
“引导-启动”类型的驱动程序是由系统加载器即ntldr程序,加载到系统空间种的,内核无需加载,直接初始化。这些驱动程序初始化过程是在IopInitializeBootDrivers中完成的,内部调用IopInitializeBuiltinDriver完成实际的初始化工作。原型如下:
- NTSTATUS IopInitializeBuiltinDriver(
- IN PUNICODE_STRING DriverName,//驱动名称
- IN PUNICODE_STRING RegistryPath,//注册表键的路径
- IN PDRIVER_INITIALIZE DriverInitializeRoutine,//初始化程序例程
- IN PKLDR_DATA_TABLE_ENTRY DriverEntry,//加载参数块中的相应表项
- IN BOOLEAN IsFilter,是否为过滤驱动程序,“引导-启动”的驱动程序IsFilter为FALSE
- IN PDRIVER_OBJECT *Result //若初始化成功,则执行一个驱动程序对象
- )
IopInitializeBuiltinDriver 基本流程如下:
“系统-启动“类型的驱动程序初始化是在IopInitializeSystemDrivers 中完成的,内部调用CmGetSystemDriverList ,获得为SERVICE_SYSTEM_START的”Start“值,对尚未加载的驱动程序逐个调用IopLoadDriver,将其加载到系统地址空间,并执行初始化。
- NTSTATUS IopLoadDriver(
- IN HANDLE KeyHandle, //驱动程序的注册表键值
- IN BOOLEAN CheckForSafeBoot, //是否要检查安全模式
- IN BOOLEAN IsFilter,//是否为过滤驱动程序
- OUT NTSTATUS *DriverEntryStatus //返回参数
- )
IopLoadDriver 基本流程如下:
IopLoadDriver 和IopInitializeBuiltinDriver 都必须在System 进程中运行。
“自动-启动”类型的启动程序,即注册表中”Start”值为SERVICE_AUTO_START的驱动程序,由SCM(服务控制管理器,Service Control manager,services.exe 进程)加载,通过NtLoadDriver 来完成。
- NTSYSCALLAPI NTSTATUS NTAPI NtLoadDriver (
- __in PUNICODE_STRING DriverServiceName //待加载的驱动程序在注册表中的名称
- );
如果用户模式调用NtLoadDriver,则检查当前进程是否由加载驱动的特权。
若是System 进程,则直接调用IopLoadUnloadDriver 完成驱动程序初始化。
“按需-启动”类型的驱动程序是通过SCM来加载和初始化的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。