进程的遍历、获取与销毁

创建快照遍历

//获得进程所使用的堆,模块和线程的信息快照
HANDLE WINAPI CreateToolhelp32Snapshot
(
        DWORD dwFlags,//标志位
        DWORD th32ProcessID //进程ID
)
//dwFlags: 指定的快照中,指定需要拍的系统部分
TH32CS_INHERIT          声明快照句柄是可继承的。
TH32CS_SNAPALL          在快照中包含系统中所有的 进程和线程。
TH32CS_SNAPHEAPLIST     在快照中包含ID所指定的进程的所有的堆。
TH32CS_SNAPMODULE       在快照中包含在ID所指定的进程的所有的模块。
TH32CS_SNAPPROCESS      在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD       在快照中包含系统中所有的线程。
BOOL WINAPI Process32First(
    HANDLE   hSnapshot,     //快照句柄  
    LPPROCESSENTRY32 lppe    //获得的信息
);获得快照中的第一个成员的信息
BOOL WINAPI Process32Next(
    HANDLE   hSnapshot,       //快照句柄
    LPPROCESSENTRY32 lppe    //获得的信息
);获得快照中后一个成员的信息

函数实现

DWORD find_processid_by_nameW(PWCHAR process_name)
{
    HANDLE hand = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if ((int)hand == -1)
    {
        return GetLastError();
    }
    PROCESSENTRY32 process_info = { 0 };
    process_info.dwSize = sizeof PROCESSENTRY32;
    if (!Process32First(hand, &process_info))
    {
        return GetLastError();
    }
    do
    {
        if (!wcscmp(process_info.szExeFile, process_name))
        {
            return process_info.th32ProcessID;
        }
    } while (Process32Next(hand,&process_info));
    return 0;
}

进程的获取与销毁

//进程的获取
HANDLE OpenProcess(
  DWORD dwDesiredAccess,  // 访问权限标识
  BOOL bInheritHandle,    // 获取的句柄能否被继承
  DWORD dwProcessId       // 目标进程的标识符
);
//退出
VOID ExitProcess(
    UINT uExitCode   // 退出代码 (谁调用谁结束)
);
BOOL TerminateProcess(
  HANDLE hProcess, // 关闭进程的句柄
  UINT uExitCode   // 进程的退出代码
);

exp:

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess)
{
    MessageBox(NULL, process_name, L"打开进程了!", MB_OK);
    TerminateProcess(hProcess, 0);
}