【发布时间】:2012-01-17 16:26:08
【问题描述】:
我阅读了几篇关于如何检查一个进程是否已从另一个进程退出的帖子(我意识到有些人在这里迷上了语义,但只是幽默一下),我尝试实现它,但遇到了错误代码 5 ("ERROR_ACCESS_DENIED") 到处都是。
这就是我的工作。
1) 进程 1 (P1) 启动进程 2 并将其自己的 PID 写入共享内存位置。
2)进程2(P2)从共享内存中读取PID
3) P2 使用 P1 的 PID 调用 OpenProcess(...) 以保存它可以稍后检查的句柄。
4) P2 使用 P1 的 PID 反复调用 GetExitCodeProcess(...) 并检查 STILL_ACTIVE 代码。
在上述方法中,我在 GetExitCodeProcess 上不断收到 ACCESS_DENIED 错误。我尝试使用 MSDN 文档中的以下代码修改 P2 的权限:
HANDLE proc_h = OpenProcess(SYNCHRONIZE, FALSE, GetCurrentProcessId());
HANDLE hToken;
OpenProcessToken(proc_h, TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(NULL, lpszPrivilege, &luid );
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Enable the privilege
AdjustTokenPrivileges(hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);
但我在调用 OpenProcessToken(...) 方法时不断收到 ACCESS_DENIED 错误。那么这是否表明某种系统级别的障碍?我在我的机器上拥有管理员权限,并且我正在运行 XP。
提前感谢您的帮助。
【问题讨论】:
-
你能发布你的代码,在 P2 中打开 P1 的进程句柄吗?您是否在 OpenPROcess 的 desisredAccess 参数中指定 PROCESS_QUERY_INFORMATION 标志?
-
@Bukes,hmjd 猜到了问题所在。我使用的是 SYNCHRONIZE 权限,而不是 PROCESS_QUERY_INFORMATION。
标签: c++ windows visual-c++ privileges cross-process