进程

  • 什么是进程?

    • 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 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. Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源

    2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...

  2. EXISTS 执行顺序 CLR-2-2-引用类型和值类型

    EXISTS 执行顺序   select * from a where a.s_status=1 and exists (select orderid from b on a.orderid=b.or ...

  3. Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器client(5) 小结

    经过不断试用与改动,这个查看器终于还是完毕了设计.实现.查看器,顾名思义,没有编辑功能:说的白一点,仅仅是一个以OpenStreetMap为底图的显示装置罢了.和专业GIS相比,这款基于插件的Open ...

  4. SQL的事务回滚操作带案例分析

    SET XACT_ABORT on  BEGIN TRAN  INSERT INTO [PDA_Action] VALUES ('採购入库1')  INSERT INTO [PDA_Action] V ...

  5. java7新特性之Diamond syntax

    java7新特性之Diamond syntax Java 7 also introduces a change that means less typing for you when dealing ...

  6. Codeforces(429D - Tricky Function)近期点对问题

    D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. YTU 2677: 韩信点兵

    2677: 韩信点兵 时间限制: 1 Sec  内存限制: 128 MB 提交: 61  解决: 38 题目描述 刘邦问韩信:"你觉得我可以带兵多少?"韩信:"最多十万. ...

  8. bzoj2060

    树形dp dp[x][0]表示x点父亲没选,dp[x][1]表示x点父亲选了,然后dp[x][0]=max(sigma(dp[c[x]][0]),sigma(dp[c[x]][1])) dp[x][1 ...

  9. 基于ELK的传感器数据分析练习

    目录 Sensor Data Analytics Application 数据构成 数据模型设计 Logstash配置 Kibana可视化 Sensor Data Analytics Applicat ...

  10. 4-2 买家类目-dao(下)

    查询出来的对象ProductCategory就已经有updateTime和createTime了,然而你只是把对象的categoryType给修改了一下,修改之后就执行save方法保存了.所以它还是原 ...