• 017 虚拟内存页面区块 4


    ● VirtualQueryEx 函数

      功能:检索在指定进程的虚拟地址空间内的一系列页面的信息。

      函数参数

        参数1:hProcess [in]
          进程句柄
        参数2:lpAddress [in, optional]
          查询虚拟内存地址
        参数3:lpBuffer [out]
          MEMORY_BASIC_INFORMATION 结构体指针
        参数4:dwLength [in]
          结构体指针的大小
        返回值:
          函数写入lpBuffer的字节数,如果不等于sizeof(MEMORY_BASIC_INFORMATION)表示失败。

      MEMORY_BASIC_INFORMATION 结构体
      typedef struct _MEMORY_BASIC_INFORMATION {
      PVOID BaseAddress; // 区域基地址。
      PVOID AllocationBase; // 分配基地址。
      DWORD AllocationProtect; // 区域被初次保留时赋予的保护属性。
      SIZE_T RegionSize; // 区域大小(以字节为计量单位)。
      DWORD State; // 状态(MEM_FREE、MEM_RESERVE或 MEM_COMMIT)。
      DWORD Protect; // 保护属性。
      DWORD Type; // 类型。
      } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

        BaseAddress 与lpAddress参数的值相同
        AllocationBase 指明用VirtualAlloc函数分配内存区域的基地址。lpAddress在该区域之内
        AllocationProtect 指明该地址空间区域被初次保留时赋予该区域的保护属性。

        PAGE_READONLY 只读属性
        PAGE_READWRITE 允许读写
        PAGE_EXECUTE_READ 允许执行和读取。
        PAGE_EXECUTE_READWRITE 允许读写和执行代码。
        PAGE_EXECUTE_WRITECOPY 对于该地址空间的区域,不管执行什么操作,都不会引发访问违规
        PAGE_GUARD 在页面上写入一个字节时使应用程序收到一个通知(通过一个异常条件)
        PAGE_NOACCESS 禁止一切访问
        PAGE_NOCACHE 停用已提交页面的高速缓存。一般情况下最好不要使用该标志,因为它主要是供需要处理内存缓冲区的硬件设备驱动程序的开发人员使用的

        RegionSize 用于指明内存块从基地址即BaseAddress开始的所有页面的大小
        State 用于指明所有相邻页面的状态。
        MEM_FREE 空闲状态
        MEM_RESERVE 指明页面被保留
        Protect 用于指明所有相邻页面

        Type 用于指明支持所有相邻页面的物理存储器的类型(MEM_IMAGE,MEM_MAPPED或MEM_PRIVATE)
        MEM_IMAGE 指明该区域的虚拟地址原先受内存映射的映像文件(如.exe或DLL文件)的支持
        MEM_MAPPED 该区域的虚拟地址原先是受内存映射的数据文件的支持,但也许不再受数据文件的支持
        MEM_PRIVATE 指明该内存区域是私有的。不被其他进程共享

     1 #define UNICODE
     2 #include <stdio.h>
     3 #include <windows.h>
     4 #include <process.h>
     5 
     6 int main()
     7 {
     8     DWORD hProcessID = GetCurrentProcessId();
     9     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID);
    10     MEMORY_BASIC_INFORMATION mbi;
    11     if( sizeof(mbi) == VirtualQueryEx(hProcess, 0x0, &mbi, sizeof(mbi)))
    12     {
    13         printf("BaseAddr:0x%X Size:%d State:%d",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State);
    14     }
    15     return 0;
    16 }

     1 #define UNICODE
     2 #include <stdio.h>
     3 #include <windows.h>
     4 #include <process.h>
     5 
     6 int main()
     7 {
     8     DWORD hProcessID = GetCurrentProcessId();
     9     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hProcessID);
    10     MEMORY_BASIC_INFORMATION mbi;
    11     
    12     DWORD dwAddr = 0x0;
    13     while( sizeof(mbi) == VirtualQueryEx(hProcess, (LPVOID)dwAddr, &mbi, sizeof(mbi)))
    14     {
    15         printf("BaseAddr:0x%X Size:%d State:%d
    ",(UINT)mbi.BaseAddress, mbi.RegionSize, mbi.State);
    16         dwAddr += (DWORD)mbi.RegionSize;
    17     }
    18     return 0;
    19 }

  • 相关阅读:
    百度关键词搜索量查询,百度,谷歌关键词查询工具
    推荐免费服务免费空间服务器检测
    如何成为能让大家尊重的程序员
    四天玩转windows phone开发视频之第二天总结
    用三张图片详解Asp.Net 全生命周期
    程序员该如何规划自己的人生
    博客正式开通啦!
    技术与创业不矛盾(两者是先后关系)
    工作五年的感悟
    委托与事件以及应用
  • 原文地址:https://www.cnblogs.com/sdk123/p/7253496.html
Copyright © 2020-2023  润新知