У меня есть процедура, в которой я обрабатываю-прогулку, чтобы получить 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;
}
Некоторые вопросы, которые будут вам полезны:
- Я использую Windows 7 x64 Professional.
- Да, devenv.exe запускается с правами «Запуск от имени администратора», что означает, что отладчик и само приложение запускаются с одинаковой привязкой.
- Я пробовал переключать UAC или вообще запускать приложение с отключенным UAC. По-прежнему код ошибки 5.
- Я просто попытался сделать это с помощью
PROCESS_QUERY_LIMITED_INFORMATION
и получил код ошибки 6 илиERROR_INVALID_HANDLE
. Также попытка сPROCESS_QUERY_INFORMATION | PROCESS_VM_READ
, снова ошибка 5. SeDebugPrivilege
включен, проверено с помощью SysInternals 'Process Explorer. Вдобавок все процессы, порождаемые devenv / независимо от того, что называется отладчиком, наследуют SeDebugPrivilege, так что ... это странно.
Большое спасибо за ваше время, я дохожу до конца с этой проблемой: S
OpenProcess()
сPROCESS_QUERY_LIMITED_INFORMATION
, иGetLastError()
вернул ошибку 6 илиERROR_INVALID_HANDLE
:( - person David S.   schedule 22.12.2013HANDLE
для каждого процесса.) Используйте Process Explorer, чтобы узнать, какой ACL находится в процессе. Это скажет вам, почему вы не можете получить к нему доступ. - person Raymond Chen   schedule 22.12.2013