zoukankan      html  css  js  c++  java
  • windows-进程相关操作

    进程相关操作

    函数功能
    CreateProcess 创建进程
    OpenProcess 打开进程
    ExitProcess 退出本进程
    TerminateProcess 结束指定进程
    WinExec 启动一个进程
    ShellExecute 运行一个外部程序,或者打开一个文件目录,文件夹等等
    system 控制台命令
    CreateToolhelp32Snapshot 创建快照遍历进程、线程、模块、堆

    打开一个进程(其实也就是获得进程句柄

    函数原型

    HANDLE OpenProcess(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    DWORD dwProcessId
    );

    参数

    第一个参数dwDesiredAccess表示打开的进程的权限,来描述打开这个进程的句柄获得的权限有哪些

    PROCESS_ALL_ACCESS 这个宏表示获得所有的权限

     

    第二个参数 bInheritHandle表示如果用这个句柄创建的进程是否继承该句柄,在这里我们拿来也没啥用直接用NULL就好

    第三个参数表示要打开的进程的ID

    void Open_Process(int pid)
    {
    OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
    }

    返回值

    如果打开成功会返回对于的进程句柄,如果失败则返回NULL

    关闭指定进程

    函数原型

    BOOL TerminateProcess(
    HANDLE hProcess,
    UINT   uExitCode
    );

    参数

    第一个参数表示进程句柄

    第二个参数表示的是退出进程传递的代码值,这个基本上是写操作系统时的进程退出的原因才用的上,这里直接传0就好

    void Close_Process(HANDLE hProcess)
    {
    TerminateProcess(hProcess, 0);
    }

    遍历进程

    函数原型

    HANDLE CreateToolhelp32Snapshot(
    DWORD dwFlags,
    DWORD th32ProcessID
    );

    这个函数是包括在tlhelp32.h头文件下的,需要添加使用

    参数

    第一个参数 dwFlags表示需要遍历什么东西。因为它可以遍历进程线程模块和堆这四种东西。

    TH32CS_SNAPPROCESS 这个宏表示的是遍历系统中的所有进程

    第二个参数 表示的是进程的ID,但是这个第二个参数只有在遍历线程,模块和堆的情况下需要,因为线程模块和堆都是进程里面包含的,因为这里我们是需要的是遍历进程,所以直接传0

    返回值

    如果函数成功,返回打开的句柄到指定的快照,如果失败则返回INVALID_HANDLE_VALUE

    枚举进程

    在CreateToolhelp32Snapshot函数中的第一个参数的宏中提示了枚举进程的办法,使用Process32First函数,然后在Process32First中有Process32Next函数来访问快照中的下一个进程,相当于就是说访问第一个,然后一直下一个下一个

    函数原型

    BOOL Process32First(
    HANDLE           hSnapshot,
    LPPROCESSENTRY32 lppe
    );
    BOOL Process32Next(
    HANDLE           hSnapshot,
    LPPROCESSENTRY32 lppe
    );

    参数

    这两个函数的参数都一样,第一个参数是快照的句柄,第二个参数是一个结构体的指针,在windows编程下的p也就是point是指针的意思,l就是long的意思。第二个参数是一个用来描述快照中的进程信息的一个结构体的指针

    LPPROCESSENTRY32
    typedef struct tagPROCESSENTRY32 {
    DWORD     dwSize;
    DWORD     cntUsage;
    DWORD     th32ProcessID;
    ULONG_PTR th32DefaultHeapID;
    DWORD     th32ModuleID;
    DWORD     cntThreads;
    DWORD     th32ParentProcessID;
    LONG     pcPriClassBase;
    DWORD     dwFlags;
    CHAR     szExeFile[MAX_PATH];
    } PROCESSENTRY32;

    该结构体是用来描述快照中的进程的信息的,在创建结构体的时候需要初始化dwSize,不然就创建失败,后面的参数不用管,这里就相当于创建了一个描述进程信息的结构体来获取进程信息,不用赋值因为反正后面都会被获得的进程的信息覆盖

    返回值

    如果成功的话会返回一个Bool类型

    遍历系统进程的完整代码

    void Ergodic_Process()
    {
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry;
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL fSuccess = Process32First(hSnapshot, &processEntry);
    if (fSuccess)
    {
    //表示如果成功获取到了快照中的第一个进程
    do
    {
    printf("进程id=%d,进程名字=%ls ", processEntry.th32ProcessID, processEntry.szExeFile);
    } while (Process32Next(hSnapshot, &processEntry));
    }
    }

    但是这个不支持中文,以下是修正版

    void Ergodic_Process()
    {
    setlocale(LC_ALL, "chs");
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry;
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL fSuccess = Process32First(hSnapshot, &processEntry);
    if (fSuccess)
    {
    //表示如果成功获取到了快照中的第一个进程
    do
    {
    printf("进程id=%d,进程名字=%ls ", processEntry.th32ProcessID, processEntry.szExeFile);
    } while (Process32Next(hSnapshot, &processEntry));
    }
    }

     

  • 相关阅读:
    实践2.2 内核模块编译
    Linux及安全课程——相关链接总结
    20135202闫佳歆--week 9 期中总结
    20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结
    20135202闫佳歆--week 8 课本第4章学习笔记
    20135202闫佳歆--week 7 深入理解计算机系统第七章--读书笔记
    20135202闫佳歆--week 8 进程的切换和系统的一般执行过程--学习笔记
    20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结
    laravel open_basedir restriction in effect
    workerman wss net::ERR_SSL_PROTOCOL_ERROR
  • 原文地址:https://www.cnblogs.com/beautiful7/p/14264627.html
Copyright © 2011-2022 走看看