Winapi 有没有办法确定VirtualQuery()返回的段是什么类型的内存?

Winapi 有没有办法确定VirtualQuery()返回的段是什么类型的内存?,winapi,memory-management,Winapi,Memory Management,您好 我能够使用如下逻辑遍历进程内存映射: MEMORY_BASIC_INFORMATION mbi; void *lpAddress=(void*)0; while (VirtualQuery(lpAddress,&mbi,sizeof(mbi))) { fprintf(fptr,"Mem base:%-10x start:%-10x Size:%-10x Type:%-10x State:%-10x\n",

您好

我能够使用如下逻辑遍历进程内存映射:

    MEMORY_BASIC_INFORMATION mbi;
    void *lpAddress=(void*)0;
    while (VirtualQuery(lpAddress,&mbi,sizeof(mbi))) {
        fprintf(fptr,"Mem             base:%-10x start:%-10x Size:%-10x Type:%-10x State:%-10x\n",
            mbi.AllocationBase,
            mbi.BaseAddress,
            mbi.RegionSize,
            mbi.Type,mbi.State);
        lpAddress=(void *)((unsigned int)mbi.BaseAddress + (unsigned int)mbi.RegionSize);
    }
我想知道给定的段是否用于静态分配、堆栈和/或堆和/或其他


有什么办法可以确定吗?

我很好奇,你打算用这些信息做什么

有一个windbg扩展!地址,如果不需要代码,它可以获取此信息。为调试器编写脚本可能会更可靠地获取此信息

VirtualQuery无法自行将此信息返回给您,因为它不知道用户模式代码请求内存的原因。您需要将它与其他信息源一起使用以获取此信息,并且可能仍然存在一些错误情况

首先,您应该只按MEM_私有内存进行筛选。如果修改了堆、堆栈和静态分配,则它们应该在该范围内

静态分配全局变量等应位于加载模块的地址。您可以使用PSAPI确定地址是否在加载的模块内,例如,调用EnumProcessModules,然后调用GetModuleInformation

堆栈值时,可以使用toolhelp API确定内存位置是否在堆栈中。CreateToolhelp32Snapshot与TH32CS_SNAPSHOT一起获取目标进程中的线程,然后GetThreadContext并检查生成的堆栈指针是否在段内


我不知道有什么好方法可以从流程之外处理成堆的问题。Toolhelp捕捉堆列表,但不会为堆内存提供一组好的边界。在进程内,您可以使用GetProcessHeaps遍历堆列表,然后如果内存位置在堆内,则调用HeapValidate到dtermie。

我很好奇,您打算如何处理这些信息

有一个windbg扩展!地址,如果不需要代码,它可以获取此信息。为调试器编写脚本可能会更可靠地获取此信息

VirtualQuery无法自行将此信息返回给您,因为它不知道用户模式代码请求内存的原因。您需要将它与其他信息源一起使用以获取此信息,并且可能仍然存在一些错误情况

首先,您应该只按MEM_私有内存进行筛选。如果修改了堆、堆栈和静态分配,则它们应该在该范围内

静态分配全局变量等应位于加载模块的地址。您可以使用PSAPI确定地址是否在加载的模块内,例如,调用EnumProcessModules,然后调用GetModuleInformation

堆栈值时,可以使用toolhelp API确定内存位置是否在堆栈中。CreateToolhelp32Snapshot与TH32CS_SNAPSHOT一起获取目标进程中的线程,然后GetThreadContext并检查生成的堆栈指针是否在段内


我不知道有什么好方法可以从流程之外处理成堆的问题。Toolhelp捕捉堆列表,但不会为堆内存提供一组好的边界。在进程内,您可以使用GetProcessHeaps遍历堆列表,然后如果内存位置在堆内,则调用HeapValidate到dtermie。

将此信息用作应用程序自定义内存管理器的一部分。堆栈页/内存区域似乎是MEM_IMAGE而不是MEM_PRIVATE?堆栈肯定是私有的。如何获取要检查的堆栈地址?将此信息用作应用程序自定义内存管理器的一部分。堆栈页/内存区域似乎是MEM_IMAGE而不是MEM_PRIVATE?堆栈绝对是私有的。如何获取正在检查的堆栈地址?