我有進程ID,我想獲得它的進程句柄。如何從進程ID獲取進程句柄?
有沒有可用的API。
我試圖使用OpenProcess,但它返回NULL,並GetLastError = 0。
這我試圖在Vista上。
我想我需要在使用OpenProcess之前啓用SeDebugPrivilege。 但爲了啓用SeDebugPrivilege,我需要獲取它的進程句柄。
我有進程ID,我想獲得它的進程句柄。如何從進程ID獲取進程句柄?
有沒有可用的API。
我試圖使用OpenProcess,但它返回NULL,並GetLastError = 0。
這我試圖在Vista上。
我想我需要在使用OpenProcess之前啓用SeDebugPrivilege。 但爲了啓用SeDebugPrivilege,我需要獲取它的進程句柄。
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
您需要驗證您是否使用了有效的進程ID,並且允許您從進程請求的訪問權限。
procId有效。 – anand 2010-02-08 11:14:04
不要求PROCESS_ALL_ACCESS,你不太可能在安全的安裝中獲得。只問你需要什麼。 – 2010-02-08 13:38:10
對,試着要求SYNCHRONIZE,它幾乎不會失敗。然後從那裏提高請求的許可。 – 2010-02-08 19:12:17
這是你在找什麼?
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle);
此外,這裏是一些代碼,我用於設置調試privledge在注入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. 原來是Common Language RunTime Support設置,被設置爲「Pure」應該只是「共同」。花了我很長時間才發現。
對於VS2010 C++轉到 - >項目屬性 - >配置屬性 - > C/C++ - >常規
如果你有一個進程標識符,您可以通過調用OpenProcess函數來獲取進程句柄。 OpenProcess使您能夠指定句柄的訪問權限以及它是否可以繼承。
FYI:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx
你能描述你爲什麼需要這個? – dirkgently 2010-02-08 11:11:49
我已經爲ya添加了調試權限代碼 – bdd 2010-02-08 12:46:27