Windows-核心编程-04-进程详解

本文详细介绍了Windows操作系统中的进程概念,包括进程的定义、创建进程的步骤、CreateProcess函数的参数解析、进程的环境变量、进程的终止方式,以及进程内核对象和进程本身的区别。重点讨论了如何使用CreateProcess创建进程,强调了进程安全性和权限提升的重要性。
摘要由CSDN通过智能技术生成

什么是进程

今天我讲的是进程. 那么什么是进程呢. QQ.exe打开运行后. 会在系统中创建一个QQ进程. 打开了QQ音乐后. 任务管理器中会多出一个QQMusic.exe. 如下图:



一般将进程定义成一个正在运行的程序的一个实例,它由以下两个组件构成: 

----> 一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计

信息的地 方。 

---->一个地址空间,其中包含所有执行体(executable )或DLL模块的代码和数据。此外, 它还包含动态内存分配,比如线程堆栈和堆的分配。

进程是有“惰性”的。进程要做任何事情,都必须让一个线程在它的上下文中运行。该线 程要执行进程地址空间包含的代码。事实上,一个进程可以有多个线程,所有线程都在进程的 地址空间中“同时”执行代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。 每个进程至少要有一个线程执行进程地址空间包含的代码。一个进程创建的时候,系统会自动创建它的第一个线程---主线程.一个进程可以有很多个线程, 如果没有线程要执行进程地址空间包含的代码,进程就失去了继 续存在的理由。所以,系统会自动销毁进程及其地址空间.

为了让进程中所有的线程运行, CPU会为每个线程分配一定的时间片.而之间切换线程的时间人是察觉不到的. 就好似所有的线程都在一起运行一样.

用Visual Studi来创建一个C++项目时,IDE会设置各种链接器开关,使链接器将子系统的正确类型嵌入最终生成的执行体(俗称的.exe格式)文件.

可执行exe文件属于PE文件的一种. 举个例子. 在打开QQ这个可执行文件后. 系统会将可执行文件中对这段程序所需要的变量和代码的描述来创建一个进程, 并且根据exe文件的导入表数据来导入DLL. 附上图.

 

专门的PE文件查看器

在这里稍微深入点. 

PE文件里有块区域是”节表”. 描述的是程序的数据和代码. 不多说, 附上图:





所谓的rsrc. 顾名思义. 描述的是PE文件的资源.

有兴趣的朋友, 我这有个PE文件的资料, 附上链接.

http://blog.csdn.net/xuexingyoulemei/article/details/9073837 

在打开可执行文件后. 统将执行体文件的映像加载到进程的地址空间中。例如,假如系统打开执行体文件,并将它的内容加载到地址0x00400000.

一个新进程在创建时,一个命令行会传给它。这个命令行几乎总是非空的;至少,用于创建新 进程的执行体文件的名称是命令行上的第一个标记(token )。不过,在后面讨论CreateProcess 函数的时候,你会知道进程能接收只由一个字符构成的命令行,这个字符就是用于终止字符串的0 。


如何创建进程

那么如何创建进程呢? 我们要用到 CreateProcess

BOOL CreateProcess

  LPCTSTR lpApplicationName, 

  LPTSTR pszCommandLine, 

  LPSECURITY_ATTRIBUTES lpProcessAttributes, 

  LPSECURITY_ATTRIBUTES lpThreadAttributes, 

  BOOL bInheritHandles, 

  DWORD dwCreationFlags, 

  LPCTSTR lpCurrentDirectory,

  LPSTARTUPINFO lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

); .

正如我在前面所说的. 在这里我再补充一些. 一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1。进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构——可以把进程内核对象想象成由进程统计信息构成的一个小型数据结构。然后,系统为新进程创建一个虚拟地址空间,并将执行体文件(和所有必要的DLL )的代码及数据加载到进程的地址空间。

然后,系统为新进程的主线程创建一个线程内核对象(使用计数为1)。和进程内核对象一样, 线程内核对象也是一个小型数据结构,操作系统用它来管理这个线程。这个主线程一开始就会 执行由链接器设为应用程序入口的C/C++ 运行时启动例程,并最终调用你的WinMain , wWinMain ,main或wmain 函数。如果系统成功创建了新进程和主线程,CreateProcess将返回 TRUE 。 

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

CreateProcess的参数

现在讨论下CreateProce

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值