这很奇怪。早些时候,在运行 Windows 7 x64 时,我在针对 64 位进程调用 Win32 OpenProcess 时遇到了麻烦。谷歌搜索了一下,得出的结论是这不会发生。
然后发生了一件有趣的事情。我针对 explorer.exe 的进程 ID 和圣鲤进行了尝试,它成功了!开始向它扔其他进程ID,这只是一个该死的废话。
事实证明,我可以针对大量 x64 进程调用 OpenProcess —— explorer、itype、ipoint、taskhost、cmd、mstsc 等等。
其他人弹出 5(拒绝访问)--winlogon、csrss、服务、svchost、mdm、...
我正在使用 Process Explorer 确认“位数”和进程 ID。另外,在 64 位进程上调用 GetModuleFileNameEx 总是失败,因此提供了对 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 没有更好的结果。
谢谢...卡尔