为什么对TerminateProcess断点不起作用

使用AD+处理崩溃和挂起(2) 更多细节 没有安装调试符号的情况在没有安装调试符号的情况下,我们运行ADPlus.vbs,看看有什么结果。运行下列命令,它将导致对Inetinfo.exe和其他Out-Of-Process (OOP)应用程序的Full-Memory Dumps:cscript.exe adplus.vbs -hang -iisCScript将会输出:Microsoft (R) Windows Script Hos 阅读详情

最初发表在QQ空间,全文见 为什么对TerminateProcess断点不起作用

在内核态下巧设用户模块断点介绍了在内核态下设置用户模块的断点,结尾处留了一个问号,为了简化问题,这次直接在用户态下调试。使用windbg 打开一个notepad程序。设置断点。

0:000> bl
0 e 77e616b8     0001 (0001)  0:**** kernel32!TerminateProcess
0:000> g

关闭notepad,正如在内核态下巧设用户模块断点描述的,期望的断点没有起到作用,windbg显示如下信息。
eax=00000000 ebx=00000000 ecx=ffffffff edx=00000000 esi=77f7663e edi=00000000
eip=7ffe0304 esp=0006fdf8 ebp=0006fef0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000202
SharedUserData!SystemCallStub+0x4:
7ffe0304 c3               ret

正常的解释会是这样,TerminateProcess不会使用在进程的正常退出过程中。看看MSDN的解释。

The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.

TerminateProcess initiates termination and returns immediately. This stops execution of all threads within the process and requests cancellation of all pending I/O. The terminated process cannot exit until all pending I/O has been completed or canceled.

A process cannot prevent itself from being terminated.

也就是说进程的正常退出一般使用ExitProcess。如果我没有做下面的动作的话,这个解释应该足够了。可惜人生总是充满意外,
0:000> kv
ChildEBP RetAddr  Args to Child             
0006fdf4 77f7664a 77e798ec ffffffff 00000000 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
0006fdf8 77e798ec ffffffff 00000000 77e7ad86 ntdll!NtTerminateProcess+0xc (FPO: [2,0,0])
0006fef0 77e7990f 00000000 77e8f3b0 ffffffff kernel32!_ExitProcess+0x57 (FPO: [Non-Fpo])
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!TerminateProcess (FPO: [Non-Fpo])
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x2f (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
看看发生了什么?

0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!TerminateProcess (FPO: [Non-Fpo])
是多么醒目的出现在call stack里。这里一定有什么地方出现问题,

测试环境是xp sp1的虚拟机,仔细观察这个stack,可以看出有些问题。

1. 为什么是 kernel32!TerminateProcess , 而不是kernel32!TerminateProcess + 0x??,这不合常理。

解决问题之前,做一些尝试,

0:000> uf kernel32!terminateprocess
kernel32!TerminateProcess:
77e616b8 837c240400       cmp     dword ptr [esp+0x4],0x0
77e616bd 7418             jz      kernel32!TerminateProcess+0x7 (77e616d7)

kernel32!TerminateProcess+0x10:
77e616bf ff742408         push    dword ptr [esp+0x8]
77e616c3 ff742408         push    dword ptr [esp+0x8]
77e616c7 ff15f813e677 call dword ptr [kernel32!_imp__NtTerminateProcess (77e613f8)]
77e616cd 85c0             test    eax,eax
77e616cf 7c0f             jl      kernel32!TerminateProcess+0x27 (77e616e0)

kernel32!TerminateProcess+0x22:
77e616d1 33c0             xor     eax,eax
77e616d3 40               inc     eax

kernel32!TerminateProcess+0x2f:
77e616d4 c20800           ret     0x8

kernel32!TerminateProcess+0x7:
77e616d7 6a06             push    0x6
77e616d9 e8d28c0100       call    kernel32!SetLastError (77e7a3b0)
77e616de eb06             jmp     kernel32!TerminateProcess+0x2d (77e616e6)

kernel32!TerminateProcess+0x27:
77e616e0 50               push    eax
77e616e1 e8808d0100       call    kernel32!BaseSetLastNTError (77e7a466)

kernel32!TerminateProcess+0x2d:
77e616e6 33c0             xor     eax,eax
77e616e8 ebea             jmp     kernel32!TerminateProcess+0x2f (77e616d4)

先看看这个函数,幸运的是,不长,而且很简单。有个疑惑是为什么+0x7的地方竟然在+0x10,+0x22之后,这顺序很奇怪。uf是怎么整理函数内容的?

这里引出第2个问题,

2. 上层函数kernel32!_ExitProcess+0x57 的返回地址77e7990f ,是哪里?并不在前面看到的函数范围之内。

下面需要怎么做?当然还是断点。这次从下层的函数着手,重新启动,设置断点。

0:000> bl
0 e 77c379c2     0001 (0001)  0:**** msvcrt!__crtExitProcess+0x29

关闭notepad,这次断点命中了,

eax=00000000 ebx=00000000 ecx=77e7b5e1 edx=00000000 esi=00000001 edi=77e7ad86
eip=77c379c2 esp=0006ff0c ebp=0006ffc0 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
msvcrt!__crtExitProcess+0x29:
77c379c2 ff151412c177 call dword ptr [msvcrt!_imp__ExitProcess (77c11214)]{kernel32!ExitProcess (77e798fd)} ds:0023:77c11214=77e798fd

看stack,一切正常。

0:000> kv
ChildEBP RetAddr  Args to Child             
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x29 (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
0:000> t
eax=00000000 ebx=00000000 ecx=77e7b5e1 edx=00000000 esi=00000001 edi=77e7ad86
eip=77e798fd esp=0006ff08 ebp=0006ffc0 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
kernel32!ExitProcess:
77e798fd 55               push    ebp
0:000> kv
ChildEBP RetAddr  Args to Child             
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!ExitProcess (FPO: [Non-Fpo])
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x2f (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])

看出问题了没有?此时的stack中显示的是kernel32!ExitProcess 而不是kernel32!TerminateProcess, 那为什么最后的结果显示会变了?

0:000> uf kernel32!exitprocess
kernel32!TerminateProcess:
77e616b8 837c240400       cmp     dword ptr [esp+0x4],0x0
77e616bd 7418             jz      kernel32!TerminateProcess+0x7 (77e616d7)

kernel32!TerminateProcess+0x10:
77e616bf ff742408         push    dword ptr [esp+0x8]
77e616c3 ff742408         push    dword ptr [esp+0x8]
77e616c7 ff15f813e677 call dword ptr [kernel32!_imp__NtTerminateProcess (77e613f8)]
77e616cd 85c0             test    eax,eax
77e616cf 7c0f             jl      kernel32!TerminateProcess+0x27 (77e616e0)

kernel32!TerminateProcess+0x22:
77e616d1 33c0             xor     eax,eax
77e616d3 40               inc     eax

kernel32!TerminateProcess+0x2f:
77e616d4 c20800           ret     0x8

kernel32!TerminateProcess+0x7:
77e616d7 6a06             push    0x6
77e616d9 e8d28c0100       call    kernel32!SetLastError (77e7a3b0)
77e616de eb06             jmp     kernel32!TerminateProcess+0x2d (77e616e6)

kernel32!TerminateProcess+0x27:
77e616e0 50               push    eax
77e616e1 e8808d0100       call    kernel32!BaseSetLastNTError (77e7a466)

kernel32!TerminateProcess+0x2d:
77e616e6 33c0             xor     eax,eax
77e616e8 ebea             jmp     kernel32!TerminateProcess+0x2f (77e616d4)

kernel32!ExitProcess:
77e798fd 55               push    ebp
77e798fe 8bec             mov     ebp,esp
77e79900 6aff             push    0xff
77e79902 68b0f3e877       push    0x77e8f3b0
77e79907 ff7508           push    dword ptr [ebp+0x8]
77e7990a e886ffffff       call    kernel32!_ExitProcess (77e79895)
77e7990f e9a47dfeff       jmp     kernel32!TerminateProcess (77e616b8)

观看这段代码,竟然开头是kernel32!TerminateProcess的代码,注意到这应该是种特殊的代码实现,使得kernel32!ExitProcess 和kernel32!TerminateProcess合2为1,结尾处是一条jmp指令,很有意思的地方。

单步执行到下面

0:000> p
eax=00000000 ebx=00000000 ecx=77e7b5e1 edx=00000000 esi=00000001 edi=77e7ad86
eip=77e7990a esp=0006fef8 ebp=0006ff04 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
kernel32!ExitProcess+0xd:
77e7990a e886ffffff       call    kernel32!_ExitProcess (77e79895)

此时的stack是正确的。

0:000> kv
ChildEBP RetAddr  Args to Child             
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!ExitProcess+0xd (FPO: [Non-Fpo])
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x2f (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])

继续跟进,
0:000> t
eax=00000000 ebx=00000000 ecx=77e7b5e1 edx=00000000 esi=00000001 edi=77e7ad86
eip=77e79895 esp=0006fef4 ebp=0006ff04 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
kernel32!_ExitProcess:
77e79895 68cc000000       push    0xcc

发现问题。
0:000> kv
ChildEBP RetAddr  Args to Child             
0006fef0 77e7990f 00000000 77e8f3b0 ffffffff kernel32!_ExitProcess (FPO: [Non-Fpo])
0006ff04 77c379c8 00000000 77c37ad9 00000000 kernel32!TerminateProcess (FPO: [Non-Fpo])
0006ff0c 77c37ad9 00000000 00000000 77c37aea msvcrt!__crtExitProcess+0x2f (FPO: [1,0,0])
0006ff18 77c37aea 00000000 00000000 00000000 msvcrt!_cinit+0xe4 (FPO: [2,0,1])
0006ff28 01006c65 00000000 70a71a29 80000002 msvcrt!exit+0xe (FPO: [1,0,1])
0006ffc0 77e814c7 70a71a29 80000002 7ffdf000 notepad!WinMainCRTStartup+0x185 (FPO: [Non-Fpo])
0006fff0 00000000 01006ae0 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])

看上层的返回地址77e7990f ,这实际上应该是kernel32!ExitProcess+0x12,由于这边有条特殊的指令JMP,windbg把它认为了是某个函数的位置,相当于是个函数调用,因此有了这个美丽的误会。实际上,这个实验再次证明了MSDN上的理论,程序的正常退出确实没有调用kernel32!TerminateProcess 。惊讶

0:000> u kernel32!exitprocess + 12
kernel32!TerminateProcess:
77e7990f e9a47dfeff       jmp     kernel32!TerminateProcess (77e616b8)

尝试uf一下这个位置,想想会发生什么?

CreateProcess TerminateProcess 创建与终止进程 demo 用CreateProcess启动MyEclipse,5秒后终止该进程。 IDE:VS2010 #include #include #include using namespace std; bool killProcess(PROCESS_INFORMATION& processInfo) { DWORD processId = processInfo.dwProces 阅读详情

相关推荐

深入理解API钩子技术:使用EasyHook拦截TerminateProcess函数

API钩子技术,又称为钩子(Hook),是一种程序化技术,它能够在调用API(应用程序编程接口)函数之前或之后介入,对API的调用进行拦截、监视或修改。这种技术常用于插件架构、安全监控、自动化测试、日志记录等多种场景。EasyHook 是一款开源的Windows钩子库,由Anders Hejlsberg (Delphi、C#语言的缔造者) 和他人合作开发。它的核心目的是为开发者提供一个简单而强大的平台,用于在本地和远程进程之间进行方法钩子(Hook)操作,实现对系统级或者应用程序级行为的控制和修改。

weixin_42587866的博客 815

VS工程编译提示找不到“外部符号 __imp__xxx”的问题解决办法

error LNK2001: 无法解析的外部符号 __imp__strdup

u013705518的博客 2344

hfss仿真软件入门教程

hfss仿真软件入门教程 1.模型建立 1.1在project种选择insert hfss design 1.2.在hfss-》solution type 中选择modal 1.3.在moderler-》中选择units 设置单温为mm 1.4进行画图操作,这里为提高效率直接导入一个已经画好的cad图。使用modeler-》import 2.设置端口 2.1在更改模型中的材料 选择需要更改材料...

xunshui2007的博客 3万+

TerminateProcess 杀进程

今天又掉坑里了。用“TerminateProcess”杀某个控制台进程,结果进程杀死了,应用程序还停留在状态栏,任务管理器中的“进程”已找不到被杀死的进程,“应用程序”里还能看到。最后发现是“system("pause");”惹的祸,这个玩意起了一个系统进程。以后慎用。   bool KillProgress(const DWORD& _dwId) { HANDLE hProc...

qq_32250025的博客 3286

SpringBoot文件上传实战:MultipartFile重复读取的3种方法(附避坑指南)

本文详细介绍了SpringBoot中处理MultipartFile重复读取的3种实用方法,包括字节数组缓存法、临时文件法和流重置法,并提供了避坑指南和性能优化技巧。特别适合需要多次读取上传文件内容的开发者,帮助解决InputStream流只能读取一次的问题。

weixin_28710999的博客 398

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

关于 TerminateProcess函数 在c++的进程中的学习而发现VS2008的编译安全问题

关于TerminateProcess函数在c++的进程中的学习 之前一段时间自己的机器总是有一些用不到的进程随机器启动,查了启动项没有发现(不过现在已经知道是在“服务”里面)。而碰巧刚学了c++的windows程序设计,就想自己写个程序,将自己每次相关掉的进程名称都写进去,每次运行下就可以关掉。 看了下书上的代码,已经有了差不多的代码了,一个是列出进程的列表...

weixin_30414305的博客 149

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

常用的Win32函数清单

1、限制程序功能函数EnableMenuItem 允许、禁止或变灰指定的菜单条目EnableWindow允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)2、对话框函数CreateDialog 从资源模板建立一非模态对话窗CreateDialogParam 从资源模板建立一非模态对话窗CreateDialogIndirect 从内存模板建立一非模态对话窗CreateDialogI...

weixin_30918415的博客 297

数字通信:信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码

在通信系统中,信息的传输通常需要经过一系列的处理步骤,确保数据可以在信道中高效且可靠地传输。以下是信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码的具体含义及其常见技术的解释。

weixin_44012667的博客 4804

破译丰田BEAN总线之谜

我对CAN的深入了解并不是从CAN本身开始的,而是起源于丰田公司自主研发的BEAN总线。由于BEAN总线协议并不是公开的,而是一种技术机密,所以当丰田车不在使用BEAN总线两年多后的今天,虽然这里还不敢公开技术细节,但回想起当年的作品,随便写写也算对自己的努力有所交代。   南方都市报惠州版曾经报道过一则新闻,说的是丰田皇冠车被盗率非常高。其实两年前就已经知道了皇冠车的防盗系数很低,所以当时的首

粤嵌 5262

TerminateProcess函数简单使用示例

TerminateProcess 顾名思义,就是终止进程的意思。 是WindowsAPI的函数, 示例代码如下: // Demo.cpp : 定义控制台应用程序的入口点。 //终止进程Demo #include "stdafx.h" using namespace std; //@param:dwpid:指定需要关闭的进程pid int CloseProcess(DWORD dwpi...

MusicMan 9182

初识YUV,实战NV21格式数据转换为Bitmap

初识YUV,并使用YUV数据生成Bitmap图像一、初识YUV二、采样方式2.1、YUV 4:4:42.2、YUV 4:2:22.2、YUV 4:2:2 一、初识YUV 说到YUV我们就必须先从RGB说起了,如下图所示,请各位把每个色块当成一个像素点。通常一个像素点由RGB(Alpha我们先不考虑)三原色组成。 如下图中第一个像素点,其RGB值分别为(236,102,93),而这三个值就组成了我们看到的 红色 。 然而上图中除了RGB值外,我还标出了每个像素点的YUV的值,YUV的值是怎么来的呢?直接给公

乐翁龙 7125

TerminateProcess 和 CreateProcess

1.使用ExitProcess()结束进程   进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数的原型为:

梦想庚远 1765

3.嵌入式控制器EC学习,源码框架(60/64端口)(一)

服务函数剖析 上一篇讲到while循环会一直查询十六个标志位是否满足要求,一旦其中某个标志位为1时,程序将会执行相应的服务函数,而执行服务函数是通过函数指针(service_table[ _R1 ])();来实现的。接下来我们分别来看看这十六个服务函数分别包含了哪些内容。 16个函数的函数名如下: const FUNCT_PTR_V_V code service_table[16] = { // Hi-Level Service Service_PCI, // Host 6

qq_30135687的博客 4159

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用OpenProcess、GetExitCodeProcess和TerminateProcess关闭进程

如果需要结束其他进程的执行,可以使用TerminateProcess函数。 BOOL TermintaeProcess(HANDLE hProcess,UINT uExitCode ); hProcess是要结束的目标进程的句柄,uExitCode指定目标进程的退出代码,可以使用GetExitCodeProcess取得一个进程的退出代码。   对于一个已经存在的进程,只能使用OpenPro...

韩保红的代码库博客——记录我的学习历程 1284

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TerminateProcess与OpenProcessToken

TerminateProcess与OpenProcessToken

863

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TerminateProcess 终止|杀死其它进程

这个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程清理的时间,系统会马上终止(杀死)这个进程的所有线程,致使进程终止。在使用此函数前我们必须要调用OpenProcess函数来获得我们要终止(杀死)进程的句柄,并且要获得进程的PROCESS_TERMINATE权限。 函数原型: BOOL TerminateProcess(HANDLE hProcess,UINT uExi

wuqiyinglang的专栏 3725

OpenProcess、GetExitCodeProcess、TerminateProcess

//声明: {返回进程的句柄} OpenProcess( dwDesiredAccess: DWORD; {訪问选项} bInheritHandle: BOOL; {是否能继承; True 表示能用 CreateProcess 继承句柄创建新进程} dwProcessId: DWORD {指定进程 ID} ): THandle; ...

aoe41606的博客 422

WindowsAPI详解——TerminateProcess 终止|杀死其它进程

WindowsAPI详解——TerminateProcess 终止|杀死其它进程 - [VC++编程] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://www.blogbus.com/flyxxtt-logs/43973152.html       这个函数可以用来终止或者说杀死一个进程,它不会留给进程及其所有线程清理的时间,系统会马上

jfkidear的专栏 4万+

Windows API 25篇 TerminateProcess

导语:结束一个进程的方法通常有:exit(), ExitProcess, TerminateProcess. 通常一个进程在正常情况下结束的话,系统会调用 ExitProcess函数结束进程,但有时候想强行杀掉一个进程的话就必须调用TerminateProcess函数了,TerminateProcess强行关掉一个进程后,并没有做内存对象资源的清理,这样有时候会导致内存泄漏,他和Exit...

399

Win32 笔记 | TerminateProcess函数

Windows API 学习笔记,进程的结束:TerminateProcess

JUST FOR FUN, CALM DOWN 623

TerminateProcess

想在当前进程中终止另一个进程,可以使用这个TerminateProcess函数。 This function terminates the specified process and all of its threads. BOOL TerminateProcess( HANDLE hProcess, DWORD uExitCode); Parameters hProcess[in]

李金彦 1985

APIHOOK之拦截TerminateProcess

用SetWindowsHooKEx加载修改进程IAT的DLL实现OpenProcess拦截,导致Explorer或taskmgr出错? [ 来源:ITWENKU 时间:2006-11-16 17:52:10 | 浏览:1人次 ]

sanshao27的专栏 2618

ExitProcess与TerminateProcess函数

进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常推出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数即可在进程中的某个线程中使用,并将立即终止本进程的运行。ExitProce

ghevinn欢迎您光临 1896

TerminateProcess实现关闭任意程序

#include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, ...

1340
上一篇: 实战调试IE8
下一篇: 理解UnhandledExceptionFilter
招RD和QA
博客等级 码龄26年 40粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值