gpt4 book ai didi

c++ - OpenProcess() 成功,但 EnumProcessModules() 失败

转载 作者:太空狗 更新时间:2023-10-29 23:46:42 27 4
gpt4 key购买 nike

我在 Windows 服务中执行了以下代码在 Windows XP 32 位上:

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 Service部署在多台机器和部分机器上(我无权访问)EnumProcessModules() 调用失败并返回 ERROR_PARTIAL_COPY。据我所知,这在查询流程时失败了由登录用户启动:我无法重现这个并尝试了以下操作:

  • 使用 Process Explorer,拒绝本地系统帐户读取内存并将内存访问写入由登录用户启动的进程。
  • 在不同的 session 中启动进程(Windows 服务和进程由第一个登录用户启动,在同一 session 中执行,0)

谁能解释这种行为?

请注意,我看到此行为的唯一进程是系统进程(通常是进程 ID 4)。

最佳答案

documentation包含答案:

If this function is called from a 32-bit application running on WOW64, it can only enumerate the modules of a 32-bit process. If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299).

返回此错误代码的机器是 64 位系统,您正在枚举其模块的进程是 64 位进程。

要从您的 32 位服务枚举 64 位进程的模块,您需要使用 EnumProcessModulesEx . 事实上,您可能需要运行 64 位进程才能枚举进程模块。

更新:您显然确定代码失败的系统是 32 位系统。在那种情况下,失败可能是当您尝试枚举 16 位进程的模块时。

关于c++ - OpenProcess() 成功,但 EnumProcessModules() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533810/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com