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

reactos操作系统实现(36)

 
阅读更多

前面分析了进程管理器的初始化工作,主要就是把进程管理器的列表、对象初始化,还有第一和第二阶段的初始化工作。接着下来,我们来分析一下进程创建函数,看看进程在Reactos里是怎么样创建的,需要调用什么函数来创建进程,还有应用程序是怎么样调用API函数来创建进程的。

可以从前面分析的代码里,看到创建第二个进程代码如下:

#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;

这里调用函数PsCreateSystemThread来创建进程,它的代码如下:

#001 NTSTATUS

#002 NTAPI

#003 PspCreateProcess(OUT PHANDLE ProcessHandle,

#004 IN ACCESS_MASK DesiredAccess,

#005 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,

#006 IN HANDLE ParentProcess OPTIONAL,

#007 IN ULONG Flags,

#008 IN HANDLE SectionHandle OPTIONAL,

#009 IN HANDLE DebugPort OPTIONAL,

#010 IN HANDLE ExceptionPort OPTIONAL,

#011 IN BOOLEAN InJob)

#012 {

这个函数的参数:

ProcessHandle创建进程输出的句柄。

DesiredAccess访问进程权限。

ObjectAttributes是进程对象属性。

ParentProcess是父进程的句柄。

Flags是创建进程标志。

SectionHandle是段句柄。

DebugPort是调试输出端口。

ExceptionPort是异常输出端口。

InJob是工作集标志。

#013 HANDLE hProcess;

#014 PEPROCESS Process, Parent;

#015 PVOID ExceptionPortObject;

#016 PDEBUG_OBJECT DebugObject;

#017 PSECTION_OBJECT SectionObject;

#018 NTSTATUS Status, AccessStatus;

#019 ULONG DirectoryTableBase[2] = {0,0};

#020 KAFFINITY Affinity;

#021 HANDLE_TABLE_ENTRY CidEntry;

#022 PETHREAD CurrentThread = PsGetCurrentThread();

#023 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();

#024 PEPROCESS CurrentProcess = PsGetCurrentProcess();

#025 ULONG MinWs, MaxWs;

#026 ACCESS_STATE LocalAccessState;

#027 PACCESS_STATE AccessState = &LocalAccessState;

#028 AUX_ACCESS_DATA AuxData;

#029 UCHAR Quantum;

#030 BOOLEAN Result, SdAllocated;

#031 PSECURITY_DESCRIPTOR SecurityDescriptor;

#032 SECURITY_SUBJECT_CONTEXT SubjectContext;

下面判断是否能调用内核代码。

#033 PAGED_CODE();

#034 PSTRACE(PS_PROCESS_DEBUG,

#035 "ProcessHandle: %p Parent: %p/n", ProcessHandle, ParentProcess);

#036

检查调用标志。

#037 /* Validate flags */

#038 if (Flags & ~PS_ALL_FLAGS) return STATUS_INVALID_PARAMETER;

#039

检查是否有父进程。

#040 /* Check for parent */

#041 if (ParentProcess)

#042 {

如果有父进程,就要增加父进程的引用计数。

#043 /* Reference it */

#044 Status = ObReferenceObjectByHandle(ParentProcess,

#045 PROCESS_CREATE_PROCESS,

#046 PsProcessType,

#047 PreviousMode,

#048 (PVOID*)&Parent,

#049 NULL);

#050 if (!NT_SUCCESS(Status)) return Status;

#051

如果创建进程要求是工作集的,但它的父进程不是,就出错。

#052 /* If this process should be in a job but the parent isn't */

#053 if ((InJob) && (!Parent->Job))

#054 {

#055 /* This is illegal. Dereference the parent and fail */

#056 ObDereferenceObject(Parent);

#057 return STATUS_INVALID_PARAMETER;

#058 }

#059

继承父进程的特性。

#060 /* Inherit Parent process's Affinity. */

#061 Affinity = Parent->Pcb.Affinity;

#062 }

#063 else

#064 {

否则是没有父进程的。

#065 /* We have no parent */

#066 Parent = NULL;

#067 Affinity = KeActiveProcessors;

#068 }

#069

分享到:
评论

相关推荐

    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