1. CreateProcess

函数功能
用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

基本原理
执行一个外部程序实质上可以认为就是创建一个进程
windows系统下创建一个进程意味着:
① 创建一个内核对象:内核对象是windows系统用于管理进程的一个工具,可以认为是一个数据结构。
② 创建一个地址空间:用于存放可执行文件的代码和数据

当调用CreateProcess()时,windows会自动创建一个进程内核对象,将进程内核对象引用计数设置为1,并将可执行文件的代码和数据加载到地址空间,然后再创建相应的主线程的内核对象,最终执行入口函数

函数原型

BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
);

函数参数
CreatProcess()需要若干参数来指定新进程的运行方式,但实际使用中多半参数都是用不到的,可以设置为NULL

lpApplicationName
用于指定可执行文件的名称也可以是可执行文件的路径
该参数的类型是LPCTSTR,其实就是一个const char*的传统C字符串,要求以’0’结尾,需要注意的是这必须是个常量字符串

需要注意的是在lpApplicationName中必须指定扩展名(.exe)并且如果没有指定路径,windows将只在当前目录中寻找,没有找到就会出错返回False。另一方面,即使指定了lpApplicationName也会把lpCommmandLine(命令行参数)原封不动的作为命令行参数传递,所以应避免重复传递可执行文件名的问题

实际使用中常常把lpApplicationName设置为Null,用lpCommandLine参数来指定可执行文件名,这样可以扩大windows寻找可执行文件的范围

lpCommandLine
这个参数用于指定传递给新进程的命令行参数,更多时候我们把可执行文件名也包含在内(这意味着lpApplicationName应该设置为Null)

该参数的类型是LPTSTR,即一个以’0’结尾的char*的C传统字符串,而关键在于:这是个非常量字符串!非常量!非常量!CreateProcess会在内部对这个字符串进行更改,然后在返回前改回去!如果传递了一个常量字符串就必然出错(常量字符串保存在只读内存区域,不能进行写操作!)

lpProcessAttributes
这个是一个指向SECURITY_ATTRIBUTES结构的指针,用来给进程对象设置安全性,即返回的新进程对象句柄能否被子进程继承;
一般传递NULL,让windows把进程内核对象设为默认安全性,即新进程对象句柄不能被子进程继承

lpThreadAttributes
同样是一个指向SECURITY_ATTRIBUTES结构的指针,只不过是用来给线程对象设置安全性的,即返回的新线程对象句柄能否被子线程继承
同样,这个一般也传递NULL设置为默认安全性,也就是句柄不能被继承

bInheritHandles
同样是关于安全性的标识符,是个BOOL型变量,用于控制新进程是否可以从调用进程处继承所有可继承的句柄,而被继承的句柄与原进程拥有完全相同的值和访问权限

设置为TRUE新进程将继承调用CreateProcess的原进程的所有可继承的句柄,而设置为FALSE则不会继承原进程的任何句柄

dwCreationFlags
是个DWORD的标识,用于设置新进程创建的方式,各个标识符以宏的形式定义,可以用位或组合使用,同时指定多个标识符
列出几个

CREATE_NEW_CONSOLE //要求系统为新进程创建一个新的控制台窗口(否则会和原进程共用一个控制台窗口)
CREATE_NO_WINDOW //不为新进程创建窗口,可以用这个来创建一个没有窗口的应用程序
DEBUG_PROCESS //将新进程作为被调试程序而原进程被当做调试器,新进程和其创建的其他进程中发生的特定事件都会被通知原进程
CREATE_UNICODE_ENVIRONMENT //告诉系统新进程的环境块包含Unicode字符(默认为ANSI)

lpEnvironment
这个参数指向一块包含新进程要使用的环境字符串的内存,通常传入NULL表示继承原进程的环境字符串,一般是用不到的,放心传NULL就好

lpCurrentDirectory
该参数用于设置新进程的当前驱动器和目录,必须是一个以’0’结尾的绝对路径字符串,如果用不到特殊设置可以直接传递NULL表示新进程的工作目录和创建新进程的原进程工作目录一致,一般就用NULL吧

lpStartupInfo
这个参数指向一个STARTUPINFO或STARTUPINFOEX的结构,一般应用程序会期待仅使用默认值,所以大可以全部置零

lpProcessInformation
是一个指向LPPROCESS_INFOMATION结构的指针,这个结构由调用CreateProcess的进程创建,由CreateProcess更改,用于返回新建进程的信息,其结构定义如下:

typedef struct _PROCESS_INFORMATION {HANDLE hProcess;HANDLE hThread;DWORD  dwProcessId;DWORD  dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION,*LPPROCESS_INFORMATION;

分别是进程句柄、线程句柄、进程ID和线程ID

2. OpenProcess

函数功能
用来打开一个已存在的进程对象,并返回进程的句柄。

函数原型

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

函数参数
dwDesiredAccess :获取的权限,可分为以下几种
PROCESS_ALL_ACCESS:获取所有权限
PROCESS_CREATE_PROCESS:创建进程
PROCESS_CREATE_THREAD:创建线程
PROCESS_DUP_HANDLE:使用DuplicateHandle()函数复制一个新句柄
PROCESS_QUERY_INFORMATION:获取进程的令牌、退出码和优先级等信息
PROCESS_QUERY_LIMITED_INFORMATION:获取进程特定的某个信息
PROCESS_SET_INFORMATION:设置进程的某种信息
PROCESS_SET_QUOTA:使用SetProcessWorkingSetSize函数设置内存限制
PROCESS_SUSPEND_RESUME:暂停或者恢复一个进程
PROCESS_TERMINATE:使用Terminate函数终止进程
PROCESS_VM_OPERATION:在进程的地址空间执行操作
PROCESS_VM_READ:使用ReadProcessMemory函数在进程中读取内存
PROCESS_VM_WRITE:使用WriteProcessMemory函数在进程中写入内存
SYNCHRONIZE:使用wait函数等待进程终止

bInheritHandle:TRUE或者FALSE

dwProcessId:pid

函数返回值
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。

3. OpenProcessToken

函数功能
用来打开与进程相关联的访问令牌。

函数原型
要对一个任意进程进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID),还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被启用的,所以我们要做的首先是启用这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到

BOOL OpenProcessToken(
__in HANDLE ProcessHandle, //要修改访问权限的进程句柄
__in DWORD DesiredAccess, //指定你要进行的操作类型
__out PHANDLE TokenHandle //返回的访问令牌指针
);

函数参数

函数返回值

4.

函数功能

函数原型

函数参数

函数返回值

Process相关函数相关推荐

  1. Python菜鸟学习手册14----标准库+代码实例

    Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我 ...

  2. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...

    本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID 1 进程标识符(Process Identifiers ...

  3. 高斯过程 (Gaussian Process)

    本博客转载自https://blog.csdn.net/u010016927/article/details/76856036 **针对机器学习的高斯过程(Gaussian Process for M ...

  4. UDT 最新源码分析(三) -- UDT Socket 相关函数

    UDT 最新源码分析 -- UDT Socket 相关函数 UDT socket 建立与使用 主要流程 C/S 模式 Rendezvous 模式 UDT epoll UDT socket 创建 UDT ...

  5. linux进程操作相关函数,Linux进程控制简介与要素及相关函数详解

    进程是操作系统中的一个重要概念,它是一个程序的一次执行过程,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中运行的. 进程4要素 要有一段程序供该进程运行 进程专用的系统堆栈空间 进程 ...

  6. 随机过程笔记:1.相关函数

    b站张颢老师随机过程笔记,本文主要是第一二节的内容. 建议先修课程:概率论,矩阵论或线性代数,高等数学. 由于张颢老师似乎是教电子的,里面的很多举例和信号相关,可以根据自己的实际来看,或者看看信号与系 ...

  7. 计算机系统大作业 程序人生-Hello’s P2P From Program to Process

    计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 1180300327 班 级 11803003 学 生 黄锦洋 指 导 教 师 史先俊 附件:https://do ...

  8. 使用Java监控工具出现 Can't attach to the process

    问题重现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ➜ jinfo -flags 3032 Attaching ...

  9. RTTI(三)相关函数1【转自大富翁】

    第三部分RTTI相关函数 GetTypeData 函数 GetPropInfo 函数 FindPropInfo 函数 GetPropInfos 函数 SortPropList 函数 GetPropLi ...

  10. Mr. Process的一生-Linux内核的社会视角 (2)启动

    原文地址: http://www.manio.org/cn/startup-of-linux-view-of-society.html 其实这才应该是这一系列文章的第一节,因为这篇文章讲的是盘古开天地 ...

最新文章

  1. swing java管理系统_Java swing实现酒店管理系统
  2. 《JS权威指南学习总结--开始简介》
  3. mutt msmtp
  4. Java类集框架 —— HashMap源码分析
  5. LVS负载均衡之NAT模式
  6. 基于EasyUI的Web应用程序及过去一年的总结
  7. 理解一个类里边设置两个同名函数
  8. python3-pwntools教程_CTF PWN工具篇1
  9. 汉罗塔python_基于Python的汉诺塔算法
  10. 计算机网络最出优秀,职业高中计算机网络案优秀教案.doc
  11. linux 更改文件格式
  12. ps学习——基本工具
  13. python numpy逆_Numpy 中的矩阵求逆实例
  14. 一个非常有意思的网站
  15. 二十四节气-寒露,月斜寒露白,此夕去留心
  16. abbyyfinereader软件下载中文注册免安装激活版
  17. 【AP/AR】借项通知单和贷项通知单的区别
  18. 我的世界java史莱姆生成条件_关于我的世界史莱姆的生成条件分析介绍
  19. DirectSound播放PCM有杂音的解决方法
  20. Ubuntu 22.04 无法使用网易云音乐

热门文章

  1. 骗子是怎样将1G硬盘变成120G的
  2. 天气预测频繁2项集_寻攻略 | 天气不似预期?我从来没在怕的
  3. UIButton颜色渐变 titleLabel字体不显示
  4. sql 查出一张表中重复的所有记录数据并且删除
  5. PHP数组实现菜单无限极分类
  6. C++编译器在编译程序时会自动定义的预处理器(类似于全局变量)
  7. Matlab系列教程_数值计算_求和(积)_求累加(积)
  8. org.gradle.api.tasks.compile.CompileOptions.setBootClasspath
  9. Plugin [id: ‘com.github.kt3k.coveralls‘, version: ‘2.8.2‘] was not found in any of the following sou
  10. 脚本都不写,不能算正式测试