进程

  • 什么是进程?

    • 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 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. KLT 光流

    一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...

  2. promise && than

    Promise 构造函数接受一个函数作为参数,该函数的2个参数分别是 resolve 和 reject.他们是2个函数,有 JavaScript 引擎提供,不用自己部署.   var promise ...

  3. poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

    题目链接: id=3211">poj3211  hdu1171 这个题目比1711难处理的是字符串怎样处理,所以我们要想办法,自然而然就要想到用结构体存储.所以最后将全部的衣服分组,然 ...

  4. (三)Java 开发环境配置

    window系统安装java 下载JDK   首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downl ...

  5. sql 2005 win7 64 数据引擎

    有个箭头,下拉,选择服务器名(就是本机的名称),如果没有就选择浏览更多,看能搜索出不还没的话就手动输入localhost

  6. Android实战技巧之八:Ubuntu下切换JDK版本【转】

    本文转载自:http://blog.csdn.net/lincyang/article/details/42024565 Android L之后推荐使用JDK7编译程序,这是自然发展规律,就像是4年前 ...

  7. 并不对劲的spoj nsubstr

    题意是求一个字符串每个长度的子串出现次数最多的那个出现了多少次,也就是求每个到根的最长路的right集合最大值 . 先建后缀自动机,然后将每个前缀所在的集合的初值设为1,因为所有前缀的right集合肯 ...

  8. FreeMarker:

    ylbtech-FreeMarker: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbt ...

  9. 什么是javascript闭包?

    在我们开发中,也经常使用到闭包,但当有人问什么是闭包,就会可能说不上来.那就谈谈一些基本的: 一.理解闭包的概念, 简单说当function里嵌套function时,内部的function可以访问外部 ...

  10. [SDOI2011]消防(单调队列,树的直径,双指针)

     消防 2011年  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 大师 Master   题目描述 Description 某个国家有n个城市,这n个城市中任意两个都连通且有 ...