• 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检查等旁枝细节,以后的博客中会介绍到。

           

  • 相关阅读:
    UE4 创建暂停和结束游戏UI
    【共享单车数据专题】共享单车数据分析的技术要点
    如何用Python获取网页指定内容
    Rest风格快速开发
    原生AJAX
    pytorch 学习(1)
    【移花接木】Maven项目结构调整解决方案
    广工电工与电子技术实验报告-8路彩灯循环控制电路
    (ELK安装part1)Elasticsearch8.4.0集群安装
    M系列 Mac使用Homebrew下载配置git和连接GitHub
  • 原文地址:https://blog.csdn.net/cxsjabcabc/article/details/127668303