我有下面的代码在Windows服务 在Windows XP上执行32位:OpenProcess()成功,但EnumProcessModules()失败
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
a_impl->pid);
if (0 == h)
{
throw Process_exception(__LINE__,
__FILE__,
"Failed obtain module list for '" +
a_impl->exe_name + "'",
GetLastError());
}
DWORD required_size = 1024 * sizeof(HMODULE);
DWORD module_entries = 0;
BOOL result;
DWORD last_error;
HMODULE* module_handles = 0;
do
{
module_entries = required_size/sizeof(HMODULE);
delete[] module_handles;
module_handles = new HMODULE[module_entries];
memset(module_handles, 0, sizeof(HMODULE) * module_entries);
result = EnumProcessModules(h,
module_handles,
sizeof(HMODULE) * module_entries,
&required_size);
last_error = GetLastError();
} while (TRUE == result &&
required_size > (sizeof(HMODULE) * module_entries));
if (FALSE == result)
{
CloseHandle(h);
delete[] module_handles;
throw Process_exception(__LINE__,
__FILE__,
"Failed to enumerate module list for '" +
a_impl->exe_name + "'",
last_error);
}
Windows服务部署在许多机器和一些机器 (我没有访问) EnumProcessModules()
呼叫失败ERROR_PARTIAL_COPY
。 此操作失败,据我所知,在查询 通过登录的用户启动的进程:我已经无法重现此 和尝试以下操作:
- 使用Process Explorer中,否认了本地系统帐户读取内存 并写入内存访问由登录用户启动的进程。
- 启动流程在不同的会话(Windows服务和进程开始 第一登录的用户执行在同一会话,
0
)
任何人都可以解释这种现象?
请注意,我见过这种行为的唯一过程是系统进程 (通常是进程ID 4)。
对不起,我应该说,它是32位XP平台。 – hmjd 2012-03-02 13:24:32
好的,但您无法访问的机器将是64位。 – 2012-03-02 13:24:58
由于无法访问我个人指的是我:我无法登录并查看。数据是从这些机器远程收集的,包括架构和Windows平台以及任何失败消息。 – hmjd 2012-03-02 13:26:58