Ответ 1
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
Вам нужно будет убедиться, что вы используете действительный идентификатор процесса, и что вы разрешаете права доступа, которые вы запрашиваете от процесса.
У меня есть идентификатор процесса, я хочу получить его дескриптор процесса.
Есть ли для этого API.
Я попытался использовать OpenProcess, но он возвращает NULL, а GetLastError = 0.
Это я использую Vista.
Я думаю, мне нужно включить SeDebugPrivilege перед использованием OpenProcess. Но для включения SeDebugPrivilege мне нужно получить свой дескриптор процесса.
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
Вам нужно будет убедиться, что вы используете действительный идентификатор процесса, и что вы разрешаете права доступа, которые вы запрашиваете от процесса.
Это то, что вы ищете?
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle);
Кроме того, вот некоторый код, который я использую для установки debug 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.
Вам нужны повышенные привилегии. Также посмотрите на аналогичный вопрос здесь.
У меня была точно такая же проблема, как описано: OpenProcess() == NULL и GetLastError() == 0. Выключенный в качестве параметра поддержки Common Language RunTime, был установлен в "Pure", должен был быть просто "общим". Принял меня, чтобы найти.
Для VS2010 С++ goto → Свойства проекта → Свойства конфигурации → C/С++ → Общие
Если у вас есть идентификатор процесса, вы можете получить дескриптор процесса, вызвав функцию OpenProcess. OpenProcess позволяет вам указать права доступа к дескриптору и может ли он быть унаследован.
FYI:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx