`
yuanjinxiu
  • 浏览: 659091 次
文章分类
社区版块
存档分类
最新评论

reactos操作系统实现(35)

 
阅读更多

初始化活动的进程列表。

#076 /* Initialize the Active Process List */

#077 InitializeListHead(&PsActiveProcessHead);

#078 KeInitializeGuardedMutex(&PspActiveProcessMutex);

#079

获取空闲的进程列表。在Reactos里,系统初始化进程,最终就是一个空闲进程。因此,只需要获取当前进程就行了。

#080 /* Get the idle process */

#081 PsIdleProcess = PsGetCurrentProcess();

#082

设置空闲进程锁。

#083 /* Setup the locks */

#084 PsIdleProcess->ProcessLock.Value = 0;

#085 ExInitializeRundownProtection(&PsIdleProcess->RundownProtect);

#086

初始化空闲进程列表。

#087 /* Initialize the thread list */

#088 InitializeListHead(&PsIdleProcess->ThreadListHead);

#089

清空空闲进程的内核使用时间。

#090 /* Clear kernel time */

#091 PsIdleProcess->Pcb.KernelTime = 0;

#092

下面这段,就是初始化与进程有关的对象。

#093 /* Initialize Object Initializer */

#094 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));

#095 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);

#096 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK |

#097 OBJ_PERMANENT |

#098 OBJ_EXCLUSIVE |

#099 OBJ_OPENIF;

#100 ObjectTypeInitializer.PoolType = NonPagedPool;

#101 ObjectTypeInitializer.SecurityRequired = TRUE;

#102

初始化进程类型对象。

#103 /* Initialize the Process type */

#104 RtlInitUnicodeString(&Name, L"Process");

#105 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(EPROCESS);

进程映射过程。

#106 ObjectTypeInitializer.GenericMapping = PspProcessMapping;

#107 ObjectTypeInitializer.ValidAccessMask = PROCESS_ALL_ACCESS;

进程删除过程。

#108 ObjectTypeInitializer.DeleteProcedure = PspDeleteProcess;

创建进程类型对象。

#109 ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &PsProcessType);

#110

初始化线程类型对象。

#111 /* Initialize the Thread type */

#112 RtlInitUnicodeString(&Name, L"Thread");

#113 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);

#114 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(ETHREAD);

#115 ObjectTypeInitializer.GenericMapping = PspThreadMapping;

#116 ObjectTypeInitializer.ValidAccessMask = THREAD_ALL_ACCESS;

#117 ObjectTypeInitializer.DeleteProcedure = PspDeleteThread;

#118 ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &PsThreadType);

#119

初始化工作集对象类型。

#120 /* Initialize the Job type */

#121 RtlInitUnicodeString(&Name, L"Job");

#122 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);

#123 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(EJOB);

#124 ObjectTypeInitializer.GenericMapping = PspJobMapping;

#125 ObjectTypeInitializer.ValidAccessMask = JOB_OBJECT_ALL_ACCESS;

#126 ObjectTypeInitializer.DeleteProcedure = PspDeleteJob;

#127 ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &PsJobType);

#128

初始化工作集结构。

#129 /* Initialize job structures external to this file */

#130 PspInitializeJobStructures();

#131

#132 /* Initialize the Working Set data */

#133 InitializeListHead(&PspWorkingSetChangeHead.List);

#134 KeInitializeGuardedMutex(&PspWorkingSetChangeHead.Lock);

#135

初始化CID的句柄表,主要用来保存所有进程的句柄。

#136 /* Create the CID Handle table */

#137 PspCidTable = ExCreateHandleTable(NULL);

#138 if (!PspCidTable) return FALSE;

#139

#140 /* FIXME: Initialize LDT/VDM support */

#141

建立回收列表。

#142 /* Setup the reaper */

#143 ExInitializeWorkItem(&PspReaperWorkItem, PspReapRoutine, NULL);

#144

设置引导访问控制标志。

#145 /* Set the boot access token */

#146 PspBootAccessToken = (PTOKEN)(PsIdleProcess->Token.Value & ~MAX_FAST_REFS);

#147

#148 /* Setup default object attributes */

#149 InitializeObjectAttributes(&ObjectAttributes,

#150 NULL,

#151 0,

#152 NULL,

#153 NULL);

#154

创建初始化系统进程。

#155 /* Create the Initial System Process */

#156 Status = PspCreateProcess(&PspInitialSystemProcessHandle,

#157 PROCESS_ALL_ACCESS,

#158 &ObjectAttributes,

#159 0,

#160 FALSE,

#161 0,

#162 0,

#163 0,

#164 FALSE);

#165 if (!NT_SUCCESS(Status)) return FALSE;

#166

设置系统进程与对象关系。

#167 /* Get a reference to it */

#168 ObReferenceObjectByHandle(PspInitialSystemProcessHandle,

#169 0,

#170 PsProcessType,

#171 KernelMode,

#172 (PVOID*)&PsInitialSystemProcess,

#173 NULL);

#174

设置系统两个进程的名称。

#175 /* Copy the process names */

#176 strcpy(PsIdleProcess->ImageFileName, "Idle");

#177 strcpy(PsInitialSystemProcess->ImageFileName, "System");

#178

设置系统初始化进程的文件名称。

#179 /* Allocate a structure for the audit name */

#180 PsInitialSystemProcess->SeAuditProcessCreationInfo.ImageFileName =

#181 ExAllocatePoolWithTag(PagedPool,

#182 sizeof(OBJECT_NAME_INFORMATION),

#183 TAG_SEPA);

#184 if (!PsInitialSystemProcess->SeAuditProcessCreationInfo.ImageFileName)

#185 {

#186 /* Allocation failed */

#187 return FALSE;

#188 }

#189

#190 /* Zero it */

#191 RtlZeroMemory(PsInitialSystemProcess->

#192 SeAuditProcessCreationInfo.ImageFileName,

#193 sizeof(OBJECT_NAME_INFORMATION));

#194

创建系统初始进程的工作线程。并且设置线程运行函数Phase1Initialization,这个线程就开始进入系统第1阶段初始化。

#195 /* Setup the system initialization thread */

#196 Status = PsCreateSystemThread(&SysThreadHandle,

#197 THREAD_ALL_ACCESS,

#198 &ObjectAttributes,

#199 0,

#200 NULL,

#201 Phase1Initialization,

#202 LoaderBlock);

#203 if (!NT_SUCCESS(Status)) return FALSE;

#204

创建一个对象与线程句柄关联在一起。

#205 /* Create a handle to it */

#206 ObReferenceObjectByHandle(SysThreadHandle,

#207 0,

#208 PsThreadType,

#209 KernelMode,

#210 (PVOID*)&SysThread,

#211 NULL);

#212 ZwClose(SysThreadHandle);

设置系统初始化进程已经准备好。

#213 SysThreadCreated = TRUE;

#214

#215 /* Return success */

#216 return TRUE;

#217 }

通过这个函数把进程的数据结构全部初始化,为最后创建初始化进程准备好了条件,这样当系统下一次任务调度时,就会进入系统第1阶段初始化,这样就系统就有两个进程在运行,第一个进程是引导进程,最终变为空闲进程。第二个进程是系统初始化进程。

现在就来分析第二阶段的进程管理器初始化函数PspInitPhase0,如下:

#001 BOOLEAN

#002 NTAPI

#003 PspInitPhase1()

#004 {

#005 /* Initialize the System DLL and return status of operation */

#006 if (!NT_SUCCESS(PspInitializeSystemDll())) return FALSE;

#007 return TRUE;

#008 }

第二阶段主要就是初始化系统的动态连接库,并且返回执行的操作结果。
分享到:
评论

相关推荐

    ReactOS-0.4.13-release-14-g2494cfc-iso.zip

    ReactOS项目致力于为大家开发一个免费而且完全兼容 Microsoft Windows XP 的操作系统。ReactOS 旨在通过使用类似构架和提供完整公共接口实现与 NT 以及 XP 操作系统二进制下的应用程序和驱动设备的完全兼容。 ...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part02

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...

    JS-OS:Web上的统一操作系统

    JS操作系统 Web上的统一操作系统。 使用的技术: HTML CSS JavaScript React-JS 如何在本地运行: 克隆仓库git clone https://github.com/NJACKWinterOfCode/JS-OS.git 进入JS-OS光盘进入JS-OS cd JS-OS 安装...

    漫谈兼容内核.zip

    漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...

    LKM-光纤:高级操作系统和虚拟化项目(20172018)课程在罗马大学萨皮恩扎市举行

    在本文档中,我们以Windows NT和ReactOS提供的Fibers实现为参考,介绍了可加载内核模块(LKM)实现。 虽然用户空间实现通常因其开销少且易于调试而成为首选,但是内核空间实现允许更深入地了解内核子系统的工作方式...

    漫谈Linux兼容内核

    01:ReactOS怎样实现系统调用.pdf 02:关于kernel -win32的对象管理.pdf 03:关于kernel-win32的文件操作.pdf 04:Kernel-win32的进程管理.pdf 05:Kernel-win32的系统调用机制.pdf 06:二进制映像的类型识别.pdf 07...

    harmonyos2-reactive-extra:流星React额外包

    React式对象实现。 结帐 用法 var obj = new ReactiveObject ( { 'foo' : '1' } ) ; obj . defineProperty ( 'bar' , 2 ) ; obj . foo = '2' ; obj . undefineProperty ( 'foo' ) ; // Don't use 'delete obj.foo' ...

    DLL注入之远线程方式

    远线程注入 每个进程都有自己的虚拟地址空间,对32位进程来说,这个地址空间的大小为4GB。...如下摘自ReactOS 3.14的代码所示,CreateRemoteThread实际实现的功能就是调用NtCreateThread创建一个属于目标进程的线程。

    Windows之漫谈兼容内核

    漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...

    winampify::high_voltage:具有操作系统外观的界面和经典音频播放器Winamp的重新实现的Spotify Web客户端

    艺术家,专辑和曲目都以文件和文件夹的形式呈现,并且可以在Winamp重新实现轻松地进行操作和播放。现场环境动机构建软件应该保持乐趣。 这个项目主要是一个沙箱,我可以尝试并提高对React和TypeScript的了解。 这也...

    React Native 的 UIDevice 类包装器

    isIpad() 设备型号为 iPad Device.isIphone() 设备型号为 iPhone Properties Device.model 设备型号,如 iPhone 或 iPad Device.deviceName 设备名称,如 John Smith 的 iPhone Device.systemName设备操作系统名称...

    CredBandit

    内存转储是通过使用NTFS事务完成的,NTFS事务使我们可以将转储写入内存,并且MiniDumpWriteDump API已被ReactOS的MiniDumpWriteDump实现改编所取代。 然后,BOF使用base64对内存中的数据进行编码,将其分块,然后...

    漫谈兼容内核.7z

    谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核...

    phoebe:菲比

    在许多情况下,操作员习惯于处理遥测,实时图表,警报等,这可以帮助他们确定有问题的机器并做出React以解决任何潜在的问题。 但是,一个问题浮现在脑海:如果机器可以自动调整自身并为用户提供自我修复功能,那...

    hyperglass:超级玻璃是试图使互联网变得更好的网络外观玻璃

    功能,主题,UI / API文本,错误消息,命令内置支持: Arista EOS 鸟思科IOS-XR 思科IOS / IOS-XE 思科NX-OS FRRouting 了华为瞻博JunOS 米克罗蒂克诺基亚SR OS TNSR 虚拟操作系统对任何其他配置支持(可选)通过SSH...

    sentinel-crawler:Xenomorph Crawler, a Concise, Declarative and Observable Distributed Crawler(Node Go Java Rust) For Web, RDB, OS, also can act as a Monitor(with Prometheus) or ETL for Infrastructure 多语言执行器,分布式爬虫

    xe-crawlerxe-crawler 是遵循声明式、可监测理念的分布式爬虫,其计划提供 Node.js、Go、Python 多种实现,能够对于静态 Web 页面、动态 Web 页面、关系型数据库、操作系统等异构多源数据进行抓取。xe-crawler 希望...

    图像dct变换matlab代码-SJTU-IE307-hw1:ConductedbyProf.XieRong

    实现分块功能可以采用手动循环的对每个块依次操作,也可以使用Matlab提供的分块处理功能blkproc。 选择两张大小相同的图像,分别进行DFT变换后,置换两幅图像的幅度和相位信息后再作反变换,观察并分析结果。 主要...

Global site tag (gtag.js) - Google Analytics