进程

  • 什么是进程?

    • 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程。

    • 进程类似于一个容器,提供给线程一块空间和需要执行的操作,线程用于进行执行。

  • 什么是模块?

    • 提供代码和数据的可执行文件,主要有 exe 和 dll。可以通过 VS 的调试->窗口->模块进行查看

  • 创建进程

    // 结构体用于设置进程的初始化信息
    STARTUPINFO StartupInfo = { sizeof(STARTUPINFO) };

    // 用于保存被创建的进程的 id 和句柄
    PROCESS_INFORMATION ProcessInfomation = { };

    // 创建第一个进程,使用 CreateProcess
    BOOL IsOk = CreateProcess(
    L"C:\\Windows\\System32\\calc.exe", // 用于创建进程的 exe 路径
    NULL, // 命令行参数
    NULL, // 进程的安全属性, NULL 表示使用默认值
    NULL, // 线程的安全属性
    FALSE, // 子进程是否拥有父进程的句柄
    NULL, // 进程创建标志,(挂起\调试\在新窗口打开)
    NULL, // 环境变量
    NULL, // 程序的工作目录)
    &StartupInfo, // 输入的进程设置
    &ProcessInfomation); // 输出的进程信息

    // 为了防止泄露关闭进程和线程句柄
    CloseHandle(ProcessInfomation.hThread);
    CloseHandle(ProcessInfomation.hProcess);

    // * 创建进程的时候,创建出的进程和线程的句柄会被返回,所以[当前进程]中
    // 线程句柄和进程句柄都被打开了一次。[被创建]的进程中拥有自己的进程内
    // 核对象和线程内核对象。*

    // 还有 n 多的创建进程的方式,比如 system,ShellExecute, Winexec
    system("start calc.exe");
  • 操作进程

    // 0. 通过窗口句柄动态的查找 pid
    DWORD Pid = ;
    HWND hWnd = FindWindow(NULL, L"无标题 - 记事本");
    GetWindowThreadProcessId(hWnd, &Pid);

    // 1. 获取进程内核对象的句柄
    HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);

    // 2. 结束其它进程,需要一定的权限
    TerminateProcess(ProcessHandle, );

    // 3. 手动的关闭内核对象
    CloseHandle(ProcessHandle);

    // 4. 直接关闭自己的进程
    ExitProcess(-);
  • 遍历进程

    // 1. 包含创建快照需要用到的头文件 TlHelp32.h
    #include <TlHelp32.h>

    // 2. 开始拍摄快照,第一个参数指定快照的类型
    HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );

    // 3. 判断快照是否拍摄成功
    if (Snapshot == INVALID_HANDLE_VALUE)
    {
    MessageBox(NULL, L"进程快照创建失败", L"警告", MB_OK | MB_ICONERROR);
    ExitProcess(-);
    }

    // 4. 创建结构体用于保存遍历的进程信息
    PROCESSENTRY32 ProcessInfo = { sizeof(PROCESSENTRY32) };

    // 5. 尝试从快照中获取第一个进程
    if (Process32First(Snapshot, &ProcessInfo))
    {
    do {
    // 6. 输出进程的信息
    printf("ProcessName: %ls", ProcessInfo.szExeFile);

    // DWORD th32ProcessID; // 进程的 id
    // DWORD cntThreads; // 线程的数量
    // DWORD th32ParentProcessID; // 父进程 id
    // DWORD dwFlags; // 线程的标志
    // CHAR szExeFile[MAX_PATH]; // 进程的名字

    // 6.1 以查询的权限打开进程句柄
    HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION,
    FALSE, ProcessInfo.th32ProcessID);

    // 6.2 获取进程文件所在的路径
    DWORD PathSize = MAX_PATH;
    WCHAR Path[MAX_PATH] = { };
    QueryFullProcessImageName(Handle, , Path, &PathSize);

    // 6.3 输出文件的路径
    printf("\t%ls\n", Path);

    // 6.4 关闭句柄
    CloseHandle(Handle);

    // 7. 继续遍历下一个进程信息
    } while (Process32Next(Snapshot, &ProcessInfo));
    }
  • 遍历模块

    // 1. 包含创建快照需要用到的头文件 TlHelp32.h
    #include <TlHelp32.h>

    int main()
    {
    // 2. 开始拍摄快照,第一个参数指定快照的类型,参数 2 表示某一个进程的模块
    HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, );

    // 3. 判断快照是否拍摄成功
    if (Snapshot == INVALID_HANDLE_VALUE)
    {
    MessageBox(NULL, L"模块快照创建失败", L"警告", MB_OK | MB_ICONERROR);
    ExitProcess(-);
    }

    // 4. 创建结构体用于保存遍历的进程信息
    MODULEENTRY32 ModuleInfo = { sizeof(MODULEENTRY32) };

    // 5. 尝试从快照中获取第一个模块
    if (Module32First(Snapshot, &ModuleInfo))
    {
    do {
    // 6. 输出模块的信息

    // DWORD th32ProcessID; // 父进程 id
    // HMODULE hModule; // 模块句柄,模块在虚拟空间的起始位置
    // char szModule[]; // 模块的名称
    // char szExePath[MAX_PATH]; // 模块的路径

    printf("%ls: %ls\n", ModuleInfo.szModule, ModuleInfo.szExePath);

    // 7. 继续遍历下一个模块信息
    } while (Module32Next(Snapshot, &ModuleInfo));
    }

    return ;
    }

Windows提高_1.2遍历进程、遍历模块的更多相关文章

  1. Windows提高_1.3文件操作

    文件操作 不带句柄的文件操作 // 1. 拷贝文件,第三个参数为 FALSE 表示会覆盖 // CopyFile(L"D:\\1.txt", L"E:\\2.txt&qu ...

  2. Windows提高_1.4进程通信

    进程通信 使用 WM_COPYDATA 客户端(发送端) // 1. 找到窗口程序 HWND hWnd = FindWindow(NULL, L"Window1"); ​ // 2 ...

  3. 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态

    版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030 1 2 3 4 5 6 7 8 9 10 11 ...

  4. Windows提高_1.1内核对象

    内核对象 什么是内核对象? 内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改. 如何操作内核对象? 创建一个内核 ...

  5. Windows编程之进程遍历(C++实现)

    Windows编程之进程遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分 ...

  6. C语言实现windows进程遍历

    #include <windows.h> #include <tlhelp32.h> //进程快照函数头文件 #include <stdio.h> int main ...

  7. 【API】遍历进程的几种方式

    1.说明 枚举进程的常见几种方法 方法1:CreateToolhelp32Snapshot().Process32First()和Process32Next() 方法2:EnumProcesses() ...

  8. C/C++遍历进程和进程ID的小工具

    原文:http://blog.csdn.net/qq78442761/article/details/54646010 当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID 对于上述功能,我们 ...

  9. 未公开函数 NtQuerySystemInfoMation 遍历进程信息,获得进程的用户名(如: system,Admin..)

    目录 遍历进程用户名 代码例子 遍历进程用户名 代码例子 #include <windows.h> #include <iostream> #include <COMDE ...

随机推荐

  1. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  2. Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)

    Unity 一个面片的最大顶点数为65524,所以大于这个数,请拆分成多个面片 1.获取汽车x轴的最大值和最小值[-2.5,2.5]+R watermark/2/text/aHR0cDovL2Jsb2 ...

  3. ios Enum Value To NSString

    #define enumToString(value)  @#value eg. typedef NS_ENUM(NSInteger, Sex) { Male = 0, Famale = 1, }; ...

  4. JavaScript基础 -- ECMAscript

    ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本 ...

  5. 【bzoj4538】[Hnoi2016]网络

    我们考虑树剖,线段树上维护一个堆,保存不经过该段区间的路径的权值. 对于一条路径我们将对于线段树中的区间提取出来,在对于线段树中进行修改.也就是在堆中插入或删除. 对于一次询问,只要找到包含该点的线段 ...

  6. GraphDatabase_action

    https://neo4j.com/docs/ #https://pypi.python.org/pypi/neo4j-driver/1.5.3from neo4j.v1 import GraphDa ...

  7. USACO 刷题有感

    最近每天都尽量保持着每天一道USACO的题目,呵呵,一开始都是满简单的,一看题目基本上思路就哗啦啦地出来了,只不过代码实现有点麻烦,花了一些时间去调试,总体感觉还不错,但是越往后做,应该就很难保持一天 ...

  8. android 手机上运行图像算法

    在pc上调试好的图像处理算法想要在android手机上跑一下看看速度需要一下几个步骤 1.建立一个android application,通过ndk调用你写好的图像算法的c/c++ code 2. 然 ...

  9. JS如何遍历一个文件夹下的所有文件与目录(转)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. Spark GraphX 属性图操作

    package Spark_GraphX import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD import org.apa ...