Это странно. Ранее, работая под управлением Windows 7 x64, у меня возникали проблемы с вызовом Win32 OpenProcess для 64-битных процессов. Погуглил немного и пришел к тонущему выводу, что этого просто не произойдет.
Потом произошла забавная вещь. Я попробовал это против идентификатора процесса для explorer.exe и holy carp , это сработало! Начали бросать другие идентификаторы процессов, и это просто проклятая стрельба.
Как оказалось, я могу вызывать OpenProcess для большого числа x64-процессов - explorer, itype, ipoint, taskhost, cmd, mstsc, ... и т. Д.
И другие выдают 5 (Доступ запрещен) - winlogon, csrss, services, svchost, mdm, ...
Я подтверждаю «разрядность» и идентификатор процесса с помощью Process Explorer. Кроме того, вызов GetModuleFileNameEx в 64-разрядных процессах всегда завершается неудачей, поэтому предлагается двойная проверка для 32/64.
Это код:
' Get a handle to the process.
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
If hProcess Then
' Grab the filename for base module.
nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
' If running in x64, http://winprogger.com/?p=26
If Err.LastDllError = ERROR_PARTIAL_COPY Then
nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
End If
' Truncate and return buffer.
If nChars Then
GetProcessFileName = Left$(Buffer, nChars)
End If
Call CloseHandle(hProcess)
Else
Debug.Print "LastDllError:"; Err.LastDllError
End If
Ничего особенного. Просто хочу запросить процессы для таких вещей, как имя файла или время процесса. Кто-нибудь знает, что отличает тех, кого я могу открыть от тех, которые я не могу?
Дополнительная информация: Запуск процесса от имени администратора. UAC выключен. Да, это 32-битное приложение. У меня не было лучших результатов при использовании PROCESS_QUERY_LIMITED_INFORMATION.
Спасибо ... Карл