OpenProcess在64位平台上返回access_denied

时间:2009-05-13 12:25:10

标签: c++ winapi 64-bit

我有一个功能:

HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

...

result=Process32First(snapshot,&pe);
while(result) {
  if(!_stricmp(process_name,pe.szExeFile)) {
    processes.push_back(pe.th32ProcessID);
  }
  result=Process32Next(snapshot,&pe);
}

for(dword_vector::iterator i=processes.begin(); i!=processes.end(); ++i){
  HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, *i);
  if(hProcess) {
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
  }
}

它在32位平台上运行良好,但在64位平台上,OpenProcess为某些进程返回Access_denied(32位上的相同进程可以很好地计算)。我试图打开的所有进程都是32位。

可能有什么问题?

4 个答案:

答案 0 :(得分:0)

您在64位平台上登录的用户是否无权终止这些进程?例如在Vista上,UAC处于活动状态,您是管理员,但没有运行升级并尝试关闭系统进程。

答案 1 :(得分:0)

这可能真的存在,但您是否正在执行网络驱动器中的代码?我已经看到.NET应用程序在从网络驱动器运行时无法完成非常基本的操作。

如果是,请尝试将可执行文件移动到本地磁盘,看看是否有帮助。

是的,我知道这是一个非常奇怪的建议,我只想知道这是否有问题: - )

答案 2 :(得分:0)

您的应用程序是64位进程还是32位进程?您无法从32位进程打开64位进程。

使用任务管理器确保您的应用程序是64位的。如果没有,修复并将其编译为64位,您应该能够打开其他64位进程和32位进程。

如果您的应用是32位,则可能是权限问题。尝试以管理员身份运行它,看看是否能解决问题。

答案 3 :(得分:0)

我对操作有相同的假设。经过多次测试后,我知道access_denied过程的原因是它们在SYSTEM用户下,而不是因为它们是64位。