• Windows内核--CreateProcess的内核实现 (3)


            不管是桌面双击应用程序(ShellExecute*)还是代码中调用创建进程API, 最终一般都会调用NT Native API CreateProcess.

            CreateProcess内部调用到Kernel NtCreateProcess例程,内部比较复杂。

            

    1. BOOL CreateProcessA(
    2. [in, optional] LPCSTR lpApplicationName,
    3. [in, out, optional] LPSTR lpCommandLine,
    4. [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes,
    5. [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
    6. [in] BOOL bInheritHandles,
    7. [in] DWORD dwCreationFlags,
    8. [in, optional] LPVOID lpEnvironment,
    9. [in, optional] LPCSTR lpCurrentDirectory,
    10. [in] LPSTARTUPINFOA lpStartupInfo,
    11. [out] LPPROCESS_INFORMATION lpProcessInformation
    12. );
    13. from: https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa

            大体上,即为:

            a. 分配EPROCESS内存, 创建进程/线程Kernel对象,初始化进程基本信息,比如PCB、ID、优先级、进程名称等。

            b.  设置线程启动地址,把线程移到就绪列表。

            具体请参阅WRK1.2 create.c, 这里不再赘述,下面会继续讨论API参数和Kernel内部比较特别的地方。

    ps\create.c

    • InheritObjectTable是Bool类型,NtCreateProcessEx转换成ULONG flags形式,可以cover BOOL类型,并让调用更灵活。 flags是进程创建flag.           
    • NtCreateProcessEx最终会调用PspCreateProcess完成进程创建。

    Q: CreateProcess包含参数"LPCSTR lpApplicationName", 为什么到Kenrel系统调用就没了?

    A: 因为在userspace DLL已经调用了NtOpenFile打开过可执行映像,返回了SectionHandle.

    Q: 如果ParentProcess为空,最终会返回非法参数错误?

    A: 是的. 对于用户空间创建进程,必须有父进程。只有Kernel才有权限创建没有Parent的进程. 

    1 创建EPROCESS

            

    2 获取可执行镜像Section指针

    3 拷贝父进程句柄

    4 初始化PCB(KPROCESS)

    5 设定进程优先级

    6 初始化进程空间

    7 设置进程PID 

    8 如果父进程在Job中,此进程也加入到对应Job

     9 创建PEB

    10 将此进程加入到全局进程列表中 

    11 把当前进程handle加入到当前进程句柄表中

    12 设置进程创建时间并返回进程句柄

    如上即为Windows创建进程的基本过程,忽略了一些参数检测判断和Security检查等旁枝细节,以后的博客中会介绍到。

           

  • 相关阅读:
    算法练习-LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列
    竞赛 : 题目:基于深度学习的水果识别 设计 开题 技术
    uniapp IOS上架AppStore因打开相机、相册提示不明确被拒
    python统计单词出现次数 青少年编程电子学会python编程等级考试二级真题解析2022年3月
    【原创】win11完美搭建macos13实现IOS自动化测试环境
    Flume环境搭建
    2023上半年软考系统分析师科目一整理-02
    Java8新特性 Lambda表达式
    用python对美女内容采集,舞蹈区内容真热闹~
    算法的时间复杂度和空间复杂度
  • 原文地址:https://blog.csdn.net/cxsjabcabc/article/details/127668303