zoukankan      html  css  js  c++  java
  • Windows Internals 笔记——CreateProcess

    1.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1。然后系统为新进程的主线程创建一个线程内核对象(使其计数为1)。

    2.CreateProcess在进程完全初始化好之前就返回TRUE。这意味着操作系统加载程序尚未尝试定位所有必要的DLL。如果一个DLL找不到或者不能正确的初始化,进程就会终止。因为返回TRUE,所有父进程不会注意到任何初始化问题。

    3.CreateProcess的pszCommandLine参数期望我们传入的是一个非“常量字符串”的地址。在内部,CreateProcess实际上会修改我们传给它的命令行字符串,但在CreateProcess返回之前,它会将这个字符串还原为原来的形式。

    4.CreateProcess如果参数的可执行文件没有扩展名,就会默认是.exe,还会按照一下顺序搜索可执行文件:

    • 主调进程.exe文件所在的目录
    • 主调进程的当前目录
    • Windows系统目录
    • Windows目录
    • PATH环境变量中列出的目录

    5.在创建一个新进程时,系统会为进程内核对象和线程内核对象初始使用计数为1.然后就在CreateProcess返回之前,它会使用完全访问权限来打开进程对象和线程对象,这时每个对象的使用计数就变为2。这意味着想要释放进程对象,进程线程必须终止,而且父进程必须关闭对象的句柄。

    6.创建一个进程或线程内核对象时,此对象会被分配独一无二的、系统级别的ID编号。而且进程和线程分享同一个号码池,不可能有相同的ID。此外一个对象分配到的ID绝对不会是0。

    7.Windowsr任务管理器将进程ID 0与“System Idle Process”(系统空闲进程)关联,但是实际上并没有这样的东西,其目的是将其作为Idle线程的占位符,在没有别的线程正在运行时,系统就运行这个Idle进程。System Idle Process中的线程数量始终等于计算机的CPU数量。

    8.进程和线程ID会被系统立即重用,在保存使用时可能进程已经变成另外一个进程。

    9.只有在一个子进程生成的那一瞬间,才存在父子关系,到子进程开始执行代码之前的那一刻,Windows就已经不认为存在任何父子关系了。系统确实会记住每个进程的父进程ID,但是由于ID会被立即重新启用,所以不准确。

  • 相关阅读:
    读书笔记之: 操作系统概念(第6版)第三部分 存储管理2(文件系统接口, 文件系统实现)
    Padding 属性中参数的定义
    谷歌“抄袭门”:可能祸及价值660亿品牌形象
    最常用的20个ASP代码片段 上
    可定制的数据库备份和恢复程序
    最常用的20个ASP代码片段 下
    Google Ajax Search API的使用
    Ajax 中跨域问题的结决办法 [转]
    JAVA面试题汇总 一
    WebService的描述与注册、发布
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/8548033.html
Copyright © 2011-2022 走看看