У меня есть рутина, где я обрабатываю, чтобы получить HANDLE
каждого процесса, когда я «иду» по списку (который работает нормально), но моя проблема заключается в следующем:
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID)
где PROCESS_ALL_ACCESS
является токеном доступа, дескриптор наследования установлен в FALSE
и pe32 является PROCESSENTRY32
GetLastError()
возвращает код ошибки 5, и все сделанные дескрипторы являются адресами, которые не соответствуют ни одному подходящему процессу в Spy ++ 32/64 (я пытался создать приложение под обеими целями платформы, но, как и следовало ожидать, результат тот же).
Код для настройки SeDebugPrivilege для хост-процесса, который я использую:
BOOL EnableDebugPrivilege(BOOL bEnable)
{
HANDLE hToken = nullptr;
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) return FALSE;
TOKEN_PRIVILEGES tokenPriv;
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luid;
tokenPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;
return TRUE;
}
Некоторые вопросы, которые будут вам полезны:
PROCESS_QUERY_LIMITED_INFORMATION
и я получаю код ошибки 6 или ERROR_INVALID_HANDLE
, Также пытался с PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
, результат снова ошибка 5.SeDebugPrivilege
включен, проверяется с помощью SysInternals Process Explorer. Кроме того, все процессы, которые происходят из devenv / независимо от того, что называется отладчиком, наследуют SeDebugPrivilege, так что … это странно. Спасибо всем большое за ваше время, я дошел до конца с этим вопросом: S
Вы уверены, что не передаете 0 в качестве значения идентификатора процесса? Процесс простоя системы с идентификатором 0 включен в снимок под именем [Системный процесс], но вы не можете открыть дескриптор для него, так как в документации для OpenProcess конкретно сказано, что он потерпит неудачу. Ну, это говорит немного больше:
Если указанный процесс является системным процессом (0x00000000),
Сбой функции и последний код ошибки ERROR_INVALID_PARAMETER. Если
указанный процесс является процессом Idle или одним из CSRSS
процессы, эта функция не выполняется и последний код ошибки
ERROR_ACCESS_DENIED, потому что их ограничения доступа препятствуют
код уровня пользователя от их открытия.
Ну, это не совсем верно, так как я смог открыть дескриптор CSRSS (конечно, у него нет запрошенных прав). Но это может не сработать для некоторых защищенных процессов (audiodg), поэтому вы не должны этого делать. Вместо этого проверьте название процесса, если это тот, который вы хотите.
Других решений пока нет …