PoEdu - Windows阶段班 【Po学校】Lesson05 - 进程 -终止进程的正确方式 & 使用计数

  • 4种情况下终止进程
    • 1入口函数返回 (正常的线上方式)
      • 入口函数在返回时,确保以下几件事情已经完成:
        • a.主线程所创建的任何对象都已经被正确的销毁
        • b.操作系统会正确的释放线程的堆栈
        • c.将进程的取出代码设置成入口函数的返回值
        • d.递减内核对象的使用计数
    • 2本进程当中任意一个线程调用ExitProcess (非正常终止,强制结束进程,高风险)
      • 不应调用此函数来结束进程,当函数被调用 的时候,会结束进程,并将代码设置为uExtiCode.但纯种并未正确对事,会导致纯种无法正确被清理。
    • 3另外一个进程中的线程远程调用TermitateProcess (非正常终止,高风险)
      • 不应该用此函数来结束进程,此函数能够结束其他进程。异步函数。
    • 4进程的所有线程都自然死亡,这种情况很少见,只在理论中存在。
  • 使用计数
    • 创建一个进程后,会随之打开了两个内核对象,一个进程,一个主线程;
    • 先看“进程内核对象”的使用计数:CreateProcess函数实际上要设置进程内核对象的使用计数为2
    • CreateProcess会把进程内核对象计数设置为1,在入口函数返回时,会把进程内核对象计数减1;此时进程内核对象计数为0,可以说是完全消亡了。但这是理论上的逻辑,坑点在实际中:CreateProcess函数会在PROCESS_INFORMATION这个结构体中,使用第2次进程内核对象,因为这个结构体中,填充了进程内核句柄。
    • 退出代码:入口函数在返回退出时,把进程内核对象的使用计数减1,由2次变1次,此时当前PROCESS_INFORMATION结构体会保留退出代码,以方便父进程取用。
    • 正确的销毁一个进程,让系统回收之,需要关闭PROCESS_INFORMATION里面填充使用过的:HANDLE hProcess。
    • CloseHandle(PROCESS_INFORATION.hProcess);的意义在于,把使用计数清零。
    • 内核泄露只能通过重启操作系统来实现。所以其危害是严重的。

 

posted on 2017-06-06 02:26  zzdoit  阅读(256)  评论(0编辑  收藏  举报

导航