初始化活动的进程列表。
#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项目致力于为大家开发一个免费而且完全兼容 Microsoft Windows XP 的操作系统。ReactOS 旨在通过使用类似构架和提供完整公共接口实现与 NT 以及 XP 操作系统二进制下的应用程序和驱动设备的完全兼容。 ...
本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...
本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...
JS操作系统 Web上的统一操作系统。 使用的技术: HTML CSS JavaScript React-JS 如何在本地运行: 克隆仓库git clone https://github.com/NJACKWinterOfCode/JS-OS.git 进入JS-OS光盘进入JS-OS cd JS-OS 安装...
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...
在本文档中,我们以Windows NT和ReactOS提供的Fibers实现为参考,介绍了可加载内核模块(LKM)实现。 虽然用户空间实现通常因其开销少且易于调试而成为首选,但是内核空间实现允许更深入地了解内核子系统的工作方式...
01:ReactOS怎样实现系统调用.pdf 02:关于kernel -win32的对象管理.pdf 03:关于kernel-win32的文件操作.pdf 04:Kernel-win32的进程管理.pdf 05:Kernel-win32的系统调用机制.pdf 06:二进制映像的类型识别.pdf 07...
React式对象实现。 结帐 用法 var obj = new ReactiveObject ( { 'foo' : '1' } ) ; obj . defineProperty ( 'bar' , 2 ) ; obj . foo = '2' ; obj . undefineProperty ( 'foo' ) ; // Don't use 'delete obj.foo' ...
远线程注入 每个进程都有自己的虚拟地址空间,对32位进程来说,这个地址空间的大小为4GB。...如下摘自ReactOS 3.14的代码所示,CreateRemoteThread实际实现的功能就是调用NtCreateThread创建一个属于目标进程的线程。
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...
艺术家,专辑和曲目都以文件和文件夹的形式呈现,并且可以在Winamp重新实现轻松地进行操作和播放。现场环境动机构建软件应该保持乐趣。 这个项目主要是一个沙箱,我可以尝试并提高对React和TypeScript的了解。 这也...
isIpad() 设备型号为 iPad Device.isIphone() 设备型号为 iPhone Properties Device.model 设备型号,如 iPhone 或 iPad Device.deviceName 设备名称,如 John Smith 的 iPhone Device.systemName设备操作系统名称...
内存转储是通过使用NTFS事务完成的,NTFS事务使我们可以将转储写入内存,并且MiniDumpWriteDump API已被ReactOS的MiniDumpWriteDump实现改编所取代。 然后,BOF使用base64对内存中的数据进行编码,将其分块,然后...
谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核...
在许多情况下,操作员习惯于处理遥测,实时图表,警报等,这可以帮助他们确定有问题的机器并做出React以解决任何潜在的问题。 但是,一个问题浮现在脑海:如果机器可以自动调整自身并为用户提供自我修复功能,那...
功能,主题,UI / API文本,错误消息,命令内置支持: Arista EOS 鸟思科IOS-XR 思科IOS / IOS-XE 思科NX-OS FRRouting 了华为瞻博JunOS 米克罗蒂克诺基亚SR OS TNSR 虚拟操作系统对任何其他配置支持(可选)通过SSH...
xe-crawlerxe-crawler 是遵循声明式、可监测理念的分布式爬虫,其计划提供 Node.js、Go、Python 多种实现,能够对于静态 Web 页面、动态 Web 页面、关系型数据库、操作系统等异构多源数据进行抓取。xe-crawler 希望...
实现分块功能可以采用手动循环的对每个块依次操作,也可以使用Matlab提供的分块处理功能blkproc。 选择两张大小相同的图像,分别进行DFT变换后,置换两幅图像的幅度和相位信息后再作反变换,观察并分析结果。 主要...