Windows プロセスの列挙

Windows PC 上で走っているプロセス一覧を取りたいことがあります。

いままではプロセスをデバッグモードで起動して DLL 一覧を取ったりしていたのですが、便利な API があることに気づきました。(知らなかっただけ??)

https://learn.microsoft.com/ja-jp/windows/win32/toolhelp/taking-a-snapshot-and-viewing-processes

#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

/*
* 指定したプロセスが読み込む DLL を取得する
 */
bool EnumDLLChildren(DWQRD dwProcID) {
    HANDLE hModSnap;
    MODULEENTRY32 me32;

    hModSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcID);
    if (hModSnap == INVALID_HANDLE_VALUE) {
        return false;
    }
    me32.dwSize = sizeof(me32);
    if (!Module32First(hModSnap, &me32)) {
        CloseHandle(hModSnap);
        return false;
    }
    do {
        wcout << L"Module:" << me32.szExePath << std::wendl;
    } while (Module32Next(hModSnap, &me32));
    CloseHandle(hModSnap);
    return true;
}

/**
 * 起動している全てのプロセス名を取得する
 */
bool EnumInvokedProcesses() {
    HANDLE hProcSnap;
    HANDLE hProc;
    PROCESSENTRY32 pe32;

    // プロセス一覧を取得する
    hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcSnap == INVALID_HANDLE_VALUE) {
        return false;
    }
    pe32.dwSize = sizeof(pe32);
    if (!Process32First(hProcSnap, &pe32)) {
        CloseHandle(hProcSnap);
        return false;
    }
    do {
        wcout << L"Process:" << pe32.szExeFile << std::wendl;

        // 読み込んでいる DLL 一覧を取得する
        EnumDLLChildren(pe32.th32ProcessID);
    } while (Process32Next(hProcSnap, &pe32));

    CloseHandle(hProcSnap);
    return true;
}

今までの苦労は何だったのだろうか。。

投稿者について
みのしす

小さいときは科学者になろうとしたのに、その時にたまたま身に着けたプログラミングで未だに飯を食っているしがないおじさんです。(年齢的にはもうすぐおじいさん)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です