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会被立即重新启用,所以不准确。

Windows Internals 笔记——CreateProcess的更多相关文章

  1. Windows Internals 笔记——线程优先级

    1.每个线程都被赋予0(最低)~31(最高)的优先级数.当系统确定给哪个线程分配CPU时,它会首先查看优先级为31的线程,并以循环的方式进行调度.如果有优先级为31的线程可供调度,那么系统就会将CPU ...

  2. Windows Internals 笔记——线程调度

    1.线程内核对象中的CONTEXT反应了线程上一次执行时CPU寄存器的状态.大约每隔20ms,Windows都会查看所有当前存在的线程内核对象.Windows在可调度的线程内核对象中选择一个,并将上次 ...

  3. Windows Internals 笔记——进程的权限

    1.大多数用户都用一个管理员账户来登录Windows,在Vista之前,这样的登录会创建一个安全令牌.每当有代码试图使用一个受保护的安全资源时,操作系统就会出示这个令牌.从包括Windows资源管理器 ...

  4. Windows Internals 笔记——内核对象

    1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...

  5. Windows Internals 笔记——关联性

    1.默认情况下,Windows Vista在给线程分配处理器时,使用软关联.意思是如果其他因素都一样,系统将使线程在上一次运行的处理器上运行.让线程始终在同一个处理器上运行有助于重用仍在处理器高速缓存 ...

  6. Windows Internals 笔记——线程

    1.进程有两个组成部分,一个进程内核对象和一个地址空间.线程也有两个组成部分: 一个是线程的内核对象,操作系统用它管理线程.系统还用内核对象来存放线程统计信息的地方. 一个线程栈,用于维护线程执行时所 ...

  7. Windows Internals 笔记——作业

    1.Windows提供了一个作业内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么.创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制. 2.如果进 ...

  8. Windows Internals 笔记——进程

    1.一般将进程定义成一个正在运行的程序的一个实例,由以下两部分构成: 一个内核对象,操作系统用它来管理进程,内核对象也是系统保存进程统计信息的地方. 一个地址空间,其中包含所有可执行文件或DLL模块的 ...

  9. Windows Internals 笔记——字符和字符串处理

    1.自Windows NT起,Windows的所有版本都完全用Unicode来构建,调用Windows函数时,如果向它传入一个ANSI字符串,那么函数首先会把字符串转换为Unicode,再把结果传给操 ...

随机推荐

  1. SpringBoot整合swagger

    Swagger使用 Swagger有什么用? swagger是一个流行的API开发框架,这个框架以“开放API声明”(OpenAPI Specification,OAS)为基础, 对整个API的开发周 ...

  2. python抓取NBA现役球员基本信息数据并进行分析

    链接:http://china.nba.com/playerindex/ 所需获取JSON数据页面链接:http://china.nba.com/static/data/league/playerli ...

  3. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  4. bzoj5028小Z的加油店(线段树+差分)

    题意:维护支持以下两种操作的序列:1 l r询问a[l...r]的gcd,2 l r x把a[l...r]全部+x 题解:一道经典题.根据gcd(a,b)=gcd(a-b,b)以及区间加可知,这题可以 ...

  5. 第四十篇-private,public,protected的区别

    1.public: public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private: private表示私有,私有的意思就是除了class自己之外,任何人都不可 ...

  6. C++: sprintf浮点数精度控制;

    错误的写法: char buf[100]; int num = 10; sprintf(buf, "%.2f", num); ///这种做法是不对的, 按照压栈顺序, 在压入num ...

  7. Ajax与JSON共同使用的小实例

    实现的效果: 点击“点击”按钮,可以通过Ajax从服务器调过来相应的文档文件,而不需重新加载页面. 通过json可以将调过来的文档(String)转换为相应的json对象,从而对文档中数据进行操作. ...

  8. 应用调试(五)侵入式SWI

    目录 应用调试(五)侵入式SWI 场景应用 测试程序 修改APP的bin 修改SWI 获得当前进程的寄存器 测试运行 恢复代码 进程间内存拷贝 TODO 更多参考文献 title: 应用调试(五)侵入 ...

  9. freemarker和thymeleaf的使用样例

    最近需要对公司项目首页使用Java模板重做,以提高首屏加载速度和优化SEO. 在选择模板时发现freemarker和thymeleaf最为常用. 两者最大的区别在于语法,对性能方面未作测试,具体性能测 ...

  10. 069、Calico的默认连通性(2019-04-12 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7536746.html   Calico 跨主机连通性测试   root@host1:~# docker exec bbo ...