Windows内核之进程的终止和子进程

1 进程终止的方法:

<1>主线程的进入点函数返回(最好使用这个方法)

<2>进程中的一个线程调用ExitProcesss函数(应该避免使用这种方法)。

<3>另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。

<4>进程中的所有线程自行终止运行(这种情况几乎从未发生)。

1.1  主线程进入点函数返回

始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止运行。这是保证所有线程资源能够得到正确清除的唯一办法。

<1>  C++对象将能够使用它们的析构函数得以释放

<2> 操作系统能够正确的释放该线程使用的堆栈内存

<3> 系统将进程的退出代码设置为进入点函数的返回值

<4> 系统将内核对象的计数值减去1

1.2 调用ExitProcess函数

voidExitProcess(uExitCode)

跟主线程的进入点函数返回相比,它就不那么安全,不能保证资源被清理。

通过调用ExitProcess函数,C++/C运行期启动代码能够确保主线程从它的进入点函数返回时,进程便终止运行,而不管进程中是否还有其他线程在运行。

如果在进入点函数中调用ExitThread,那么主线程就会停止运行,但是如果进程中如果还有其他线程的话,进程便不会终止。

ExitProcess以及ExitThread能保证操作系统资源在函数调用时被清除,但是不能保证C/C++运行时资源被正确的清除,所以最好还是不要调用这些资源。

在前面也介绍过当主线程的进入点函数返回的时候,C/C++运行时会调用运行时的exit函数,exit函数会完成下面操作

<1>调用_onexit函数的调用而注册的人任何函数

<2>为所有的全局和静态的C++对象调用析构函数

<3>调用系统的ExitProcess函数,将nMainRetVal传递给它。使得操作系统能够撤销进程并设置它的exit代码。

1.3 调用TerminateProcess 函数

BOOL TerminateProcess(HANDLE hProcess,UINTnExitCode)

这个函数通知进程内所有线程终止,当所有线程终止时,进程也会终止了,但是它不会告诉进程内相关联的DLL这个进程将要被终止。它做的事情:

<1>所有打开的句柄被关闭

<2>所有的线程会被终止

<3>进程对象的状态变为终止的,满足所有等待进程结束的线程

<4>进程中所有线程对象的状态变为终止,满足所有等待线程结束的线程

<5>进程的终止状态由STILL_ACTIVE变为了进程的返回代码

这个函数是异步的,它告诉操作系统,你要终止某个进程,但是当函数返回的时候,你无法保证进程是否已经被杀死,如果想要确切知道进程是否被杀死,可以使用WaitForSingleObject函数。

2   进程终止时的情况

<1>进程中所有剩余线程将被终止

<2>进程中指定的用户对象,GDI对象被释放,内核对象被关闭

<3>内核对象的状态编程收到通知的状态

<4>进程的退出代码由STILL_ACTIVE 变为ExitProcess或者TerminateProcess传递的的退出代码

<5>进程内核对象计数减去1

可以通过函数 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD lpExitCode)来查找进程的退出代码,如果代码是STILL_ACTIVE表示的是进程还没终止,如果不是这个,就说明进程已经被终止。

3   子进程

程序中要实现一段功能一共有3种方法:

<1>调用函数

<2>开辟新线程

<3>开辟新进程

3.1 调用函数

调用函数时非常常见的,但是它的缺点是因为在同一个线程中,所以必须等待此函数执行完毕,才能执行后面的代码

3.2 开辟新线程

这样能够在新线程执行的时候,同时执行其他线程的代码,但是这样的缺点是不同线程之间需要交流数据时候,会产生同步的问题。

3.3 开辟子进程

这样有点是既可以保护数据,可以同步执行,也可以等待新进程执行完毕再去执行其他进程的代码。缺点是开辟新进程,会造成地址空间的浪费。

Windows内核之进程的终止和子进程

时间: 2024-07-30 03:02:39

Windows内核之进程的终止和子进程的相关文章

Windows内核之进程基本含义以及进程的创建

进程 1 进程的含义: 1.1   一个是操作系统用来管理进程的内核对象. 内核对象也是系统用来存放关于进程的统计信息的地方. 1.2   还有一个是地址空间,它包括全部可运行模块或DL L 模块的代码和数据.它还包括动态内存分配的空间. 如线程堆栈和堆分配空间. 2 操作系统启动应用程序的步骤 2.1 调用C/c++执行时的启动函数 启动函数总共4种,WinMainCRTStartup,wWinMainCRTStartup,mainCRTStartup,wmainCRTStartup. 启动函

Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具

今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内核活动-进程/线程创建和终止,上下文转换,文件系统I/O,寄存器,网络活动以及DLL加载/卸载等等.除此之外,所有的内核事件可以直接以AMQP消息.Elasticsearch簇或标准输出流的形式提供给用户.大家可以使用filaments(一款轻量级Python模块)来根据自己的需要去扩展Fibrat

Windows内核原理研究——进程创建

进程可能是用户接触的Windows系统中最多的部分了,对于Windows系统而言,进程是一个独立的地址空间可以为线程提供一个独立的执行环境, 也就是说 进程= 独立的地址空间 一个进程内核对象 线程= 一个线程自己的栈 一个线程内核对象 当然这个栈是在进程的地址空间中.那么,也就是说线程才是真正“干活”的东西,进程只不过是一些资源的集合而已.只能说是“原材料”. 在我学习Windows内核以前一直觉得进程的种种特性很神奇,比如说地址空间独立是怎么实现的呢?我们的电脑使用的都是同一块内存怎么能实现

Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止

就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首先在windows的服务中确定mysql服务是否开启, 如果你在windows的服务中找不到mysql的服务,这时你需要安装mysql服务. 安装过程可以使用命令行的形式,输入下面的命令,5.1之后的版本的命令:>> mysqld.exe -install(这里我在path设置的MySQL安装文件

Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止

Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止 解决办法: 将关联的sql server(实例) 服务停止. 然后启动sql server代理 服务.

Windows 无法启动MongoDB服务 错误1067:进程意外终止

转自:http://www.cnblogs.com/xiaoit/p/3872790.html 1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌似不行) mongod.exe --config E:\ruanjian\MongoDB\mongod.cfg --remove mongod.exe --config E:\ruanjian\Mongo

C++windows内核编程笔记day13 进程、线程与信号量

Windows进程 进程是一个容器,包含程序执行需要的代码.数据.资源等信息, windows进程的特点: 每个进程都有自己的ID号 每个进程都有自己的地址空间,进程之间无法访问对方的地址空间. 每个进程都有自己的安全属性 每个进程至少包含一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 示例: char

windows 内核下获取进程路径

windows 内核下获取进程路径 思路:1):在EPROCESS结构中获取.此时要用到一个导出函数:PsGetProcessImageFileName,申明如下: NTSYSAPI UCHAR *    PsGetProcessImageFileName(    __in PEPROCESS Process    ); 此函数获取的是一个简单的进程名,并不是绝对路径. 2):ZwQueryInformationProcess. 要想获取进程的绝对路径,可用一个未公开的函数:ZwQueryInf

windows内核代码之进程操作

[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即可.标准方法可以使用ZwQuerySystemInformation函数.使用SystemProcessInformation功能号. 另外也有很多种枚举进程的方法比如找到EPROCESS结构进行枚举的.(CPU结构体 KPCR)等等.不过兼容性都是不太好.另一种方法是枚举句柄表 PspCidTab