- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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
。据我所知,这在查询流程时失败了由登录用户启动:我无法重现这个并尝试了以下操作:
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 位进程的模块,您需要使用
事实上,您可能需要运行 64 位进程才能枚举进程模块。EnumProcessModulesEx
.
更新:您显然确定代码失败的系统是 32 位系统。在那种情况下,失败可能是当您尝试枚举 16 位进程的模块时。
关于c++ - OpenProcess() 成功,但 EnumProcessModules() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533810/
是否有 OpenProcess 函数的内核模式版本? 基本上我想从进程 ID 获取进程句柄。具体来说,我想获取系统进程ID的句柄。 谢谢! 最佳答案 如果您位于任意系统线程中,则可以使用 ZwCurr
我正在开发一个应用程序,它可以创建多个桌面并让用户能够在他当前使用的桌面下启动他想要的任何应用程序。 当该桌面关闭时(使用组合键)我想关闭在该桌面下打开的所有应用程序。为此,我使用 EnumProce
我对 win32 api 的 OpenProcess 函数有这个问题。程序旨在通过用户输入从给定程序 PID 和整数地址的程序中读取整数。 int main() { DWORD pidz; int
为了保护我的程序,我想进行检查以检测任何使用我的 PID 执行 OpenProcess 的程序?我想防止其他程序可以轻松获取我的程序的句柄。 我有哪些选择? (WinAPI 等)一旦另一个程序使用 O
在我的 manager.exe 中,我试图更改由我的 service.exe 启动的 worker.exe 的 CPU 使用率。 Service.exe 在系统帐户下运行,而 manager.exe
我有一个应用程序打开另一个非系统 32 位进程,并尝试使用 EnumProcessModulesEx 获取其加载模块的列表,并使用 GetModuleFileNameEx 获取每个模块的路径.它在我的
我正在尝试编写一个程序,该程序从当前目录中的 MinGW 发行版执行 make.exe,并使用其 STDOUT 数据和退出代码。我有一个处理 STDOUT 的句柄,我从中获取数据,使用 CreateP
当我运行我的程序时发生了一些奇怪的事情。当我在 VS 2010 中使用“不调试启动”选项运行它时,OpenProcess 照常返回进程句柄,但是当我在 Windows 资源管理器中运行我的程序时,Op
我正在尝试使用 Visual Studio 2012、c++ 控制台应用程序打开进程并收到 87 错误: #include #include #include #define EXTERN_DL
我制作了这个简单的类来打开一个进程并从中读取内存:问题是当我使用任何内存地址 ReadProcessMemory 调用 ReadDWORD 时失败,错误代码为 6:ERROR_INVALID_HAND
此程序枚举所有句柄并获取它们的名称。 对于 pID 4,OpenProcess 使用 SeDebugPrivilege 获得错误 5。 UAC 关闭。从管理员运行。 启用 SeDebugPrivile
在 Windows 中,我可以通过 CreateProcess() 获取 PROCESS_INFORMATION。但是,是否可以通过 OpenProcess() 获取 PROCESS_INFORMAT
我使用 Windows Hook 向我的应用程序发送消息,系统上的每个应用程序都会通知该应用程序有关 Windows 事件。 为了执行消息参数的编码,我使用了共享内存。外部进程调用 Duplicate
我在实现读取外部进程内存的算法时遇到了一些问题。这是主要代码: System.Diagnostics.Process.EnterDebugMode();
我一直在阅读 Hoglund 的一些书,我想我会在他的“简单调试器”上“开始”... 反正我一直在尝试用线 hProcess = OpenProcess(PROCESS_ALL_ACCESS | PR
根据微软文档,dwDesiredAccess 参数可以是一个或多个进程访问权限。 我想在调用 openProcess 函数时传递两个不同的 dwDesiredAccess(PROCESS_QUERY_
我在 Windows 平台上运行以下代码。目的是了解特定进程 ID 是否引用现有进程。 BOOL bProcessExists = FALSE; HANDLE hProcHandle = ::Open
我正在尝试从 Kernel32.dll Hook OpenProcess 以防止所谓的“injector”程序注入(inject)其他 dll进入我的过程: // ------------------
我正在努力枚举所有用户的 iexplore.exe 实例。我能够获得机器上匹配进程的列表,但要识别用户,我需要使用 OpenProcess。这适用于我自己的实例,但即使以管理员身份运行和 Enable
这些 Windows 函数的等效 API 是什么?如果您不熟悉 Windows 函数,它们所做的只是打开一个进程,访问(读取和写入)它的内存并关闭它的句柄。 这也可以只用系统调用来完成吗? 最佳答案
我是一名优秀的程序员,十分优秀!