ID与句柄

如果我们成功创建一个进程,CreateProcess函数会给我们返回一个结构体,包括四个数

据:进程编号(ID)、进程句柄、线程编号(ID)、线程句柄.

进程ID其实我们早见过了,通常我们称之为PID



句柄每一个进程都有一张自己的私有的表,而操作系统也有一份句柄表,我们称为全局句柄表,这张表存储着私有的内核对象.

系统句柄表



PID我们就可以理解为全局句柄表中的一个索引,那么PID和句柄的区别就很容易看出来了,PID是全局的,在任何进程中都有意义,都可以使用,而句柄则是句柄的、私有的;PID是唯一的,绝对不可能出现重复的存在,但是当进程消失,那么这个PID就有可能会分给另一个进程。(PID不是句柄,但是可以通过PID获取得到全局句柄表中对应的句柄)

TerminateProcess函数

BOOL TerminateProcess(
HANDLE hProcess, // handle to the process 句柄
UINT uExitCode // exit code for the process 退出代码
;

1.创建一个进程A



2.使用B进程来结束A



TerminateProcess函数是用来终止进程的,具体的可以参考MSDN Library,在这里我们很清楚的可以看见终止

进程失败了,这个错误编号的意思就是句柄无效,那么就论证了句柄是私有的,其他进程无法根据这个句柄来

终止进程,但是我们想要真正的关闭这个进程,那就需要借助PID来获取句柄了,具体细节如下。

openProcess

Opens an existing local process object.
HANDLE WINAPI OpenProcess(
DWORD dwDesiredAccess,//打开进程的的权限问题 access flag 你希望的访问权限
BOOL bInheritHandle,//允不允许子进程继承呢
DWORD dwProcessId //全局PID 进程ID
);

我通过PID打开进程(OpenProcess函数),拥有所有权,不继承句柄表当前OpenProess函数执行完之后,我就获得一个句柄,通过这个句柄我就可以终止进程

HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 0x524);
if(!TerminateProcess(hProcess, 0)) {
printf("终止进程失败:%d \n", GetLastError());
}

以挂起的形式创建进程

Creates a new process and its primary thread. The new process runs in the security context of the calling process.

创建一个新进程和它的主要线程。这个新进程跑再一个安全正在调用的进程上下文中

第六个参数DWORD dwCreationFlags

BOOL WINAPI CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,//创建一个新的控制台
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

当我们创建一个控制台进程时,会发现子进程和父进程都在都一个命令控制台中

而如果我们想要区分的话就需要借助dwCreationFlags这个参数,将其修改为CREATE_NEW_CONSOLE即可:但是这个并不是我们最重要的,或者说不是其真正有意义的参数,有意义的事参数值为CREATE_SUSPEND,也就是以挂起的形式创建进程。

回顾

1.进程的创建

我们需要知道任何进程都是别的进程创建的,当我们在Windows下双击一个文件,实际上就是explore.exe这个进程创建我们打开文件的进程,其使用的方法就是:CreateProcess()

  1. 任何进程都是别的进程创建的:CreateProcess()

  2. 进程创建过程

1.映射EXE文件 (低2G)

2.创建内核对象EPROCESS (高2G)

3.映射系统DLL (ntdll.dll)

4.创建线程内核对象RTHREAD(高2G)

5.系统启动线程

映射DLL(ntdll.KdrInitialize Thunk)

线程开始执行

2.进程的创建

1.映射EXE文件

2.创建内核对象EPROCESS

3.映射系统DLL(ntdll.dll)

4.创建线程内核对象ETHREAD

5.如果是挂起的方式创建的:

.....

6.恢复以后再继续执行

1.映射DLL(ntdll.KdrInitializeThunk)

  2.线程开始执行

那也就说明了一点,挂起本质上挂起的是线程,进程还是会创建的,所以,最终如果想恢复的话也是恢复线程

模块与工作目录

GetModuleFileNameGetCurrentDirectory函数可以分别获得当前模块目录和当前工作目录:

char strModule[256];

GetModuleFileName(NULL,strModule,256);//得到当前模块目录,当前exe所在的路径,包含exe文件名

char strWork[1000];

int i = 1000;

GetCurrentDirectory(1000,buf);//获取当前工作目录

printf("某块目录:%s\n 工作目录:%s\n",strModule,strWork);

GetModuleFileName

获取当前模块的路径

获取现有目录

GetCurrentDirectory需要注意的是工作目录是可以修改的,我们可以通过CreateProcess函数来创建一个进程,并且修改其工作目录,这是CreateProcess函数的第8个参数LPCTSTR lpCurrentDirectory.

其他相关API

  • 获取进程PID

    GetCurrentProcessId
  • 获取进程句柄

    GetCurrentProcess
  • 获取命令行

    GetCommandLine
  • 获取启动信息

    GetStartupinfo
  • 遍历进程ID

    EnumProcesses
  • 快照

    CreateToolhelp32napshot

进程相关API的更多相关文章

  1. 进程相关的API函数

    0x01. ID与句柄 如果我们成功创建一个进程之后,CreateProcess会返回四个数据,id和句柄 句柄的话就是 当前进程私有的句柄表索引(这是当前进程,给别进程也没用) 每个进程都有一张自己 ...

  2. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

  3. 恶意软件开发——内存相关API

    一.前言 Windows操作系统的内存有三种属性,分别为:可读.可写.可执行,并且操作系统将每个进程的内存都隔离开来,当进程运行时,创建一个虚拟的内存空间,系统的内存管理器将虚拟内存空间映射到物理内存 ...

  4. OpenGL FrameBufferCopy相关Api比较(glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D)

    OpenGL FrameBufferCopy相关Api比较 glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D 标题所述 ...

  5. QQ音乐的各种相关API

    QQ音乐的各种相关API 分类: oc2014-01-29 15:34 2676人阅读 评论(2) 收藏 举报 基本上论坛里做在线音乐的都在用百度的API,进来发现百度的API不仅歌曲的质量不可以保证 ...

  6. addChildViewController相关api深入剖析

    注:本文根据个人的实践和理解写成,若有不当之处欢迎斧正和探讨! addChildViewController是一个从iOS5开始支持的api接口,相关的一系列的接口是用来处理viewcontrolle ...

  7. [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  9. Linux2.6内核--VFS层中和进程相关的数据结构

          系统中的每一个进程都有自己的一组打开的文件,像根文件系统,当前工作目录,安装点等.有三个数据结构将 VFS 层和系统的进程紧密的联系在一起,它们分别是: file_struct,fs_st ...

  10. 使用 c# 调用进程相关开发

    最近在维护公司的以前项目中发现,使用到了进程相关知识.现在将此总结,以备后面查看复习. 一.进程查看器     程序在运行的时候,操作系统就会为其分配一个进程.那么进程到底是什么东西呢? 实际上,进程 ...

随机推荐

  1. Runtime类继Robot类自动登录QQ后改进版2.0

    自动登录QQ2.0上线!!! 最近呢,有很多人问我自动登录QQ的小程序不够完善.看过我上一篇博客的人都知道,在登录QQ时运行Robot移动鼠标不够严谨,有时候会移动出错.很多小伙伴就会说了," ...

  2. Mysql8.0为什么取消了缓存查询的功能

    首先我们介绍一下MySQL的缓存机制 [MySQL缓存机制]简单的说就是缓存sql文本及查询结果,如果运行完全相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL. 但如果表中任何数 ...

  3. 开心档之MySQL 复制表

    MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT命令,是无法实现的. 本章节将为大家介绍如何完整 ...

  4. islider.js轮播图

    本篇文章地址:https://www.cnblogs.com/Thehorse/p/11601032.html css #iSlider-effect-wrapper { height: 220px; ...

  5. java英文字符串首字母大写

    java英文字符串首字母大写 /** * 首字母大写 * @param string * @return */ public static String toUpperCase4Index(Strin ...

  6. 2020-09-19:TCP状态有哪些?

    福哥答案2020-09-19:#福大大架构师每日一题# [答案来自此链接](https://www.zhihu.com/question/421833613) 11种状态1.CLOSED状态:初始状态 ...

  7. 2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成

    2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个"块", 并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数组相同. ...

  8. Sql Server维护计划事务日志找不到目标数据库

    1.发现事务日志备份突然停止了 2.查看维护计划中的事务日志设置 3.发现备份任务中,事务日志需要指向的数据库不在 4.进入数据库属性 5.在选项中将恢复模式改为"完整"

  9. ABP - 模块加载机制

    Abp是一个基于模块化开发的应用程序框架,提供了模块化基础的架构和模块化加载的引擎. 理解模块 一个模块是对一个功能点的封装,可以独立成为一个包,实现了松耦合的代码组织方式.Abp框架的基本思想就是模 ...

  10. C盘清理,移动node 依赖和缓存文件

    由于先前安装的node 没有做任何配置,都是傻瓜式下一步,导致了我很多依赖都放置C盘,内存占用过多:也不太好管理所有觉得将它移动到node安装目录 一.新建文件夹 在原本安装的nodejs目录下新建 ...