win32之进程概念
win32之进程
一丶简介
学习WindowsAPI. 之前.我们必须理解什么是进程. 在windows环境下.进程就是一个运行起来的exe程序
进程提供了数据以及资源. 但是怎么使用不管.而是由线程去管.
进程可以抽象为一栋房子. 而房子里面提供了日用品. 怎么使用它是不管的.
进程由很多DLL组成.我们可以拖动exe文件到win32dbg中查看. 快捷键 ALT + E 键.查看模块.

进程使用的内存空间是用户模式的内存空间.
什么是用户模式空间?
在windows中.进程的空间都是虚拟空间. 低2G空间是用户使用的. 高2G则是内核中使用. 而且是所有进程共享的.只有ring 3也就是用户模式的exe空间是独立的.
而高2G空间中.又分为高低64k空间. 这段内存是不能使用的.
例如下图:

我们使用快捷键ALT + M键可以看到.进程的资源.以及地址起始位置.


二丶探究原理跟本质.进程是如何创建的.
1.双击原理
我们一个进程可以使用鼠标双击来创建.但是并不是你鼠标创建的.而是由桌面管理器来创建的. 在windows任务管理器中 (ctrl + alt + del / ctrl + shift + esc 调出)
如下图:

而它创建的时候.是通过API CreateProcess 进行创建的.
2.原理.CreateProcess做了什么事情.
1.映射exe内存. 当调用CreateProcess的时候. 此时会把我们的exe映射到用户模式的虚拟内存中.
2.创建内核对象 EPROCESS 关于这点.熟悉内核驱动的应该知道.内核中EPROCESS是进程. ETHREAD是线程.不过如果不懂了解即可.
3.映射系统DLL 映射NTDLL. ntdll是系统dll每个进程都必须有这个ntdll.
4.创建ETHREAD 线程来执行代码. 我们知道进程只是提供资源数据代码而已. 但是怎么执行.是由线程来执行的. 通常我们会说主线程.
5.系统启动
5.1映射DLL 为什么还要映射.因为你程序需要的dll加载了.可是dll可能还是使用其他的dll.所以为了程序的执行.也一并加载进来.
5.2线程开始执行.这个时候就是开始执行我们代码了.
三丶进程创建CreateProcess解析
通过上面的原理我们知道了系统会调用CreateProcess进行创建进程.
PS: 在windows系统中.我们使用API的时候其实是 A版本跟W版本. 例如CreateProcessA 但是为了兼容性.windows直接封装了宏. CreateProcess.表示A 版下调用的就是CreateProcessA. W版本则是W版本.
BOOL CreateProcessA(
LPCSTR lpApplicationName, //要创建的进程名称 完整路径+exe
LPSTR lpCommandLine, //命令行参数.
LPSECURITY_ATTRIBUTES lpProcessAttributes, //是否进行继承进程句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, //是否进行继承线程句柄
BOOL bInheritHandles, //是否进行继承句柄
DWORD dwCreationFlags, //程序创建的标志.
LPVOID lpEnvironment, //父进程环境变量
LPCSTR lpCurrentDirectory, //父进程当前目录.自己可以设置
LPSTARTUPINFOA lpStartupInfo, //启动信息结构体.
LPPROCESS_INFORMATION lpProcessInformation//进程信息结构体
);
在这里主要参数是1 2 9 10参数
1.LpApplicationName 这个就是我们要创建的进程的路径.
2.lpCommandLine 这个就是命令行参数.如果我们要启动的程序带有命令行启动.那么这里填写参数即可.
9. lpStartupInfo 启动信息结构体. 这个结构体里面存储了要创建进程的一些信息.传入参数.我们可以指定.但是一般进程都有自己启动信息所以一般不设置.其中有一个成员比较重要.
10 lpProcessInfomation 进程信息结构体. 传出参数. 当我们创建进程完毕后.会得到进程的句柄.线程句柄. 进程id,线程id. 这个是个传出参数.表示返回值.
启动信息结构体解析.
typedef struct _STARTUPINFOA {
DWORD cb; 表示当前结构体的大小 重要成员
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX; 创建进程的x位置.y位置大小...
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
关于这个结构.我们只需要知道第一个成员. 因为第一个成员必须我们给定.(其他也可以.但不是必须) 给定的是使用的当前结构体的大小.因为在windows程序中.很有可能扩展.为了扩展性.所以给一个成员指定一下.等以后结构体修改了.那么我们成员多大.windows就知道使用多大的结构体了.
进程信息结构体
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; 返回的进程句柄
HANDLE hThread; 返回的线程句柄
DWORD dwProcessId; 返回的进程ID
DWORD dwThreadId; 返回的线程ID
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
其中重要了就这些成员了.
介绍几个常用的API函数.
ZeroMemory(清零的地址,清零地址的大小) ; 这个API是使内存进行清零. 我们创建启动信息结构体的时候需要进行初始化使用.
CloseHandle(句柄) 关闭句柄. 当CreateProcess创建进程完毕后会返回进程信息结构体. 里面的句柄如果不适用我们需要使用CloseHandle进行关闭.
四丶详细代码.
#include <Windows.h> int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{ TCHAR wszStartUpFileName[] = TEXT("D:\\calc.exe"); //要启动的程序路径
TCHAR wszStartUpFileCommandLine[] = TEXT(""); //命令行参数 STARTUPINFO si; //启动信息结构体
PROCESS_INFORMATION pi; //进程信息结构体
ZeroMemory(&si, sizeof(si)); //清零
ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); //启动信息结构体赋值为当前结构体大小 CreateProcess( //创建进程
wszStartUpFileName,
wszStartUpFileCommandLine,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&si,
&pi
); CloseHandle(pi.hProcess); //不使用的句柄关闭
CloseHandle(pi.hThread);
}
win32之进程概念的更多相关文章
- linux 进程概念
1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...
- linux:进程概念
Linux进程概念 一.实验介绍1.1 实验内容Linux 中也难免遇到某个程序无响应的情况,可以通过一些命令来帮助我们让系统能够更流畅的运行. 而在此之前,我们需要对进程的基础知识有一定的了解,才能 ...
- 线程、进程概念与Android系统组件的关系
Android系统是Google公司基于Linux内核开发的开源手机操作系统.通过利用 Linux 内核的优势,Android 系统使用了大量操作系统服务,包括进程管理.内存管理.网络堆栈.驱动程序. ...
- Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现
Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: 程序就是一堆文件 什么是进程: 进程就是一个正在 ...
- 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01
百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...
- Linux系统编程之进程概念
注:本文部分图片来源于网络,如有侵权,请告知删除 1. 什么是进程? 在了解进程概念之前,我们需要先知道程序的概念. 程序,是指编译好的二进制文件,这些文件在磁盘上,并不占用系统资源. 进程,指的是一 ...
- win32进程概念之句柄表,以及内核对象.
句柄表跟内核对象 一丶什么是句柄表什么是内核对象. 1.句柄表的生成 我们知道.我们使用CreateProcess 的时候会返回一个进程句柄.以及线程句柄. 其实在调用CreateProcess的时候 ...
- C++学习笔记39:进程概念
进程的基本概念 进程是描述程序执行过程和资源共享的基本单位 主要目的:控制和协调程序的执行 进程相关函数 用户与组ID函数 创建进程:system(),fork(),exec() 终止进程:kill( ...
- 深入浅出MFC——Win32程序基本概念(一)
1. Windows程序分为“程序代码”和“UI资源”,下图所示: 2. Windows支持动态链接(应用程序所调用的Windows API函数是在“执行时期”才链接上的).Windows程序调用的函 ...
随机推荐
- How Xtuner E3 works for BMW 520d Diagnosis and initialization of CBS service
Using Xtuner E3 to perform BMW 520d Diagnosis and initialization of CBS service in step by step proc ...
- redis在游戏服务器中的使用初探(二) 客户端开源库选择
上文提到 搭建完成后 我们选择客户端的开源库进行连接 有以下三种选择 1 acl-redis 原因是支持VC 国产 作者博客 acl 框架库简介 用 acl 库编写高效的 C++ redis ...
- netty2 案例:数据通信
在实际的项目中应该如何使用netty去通信呢? 一般来说,会有以下三种情况, 1长连接 也就是服务器和客户端的通道一直不关闭,如果服务器性能非常好,并且在客户端数量不是很多的情况下,可以选择使用这种方 ...
- Activity 重载方法 onStart和onResume、onPause和onStop的区别
Activity 重载方法 onStart和onResume.onPause和onStop的区别 首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最 ...
- SGTtrick
SGTtrick By 蒟蒻 ldxoiBy\ 蒟蒻\ ldxoiBy 蒟蒻 ldxoi Chapter 1.关于线段树操作的一些分析 我们知道,线段树有两个核心的函数pushdownpushdown ...
- ABP框架系列之十五:(Caching-缓存)
Introduction ASP.NET Boilerplate provides an abstraction for caching. It internally uses this cache ...
- 牛客练习赛42 C 反着计算贡献
https://ac.nowcoder.com/acm/contest/393/C 题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m<= ...
- save to project-level dictionary? save to application-level dictionary?
通过静态代码分析工具lint在Spelling typo得到save to project-level dictionary? save to application-level dictionary ...
- qhfl-6 购物车
购物车中心 用户点击价格策略加入购物车,个人中心可以查看自己所有购物车中数据 在购物车中可以删除课程,还可以更新购物车中课程的价格策略 所以接口应该有四种请求方式, get,post,patch,de ...
- spring生命周期流程图
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...