zoukankan      html  css  js  c++  java
  • Windows API编程----枚举系统进程

    1.该函数可以检索系统中的每个进程的标识符(进程ID)

    BOOL WINAPI EnumProcesses(
      _Out_ DWORD *pProcessIds,
      _In_  DWORD cb,
      _Out_ DWORD *pBytesReturned
    );
    cb为pProcessIds指向的内存空间的字节数,(*pBytesReturned)/sizeof(DWORD)即为pProcessIds中返回的进程ID的个数。


    2.检索制定进程中的每个模块的句柄

    BOOL WINAPI EnumProcessModules(
    _In_ HANDLE hProcess,
    _Out_ HMODULE *lphModule,
    _In_ DWORD cb,
    _Out_ LPDWORD lpcbNeeded
    );

    hProcess:  进程句柄

    lphModule: 接收module句柄的数组

    cb: lphModule数组的字节数

    lpcbNeeded: 在lphModule 数组中存储所有module句柄所需的字节数(可以先将lphModule设置为NULL,cb设置为0,来调用该函数,然后用lpcbNeeded中存储的字节数来分配lphModule的空间,然后再重新调用EnumProcessModules)

    3.检索制定的Module的 base name

    DWORD WINAPI GetModuleBaseName(
    _In_ HANDLE hProcess,
    _In_opt_ HMODULE hModule,
    _Out_ LPTSTR lpBaseName,
    _In_ DWORD nSize
    );

    hProcess: 包含 Module 的进程的句柄

    hModule: 要检索的Module的句柄;如果该参数为NULL,该函数返回调用该函数的进程的名字

    lpBaseName: 用来接收Module名字的buffer;buffer空间不够的话,base name就被截断

    nSize:lpBaseName buffer的空间大小

    返回值:调用成功,则返回copy到lpBaseName中的字符串的长度;调用失败,则返回0

    示例程序:

    #include<iostream>
    #include<Windows.h>
    #include<Psapi.h>
    using namespace std;
    
    void PrintProcessNameAndID(DWORD processID);
    
    int main(int argc, char* argv[])
    {
        //获得进程标识符列表
        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
            return 1;
        //计算返回进程标识符的个数
        cProcesses = cbNeeded / sizeof(DWORD);
        for (i = 0; i < cProcesses; i++)
        {
            PrintProcessNameAndID(aProcesses[i]);
        }
        system("pause");
        return 0;
    }
    
    void PrintProcessNameAndID(DWORD processID)
    {
        char szProcessName[MAX_PATH] = "unknown";
        //得到进程句柄
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
    
        if (NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
                GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName));
            }
            else return;
        }
        else 
            return;
        printf("%s (Process ID:%u)
    ", szProcessName, processID);
        CloseHandle(hProcess);
    }
  • 相关阅读:
    for each/in
    对象与结构体的区别
    php与构造函数和析构函数
    回顾PHP之类与对象
    回顾PHP之数组篇
    正则个人总结
    echo 与print_r??
    六月学习与感想
    晚到的五月博客
    java复习
  • 原文地址:https://www.cnblogs.com/dongling/p/5563405.html
Copyright © 2011-2022 走看看