WinCE的NK.exe和File.exe

作为嵌入式操作系统,在Smartphone 2002 (基于Windows CE 3.0) 中并不提供动态链接库注入机制,在Smartphone 2003才提供,使用Dll Inject机制,可以在注册表中设置关键字HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL的值,该关键字数据类型为REG_MULTI_SZ,包含一个DLL文件名或者一组DLL文件名(用逗号分离),列出的每个DLL文件名都可以包含一个路径。当系统启动时,列在该键值中的每个DLL会映射到系统加载的每个进程中(Nk.exe和File.exe除外)。 
当进程创建时,系统将分配进程的地址空间,接着将可执行文件映像和所有需要的DLL文件(包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的所有DLL)映像映射到进程的地址空间中。然后才创建进程的主线程,并使用该线程调用每个DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当已经映射的所有DLL都对通知信息作出响应后,系统将使进程的主线程开始执行可执行模块的C/C++ Runtime启动代码,然后执行可执行模块的进入点函数(WinMain)。
如果DLL(不包括HKEY_LOCAL_MACHINE\System\Kernel\InjectDLL注册的任何DLL)的任何一个DllMain函数返回FALSE,表明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除所有文件映像,给使用户显示一个消息框,说明进程无法启动运行。 
前面说过,NK.exe和File.exe不受该键值的影响,这主要是由于Windows CE的启动过程造成的[4]。 
当系统复位时,CPU将跳转到NK.exe的入口。NK.exe是Windows CE的核心模块,入口的代码实际上是由OEM编写的,而不是Microsoft,因为不同的平台,硬件也不一定相同,因此Windows CE需要OEM编写一些特定的初始化代码,这些代码被并入内核的硬件抽象层(HAL,Hardware Abstraction Layer),当OEM为特定硬件平台建立系统时,HAL将和Windows CE内核代码静态连接而产生NK.exe。 
Nk.exe在设计时与文件系统(包括注册表系统、数据库系统)是独立的,也就是说NK.exe不会负责文件系统的初始化,但是在NK.exe初始化过程中要用到注册表数据,因此,当NK.exe启动后,将创建有名事件(Named Events)SYSTEM/FSReady,加载并运行系统程序File.exe, 然后转入睡眠等待事件变为已通知状态。 
File.exe负责管理文件系统、数据库函数和注册表。File.exe被加载后,将检测这次启动是冷启动还是热启动。冷启动和热启动的最大区别就是内存中是否存在已初始化的文件系统。 
如果是热启动,内存中保留了上次使用的数据,File.exe将使用这个已初始化的文件系统。如果是冷启动,File创建一个文件系统,将空内存文件系统和ROM中的文件合并在一起。 
当文件系统存在后,File.exe会创建默认的数据库和注册表,初始化本地语言支持模块(National Language Support, NLS)。 
接着File.exe将事件SYSTEM/FSReady置为已通知状态,然后转为睡眠状态等待Nk.exe完成初始化后将其唤醒。 
由于事件SYSTEM/FSReady置为已通知状态,NK.exe被唤醒接着运行,此时,注册表已被File.exe创建,NK.exe根据注册表的键值继续运行,如配置虚拟内存管理器,初始化默认处理程序的中断向量表,初始化端口等等,当然,最重要的是通知File.exe可以继续运行。 
File.exe被唤醒后,接着进行后续的初始化工作,如根据列在注册表HKEY_LOCAL_MACHINE\System\Events中的名字创建有名事件SYSTEM/PowerManagerReady,SYSTEM/GweApiSetReady,SYSTEM/ShellAPIReady,SYSTEM/BatteryAPIsReady等等,这些有名事件的初始状态都是未通知状态,后面有相应的程序来对其进行设置,如图形窗口和事件管理器(GWE,Graphics Windowing and Event Manager)初始化图形API后,会把有名事件SYSTEM/GweApiSetReady值为通知状态,系统知道图形API有效,可以进行图形绘制。 
所以,在Nk.exe和File.exe被加载前,系统不可能去搜索注册表,更谈不上Dll Inject钩子机制。 
关于Windows CE的详细的启动步骤请参考MSDN。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值