模块信息不能与DEBUG_PROCESS一起工作
Module information not working with DEBUG_PROCESS
我正在尝试创建一个带有DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS标志的进程。
由于某种原因,当我尝试使用方法,如"GetModuleFileNameExA",我得到"ERROR_INVALID_HANDLE"错误。
我知道我的进程句柄是正确的,但即使我像这样调用方法,它也会发生:
GetModuleFileNameExA(processHandle, NULL ,moduleFileName, sizeof(moduleFileName));
,它应该给出进程的主模块的名称。
我在MSDN中读到标志:PROCESS_VM_READ和PROCESS_QUERY_INFORMATION是该进程创建所必需的,但我与DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS一起尝试了它,它没有帮助。
当我将程序附加到一个正在运行的进程时,它工作得很好。
我做错了什么?
如果成功,则CreateProcess返回的句柄具有PROCESS_ALL_ACCESS
,因此这不是问题。什么是一个问题是,在CreateProcess之后,Windows还没有执行初始化,因此没有设置模块列表。无论你使用什么接口(Toolhelp, psapi, kernel32),试图查询被调试对象的模块(甚至是主模块)都会失败。
您最好的选择是等待CREATE_PROCESS_DEBUG_EVENT
,然后查询。如果您需要加载dll的名称,则必须等待它们加载并接收LOAD_DLL_DEBUG_EVENT
。上次我在XP上检查时,它们也不能在这里查询,您必须等待下一个调试事件才能获得这些信息。
也许诉诸原生NT API可能会有所帮助,或者它可能会在Vista及更高版本中修复。
出于好奇,当你在调用CreateProcess时清楚地拥有模块文件名时,为什么还需要它?
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?