进程

  • 什么是进程?

    • 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 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. Struts2 整合jQuery实现Ajax功能(1)

    技术领域非常多东西流行,自然有流行的道理.这几天用了jQuery,深感有些人真是聪明绝顶,能将那么多技术融合的如此完美. 首先明白个概念: jQuery是什么:是使用javascript语言开发的,用 ...

  2. python开发【第1篇】【基础知识】

    1.python解释执行原理 python代码——字节码——机器码——计算机 每次运行都要进行转换成字节码,然后再有虚拟机把字节码转换成机器语言,最后才能在硬件上运行. 2.python编码 unic ...

  3. Restful WebService简介

    RESTful Web Services已经渐渐開始流行, 主要是用于解决异构系统之间的通信问题.非常多站点和应用提供的API,都是基于RESTful风格的Web Services,比較就有Googl ...

  4. UnicodeEncodeError:'latin-1' codec can't encode character

    UnicodeEncodeError:'latin-1' codec can't encode character

  5. ios30---pthread, NSThread, GCD, NSOperation

    pthread(线程库,很早就有的技术,了解):一套通用的多线程API适用于Unix\Linux\Windows等系统(java开发也有pthread)跨平台\可移植使用难度大(全是C函数) C语言 ...

  6. Matlab7.1——启动时只显示Logo

    1. 现象 Matlab7.1在启动时只显示Matlab的Logo: 2. 解决方法 听我的吧,这个是官方办法,我也亲自试过了1结束matlab进程:2在C:\user\APPDATA\Roaming ...

  7. oracle type类型

    转载 http://blog.sina.com.cn/s/blog_6cfb6b090100ve92.html 转自网络,具体用法我会再细化 1.概念    方法:是在对象类型说明中用关键字  MEM ...

  8. Java 工具类 —— 定时器(Timer/TimerTask)

    import java.util.Timer; import java.util.TimerTask; public class Timer { .... public void schedule(T ...

  9. 实现SpringBoot登录

    SpringBoot登录 https://www.cnblogs.com/jiekzou/p/9303871.html 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如 ...

  10. sql时间截取与修改

    --修改日,从1号修改到10号UPDATE CHECKINOUT SET CHECKTIME=DATEADD(DAY,9,CHECKTIME) WHERE YEAR(CHECKTIME)=1970 a ...