进程

  • 什么是进程?

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

    1.给网站赋权限 Set-SPUser –Identity “用户名” –AddPermissionLevel “参与讨论” –web “http://url” 2.给列表赋权限 $web = Get ...

  2. TCP/IP具体解释学习笔记——数据链路层(2)

    五 Wireless LANs(Wi-Fi) 现在很流行的一种接入互联网的方式就是Wi-Fi了.我们用的ipad.手机.笔记本电脑等等都能够用这样的方式接入互联网,很方便灵活.一个典型的Wi-Fi网络 ...

  3. JS 通过选择百度地图地址获取经纬度自动填充到文本框中的方法

    首先要注册百度地图API. 1.登录百度地图开放平台http://lbsyun.baidu.com 注册账号,完善信息,点击网站右上角的“API控制台”,点击,创建应用. 应用类型选择:“浏览器端”, ...

  4. 用msys1.0+mingw gcc4.7.1编译libodb(C++ ORM)

    这里主要使用的是libodb 对sqlite数据库的支持. (1)下载编译sqlite3,当初编译go-sqlite3的时候下载过sqlite3,就直接拿过来用了. start msys.bat gc ...

  5. CentOS下实现Flask + Virtualenv + uWSGI + Nginx部署

    一.项目简介 在本文中,将一步一步搭建一个简单的Flask + Virtualenv + uWSGI + Nginx 架构的Web服务,可以作为新手的学习也可作为记录备忘. 如果你安装好了环境并有一定 ...

  6. astgo经常死机变慢?试试mysql数据碎片整理吧

    使用SSH之类的工具或navicat链接数据库后(注意:是链接数据库后哦,不是直接SSH后就弄,这样提示命令错误的) 执行下面命令(目的是对ASTGO的数据库内除话单之外的所有表进行数据碎片整理,特别 ...

  7. MySQL Archive存储引擎

    200 ? "200px" : this.width)!important;} --> 介绍 从archive单词的解释我们大概可以明白这个存储引擎的用途,这个存储引擎基本上 ...

  8. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】

    只要发现添加一个字符和删除一个字符是等价的,就是挺裸的区间dp了 因为在当前位置加上一个字符x就相当于在他的对称位置删掉字符x,所以只要考虑删除即可,删除费用是添加和删除取min 设f[i][j]为从 ...

  9. 无线网络发射选址 2014年NOIP全国联赛提高组(二维前缀和)

    P2038 无线网络发射器选址 题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南 ...

  10. RabbitMQ的一些基本操作

    $ sudo chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务 $ sudo /sbin/service rabbitmq-server start # ...