2013-12-22 4 views
1

У меня есть процедура, в которой я обрабатываю процесс, чтобы получить HANDLE каждого процесса, когда я «иду» по списку (который отлично работает), но моя проблема заключается, когда я делаю:WinAPI: OpenProcess() возвращает ошибку 5 с включенным SeDebugPrivilege для хост-процесса

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID) где PROCESS_ALL_ACCESS находится маркер доступа, ручка наследования устанавливается в FALSE и PE32 является PROCESSENTRY32

GetLastError() код возвращает ошибку 5, и все ручки, которые сделаны являются адресами которые не соответствуют какому-либо соответствующему процессу в Spy ++ 32/64 (я попытался создать приложение на обеих платформах t argets, но, как и следовало ожидать, результат будет таким же).


Код для установки 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; 
} 

Некоторые вопросы, которые были бы полезны для вас:

  1. Я m работает под управлением Windows 7 x64 Professional.
  2. Да, devenv.exe запускается с привилегиями «Запуск от имени администратора», что означает, что отладчик и приложение запускаются с одинаковой близостью.
  3. Я попытался переключить UAC или запустить приложение с UAC полностью. Еще код ошибки 5.
  4. Я только что попытался сделать это с PROCESS_QUERY_LIMITED_INFORMATION и получаю код ошибки 6, или ERROR_INVALID_HANDLE. Также попытался с PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, результатом является ошибка 5 снова.
  5. SeDebugPrivilege включен, проверен с помощью Process Explorer системы SysInternals. Кроме того, все процессы, которые появляются из devenv/независимо от того, что называется отладчиком, наследуют SeDebugPrivilege, так что ... это странно.

Спасибо всем большое за ваше время, я тянусь остряки закончить с этим вопросом: S

+0

Возможный дубликат http: // stackoverflow.com/questions/169355/vc-2008-openprocess-always-returns-error-5-access-denied – Xearinox

+0

@Xearinox: Я видел этот вопрос и применял то, что ответили (а): SeDebugPrivilege. –

+0

Вам действительно нужны права PROCESS_ALL_ACCESS? – Xearinox

ответ

1

Вы уверены, что вы не пропуская 0 в качестве значения ID процесса? Процесс бездействия системы с идентификатором 0 включается в моментальный снимок под названием [Системный процесс], но вы не можете открыть дескриптор для него, поскольку в документации для OpenProcess указано, что он будет терпеть неудачу. Ну это говорит немного больше:

Если указанный процесс является система процессов (0x00000000), функция терпит неудачу, и последний код ошибки ERROR_INVALID_PARAMETER. Если указанный процесс - это процесс Idle или один из процессов CSRSS , эта функция завершается с ошибкой, а последний код ошибки равен ERROR_ACCESS_DENIED, поскольку их ограничения доступа не позволяют код пользовательского уровня открыть их.

Ну, это не совсем так, поскольку я смог открыть дескриптор CSRSS (конечно, на самом деле у него нет запрошенных прав). Но это может привести к сбою некоторых защищенных процессов (audiodg), поэтому вы не должны этого делать. Вместо этого проверьте имя процесса, если он тот, который вы хотите.

+0

Я закончил с советом @ RaymondChen и только открывал дескрипторы приложений, в которых мне нужно открывать дескрипторы. Похоже, что это лучший подход, спасибо! :) –