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之进程概念的更多相关文章

  1. linux 进程概念

    1,pcb:进程控制块结构体:/usr/src/linux-headers-4.15.0-29/include/linux/sched.h 进程id:系统中每个进程有唯一的id,在c语言中用pid_t ...

  2. linux:进程概念

    Linux进程概念 一.实验介绍1.1 实验内容Linux 中也难免遇到某个程序无响应的情况,可以通过一些命令来帮助我们让系统能够更流畅的运行. 而在此之前,我们需要对进程的基础知识有一定的了解,才能 ...

  3. 线程、进程概念与Android系统组件的关系

    Android系统是Google公司基于Linux内核开发的开源手机操作系统.通过利用 Linux 内核的优势,Android 系统使用了大量操作系统服务,包括进程管理.内存管理.网络堆栈.驱动程序. ...

  4. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  5. 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01

    百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  6. Linux系统编程之进程概念

    注:本文部分图片来源于网络,如有侵权,请告知删除 1. 什么是进程? 在了解进程概念之前,我们需要先知道程序的概念. 程序,是指编译好的二进制文件,这些文件在磁盘上,并不占用系统资源. 进程,指的是一 ...

  7. win32进程概念之句柄表,以及内核对象.

    句柄表跟内核对象 一丶什么是句柄表什么是内核对象. 1.句柄表的生成 我们知道.我们使用CreateProcess 的时候会返回一个进程句柄.以及线程句柄. 其实在调用CreateProcess的时候 ...

  8. C++学习笔记39:进程概念

    进程的基本概念 进程是描述程序执行过程和资源共享的基本单位 主要目的:控制和协调程序的执行 进程相关函数 用户与组ID函数 创建进程:system(),fork(),exec() 终止进程:kill( ...

  9. 深入浅出MFC——Win32程序基本概念(一)

    1. Windows程序分为“程序代码”和“UI资源”,下图所示: 2. Windows支持动态链接(应用程序所调用的Windows API函数是在“执行时期”才链接上的).Windows程序调用的函 ...

随机推荐

  1. rpc和http

    rpc,远程过程调用,分布式各服务在不同的节点,因为不在同一进程中,所以节点间的调用需要通过网络进行传输,rpc是基于tcp/ip的,通过长连接进行通信.客户端需要缓存服务端的ip和端口,服务端也要缓 ...

  2. win7访问局域网总提示用户名密码错误解决方案

    win7访问局域网总提示用户名密码错误解决方案 1.点击开始-在搜索栏输入:secpol.msc(或者直接按下win+r键,输入secpol.msc),打开本地安全策略. 2.找到“安全设置”的“本地 ...

  3. 秒杀系统-service

    在Dao层我们只完成了针对表的相关操作,包括写了接口方法和映射文件中的sql语句,并没有编写逻辑的代码,例如对多个Dao层方法的拼接,当我们用户成功秒杀商品时我们需要进行商品的减库存操作(调用Seck ...

  4. _ZNote_Mac_技巧_QuickLook功能扩展

    QuicLook(快速查看)是macOS一项非常方便的独有功能: 当选中一个文件,只需要按下空格键即可查看其内容,在按下空格退出QuickLook, 不需要启动再关闭任何软件. 默认支持大部分视频.音 ...

  5. FPGA的发展史及FPGA 的基础架构

    通过了解早期FPGA的发展,理解FPGA究竟是干什么的,FPGA到底在电子设计领域起到了什么样的作用,下面是一张早期的设计过程 早期的设计流程过程中,只有当硬件完成了才能够得到功能的验证,随着集成电路 ...

  6. 嵌入式FIFO核的调用

    本次设计源码下载地址:http://download.csdn.net/detail/noticeable/9915523 课程目标:学习调用quartus II 软件的FIFO(先进先出)IP核,并 ...

  7. linq转载

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  8. Spring之AOP由浅入深

    1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可 ...

  9. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

  10. HTTP 总结

    一.概念 特性 1. HTTP协议用于客户端和服务端之间的通信 2. 通过请求和响应的交互达成通信 : HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回,也就是说,肯定是从客户端开始建立 ...