ホームページ  >  記事  >  バックエンド開発  >  C でプロセス ハンドルを名前で取得する方法

C でプロセス ハンドルを名前で取得する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-24 05:40:09616ブラウズ

How to Get a Process Handle in C   by its Name?

C でプロセスを名前で検索し、そのハンドルを取得する

多くの場合、プロセス名を知ってそのハンドルを取得することは、特定のプロセスを制御したり対話したりするために不可欠です。実行中のアプリケーション。これは、グラフィカル インターフェイスがなく、ウィンドウ ベースの手法を使用して特定できないプロセスを扱う場合には、より重要になります。このようなシナリオでは、プロセス ハンドルを名前で取得できるため、これらのアプリケーションの直接操作と制御が可能になります。

これを C で実現するには、次のソリューションを使用できます:

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

int main(int, char *[])
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Do stuff...

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}

このコードは、実行可能ファイル名を指定してプロセスのハンドルを取得します。 tlhelp32 ライブラリの CreateToolhelp32Snapshot 関数と Process32Next 関数を利用して、実行中のプロセスを列挙して検索します。実行可能ファイル名を比較してターゲット プロセスを特定すると、OpenProcess を使用してプロセス ハンドルを取得します。

ただし、PROCESS_ALL_ACCESS を使用してプロセスへのアクセスが必要な場合は、アクセス拒否の問題が発生する可能性があります。これを解決するには、SeDebugPrivilege 権限を有効にする必要があります。これは、AdjustTokenPrivileges API 呼び出しを通じて実行できます。必要な手順を組み込んだ修正コードを次に示します。

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

void EnableDebugPriv()
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);

    CloseHandle(hToken);
}

int main(int, char *[])
{
    EnableDebugPriv();

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Do stuff...

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}

これらのアプローチを組み込むことにより、名前でプロセス ハンドルを効果的に取得し、グラフィカル インターフェイスがなくてもプロセスを操作できます。

以上がC でプロセス ハンドルを名前で取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。