web-dev-qa-db-ja.com

プロセスIDからプロセスハンドルを取得する方法

プロセスIDがあります。そのプロセスハンドルを取得します。

そのために利用できるAPIはありますか?.

OpenProcessを使用しようとしましたが、NULLを返し、GetLastError = 0を返しました。

これはVistaで試しています。

OpenProcessを使用する前にSeDebugPrivilegeを有効にする必要があると思います。しかし、SeDebugPrivilegeを有効にするには、そのプロセスハンドルを取得する必要があります。

21
anand
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

有効なプロセスIDを使用していること、およびプロセスから要求するアクセス権が許可されていることを確認する必要があります。

25
Matt Joiner

これはあなたが探しているものですか?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle); 

また、DLLを挿入する前にデバッグ権限を設定するために使用するコードもいくつかあります。

void Loader::EnableDebugPriv(void)
{
    HANDLE              hToken;
    LUID                SeDebugNameValue;
    TOKEN_PRIVILEGES    TokenPrivileges;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue))
        {
            TokenPrivileges.PrivilegeCount              = 1;
            TokenPrivileges.Privileges[0].Luid          = SeDebugNameValue;
            TokenPrivileges.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;

            if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
            {
                CloseHandle(hToken);
            }
            else
            {
                CloseHandle(hToken);
                throw std::exception("Couldn't adjust token privileges!");              
            }
        }
        else
        {
            CloseHandle(hToken);
            throw std::exception("Couldn't look up privilege value!");
        }
    }
    else
    {
        throw std::exception("Couldn't open process token!");
    }
}

上記のコードをWindows Vistaで使用して成功しました。

12
bdd

昇格された特権が必要です。同様の質問 here もご覧ください。

1
Igor

OpenProcess()== NULLおよびGetLastError()== 0と説明されているとおり、まったく同じ問題が発生しました。共通言語のRunTime Support設定であることが判明し、「Pure」に設定されているだけで「Common」になっているはずです。年齢を教えてもらいました。

VS2010の場合c ++ goto-> Project Properties-> Configuration Properties-> C/C++-> General

1
trgs

プロセスIDがある場合は、OpenProcess関数を呼び出してプロセスハンドルを取得できます。 OpenProcessを使用すると、ハンドルのアクセス権と、ハンドルを継承できるかどうかを指定できます。

ご参考までに:
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms684868(v = vs.85).aspx

0
herodot