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

reactos操作系统实现(36)

发布时间:2020-12-15 05:01:48 所属栏目:百科 来源:网络整理
导读:前面分析了进程管理器的初始化工作,主要就是把进程管理器的列表、对象初始化,还有第一和第二阶段的初始化工作。接着下来,我们来分析一下进程创建函数,看看进程在 Reactos 里是怎么样创建的,需要调用什么函数来创建进程,还有应用程序是怎么样调用 API

前面分析了进程管理器的初始化工作,主要就是把进程管理器的列表、对象初始化,还有第一和第二阶段的初始化工作。接着下来,我们来分析一下进程创建函数,看看进程在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

(编辑:李大同)

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

    推荐文章
      热点阅读