我在Windows XP 32位上的Windows服务中执行以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
Windows服务部署在许多计算机和某些计算机上(我无权访问),EnumProcessModules()调用失败ERROR_PARTIAL_COPY.据我所知,在查询已登录用户启动的进程时,这会失败:我无法重现此操作并尝试以下操作:
0)谁能解释这种行为?
注意,我看到这种行为的唯一过程是系统进程(通常是进程ID 4).
该文档包含答案:
如果从WOW64上运行的32位应用程序调用此函数,则它只能枚举32位进程的模块.如果进程是64位进程,则此函数失败,最后一个错误代码为ERROR_PARTIAL_COPY(299).
返回此错误代码的计算机是64位系统,您枚举的模块的进程是64位进程.
要从您的32位服务枚举64位进程的模块,您需要使用实际上,您可能需要运行64位进程才能枚举进程模块.EnumProcessModulesEx.
更新:您显然确定代码失败的系统是32位系统.在这种情况下,可能失败的是当您尝试枚举16位进程的模块时.