加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(51)

发布时间:2020-12-15 05:01:30 所属栏目:百科 来源:网络整理
导读:从前面的分析可以知道,安装 Reactos 到硬盘里的过程,是由程序 usetup.exe 来实现的,那么下面就来分析这个程序的实现过程,了解操作系统的安装过程。打开 Reactos 源码的目录 reactos/base/setup/usetup ,就可以看到相关工程的代码。 在仔细分析代码之前

从前面的分析可以知道,安装Reactos到硬盘里的过程,是由程序usetup.exe来实现的,那么下面就来分析这个程序的实现过程,了解操作系统的安装过程。打开Reactos源码的目录reactos/base/setup/usetup,就可以看到相关工程的代码。

在仔细分析代码之前,我们需要了解什么是内核应用程序。从前面可以知道ntoskrnl.exe内核运行最后,就调用应用程序usetup.exe来运行,再仔细想一下,这个程序运行在smss.exe之前,也运行在所有子系统之前。也就是意味着smss.exe和所有子系统的API接口是不能使用的,只能使用ntoskrnl.exe内核的API接口,否则就会出错。因此,这一类没有使用所有子系统接口API的程序,就称作为内核应用程序。所有在子系统初始化前运行的应用程序,都是内核应用程序。内核应用程序的入口点,也跟其它子系统的应用程序入口点不同,它是从函数NtProcessStartup开始加载运行,而不像WinMainmain作为程序入口点函数。

下面就来分析入口代码,在文件里reactos/base/setup/usetup/interface/usetup.c如下:

#001 #ifdef __REACTOS__

#002

#003 VOID NTAPI

#004 NtProcessStartup(PPEB Peb)

#005 {

从内核里接收到参数Peb

下面开始把Peb参数进行正规化处理,以便可以访问真实内存的地址,否则访问的只是内存的偏移大小而已。

#006 RtlNormalizeProcessParams(Peb->ProcessParameters);

#007

获取进程的堆空间。

#008 ProcessHeap = Peb->ProcessHeap;

设置ProcessHeapINF的堆空间。

#009 INF_SetHeap(ProcessHeap);

下面调用函数RunUSetup来处理安装系统的流程。

#010 RunUSetup();

#011 }

#012 #endif /* __REACTOS__ */

在上面的函数里调用函数RtlNormalizeProcessParams来处理参数正规化,为什么要这样处理呢?因为在调用在内核函数已经反正规化处理,如下:

#174 Status = RtlCreateUserProcess(&SmssName,

#175 OBJ_CASE_INSENSITIVE,

#176 RtlDeNormalizeProcessParams(ProcessParams),

#177 NULL,

#178 NULL,

#179 NULL,

#180 FALSE,

#181 NULL,

#182 NULL,

#183 ProcessInformation);

176行代码里,就是调用函数RtlDeNormalizeProcessParams反正规化处理。这样处理有什么样的作用呢?我想是把参数指针设置为偏移值后,如果再非法访问,就会访问系统保留内存空间,而出现异常处理。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读