什么是进程
一个正在运行的程序实例。它由两部分组成:
一个内核对象,操作系统用内核对象管理进程,内核对象是保存进程统计信息的地方。
一个地址空间,它包含所有exe,dll模块的代码和数据,还有动态内存分配,比如线程堆栈和堆的分配。
一个进程内的所有线程,都在进程的地址空间中同时指向代码。线程有一组CPU寄存器和它的堆栈。
当系统创建一个进程的时候,会自动为进程创建第一个线程,即主线程(main函数开始)。当线程执行完代码,线程就结束,主线程结束,系统会销毁进程收回地址空间。
系统为线程的运行分配CPU时间,系统内核调度管理线程。
进程命令行
系统在春感觉一个进程时,会传一个命令行给它。
进程的环境变量
每个进程都有一个与它关联的环境块,是在进程地址空间里分配的一块内存,其中包含键值对的字符串。
GetCurrentDirectory 进程所在的硬盘目录;
创建一个进程内核对象,来管理每个进程
如何利用与进程关联的内核对象来操纵该进程
进程的特性(属性),如何查询和更改这些特性
如何创建新进程
终止进程
四种终止进程的方式:
- 主线程的入口函数返回,即main函数返回。强烈推荐这种方式。
- 进程中的一个线程调用ExitProcess函数。避免
- 别的进程的线程调用TerminateProcess函数,避免
- 进程中所有线程都自然死亡。几乎从来不会发生。除非控制台程序
主线程的入口函数返回
只有这样,才能保证主线程的所有资源都被正确清理。
调用ExitProcess函数
ExitProcess和ExitThread函数,就操作系统而言,这样做没有什么问题,进程和线程的所有操作系统资源都会被正确清理。 不过,立即结束,C++运行库也许不能执行清理工作。也许会造成内存泄漏和其他资源泄漏。不能将内存数据flush刷到磁盘上。但是进程结束后,泄漏的内存资源都会被操作系统收回。
别的进程的线程调用TerminateProcess函数,避免
虽然进程没有机会执行清理工作。但操作系统汇总进程终止后,彻底清理。确保不会泄漏任何操作系统资源。这意味着进程使用的所有内存都会被释放。所有打开的文件都会被关闭,所有内核对象的使用计数都将递减。所有用户对象和GDI对象都会被销毁。
一旦进程终止,不管怎么终止的,系统都会保证不留下它的任何部分。进程在终止后绝对不会泄漏任何东西。
TerminateProcess函数是异步的,函数返回时,只代表已经告诉系统,不代表进程已经被系统终止,如果要等待需要调用WaitForSingleObject。
子进程
Wondows提供了:
动态数据交换DDE,OLE,管道,邮件槽等方式,在不同进程间传递数据。
用GetExitCodeProcess得到子进程的退出码。
独立运行的子进程
这意味着,父进程不再与子进程通信。父进程不用关心它创建的进程,等待它结束后再运行。、
为了断绝关系,父进程必须调用CloseHandle来关闭新进程及其主线程的句柄。:
BOOL fSuccess = CreateProcess(... , &pi);
if(fSuccess ){
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
管理员以标准用户权限运行时
Windows的提权只能在进程边界上提升。
自动提升权限
UAC如何判断该采取什么操作?
应用程序的可自行文件,嵌入了一种特殊资源:RT_MANIFEST,清单文件,lecel有三个值。.manifest文件。
手动提升权限,使用ShellExcuteEx函数创建进程提权。
令牌
GetTokenInfomation函数获取令牌。