プロセスIDがあります。そのプロセスハンドルを取得します。
そのために利用できるAPIはありますか?.
OpenProcessを使用しようとしましたが、NULLを返し、GetLastError = 0を返しました。
これはVistaで試しています。
OpenProcessを使用する前にSeDebugPrivilegeを有効にする必要があると思います。しかし、SeDebugPrivilegeを有効にするには、そのプロセスハンドルを取得する必要があります。
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
有効なプロセスIDを使用していること、およびプロセスから要求するアクセス権が許可されていることを確認する必要があります。
これはあなたが探しているものですか?
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で使用して成功しました。
昇格された特権が必要です。同様の質問 here もご覧ください。
OpenProcess()== NULLおよびGetLastError()== 0と説明されているとおり、まったく同じ問題が発生しました。共通言語のRunTime Support設定であることが判明し、「Pure」に設定されているだけで「Common」になっているはずです。年齢を教えてもらいました。
VS2010の場合c ++ goto-> Project Properties-> Configuration Properties-> C/C++-> General
プロセスIDがある場合は、OpenProcess関数を呼び出してプロセスハンドルを取得できます。 OpenProcessを使用すると、ハンドルのアクセス権と、ハンドルを継承できるかどうかを指定できます。
ご参考までに:
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms684868(v = vs.85).aspx