我需要确定一个进程的有效地址空间,现在已经排除了系统模块(也就是系统DLL)的地址,但是没法更加准确的判断那些commit的地址空间是有用的,请高手不吝赐教!!!!

解决方案 »

  1.   

    写驱动,或者通过安装callgate,进入ring0,dump进程的页表目录。检查每个表项的LSB位(Least Significant Bit)。 只有LSB位被置为1时,表项指向的页表才是有效的。
      

  2.   

    我指的是已经提交了的页面,有些提交的物理页面是已经用过的,但是已经没有有用的数据的页面.具体的来说一个进程大概有4g的空间除去保留的和内核用的大概2g,这2g的空间有的是保留有的是提交了的,提交的页面中就有已经用过的数据但是已经被用户舍弃打的.
      

  3.   

    to codewarrior(会思考的草) 
      有没有简单一点的办法?
      

  4.   

    The VirtualQueryEx function provides information about a range of pages within the virtual address space of a specified process.
      

  5.   

    唔……这样,原来你想得到dirty但是废弃的页……
    我想不写驱动是不可能的,这些结构是os 虚拟内存管理器非常重要的结构,windows不可能把这些东西放到用户地址空间去。你可以试试读取页帧数据库(Page Frame Database ,PFD),这是一个数组,每个元素24个byte,保存已经装入物理内存的页面信息。因为物理内存中的页面有6中可能属性,所有有6个变量分别指向,构成一个双向链表:
    MmStandbyPageListHead
    MmModifiedNoWritePageListHead
    MmModifiedPageListHead
    MmFreePageListHead
    MmBadPageListHead
    MmZeroedPageListHead
      

  6.   

    表头定义:
    typedef struct PageListHead 
    {
        DWORD NumberOfPagesInList,
        DWORD TypeOfList,
        DWORD FirstPage,
        DWORD LastPage
    }PageListHead_t;PFD中每个表项是一个结构体:
    typedef struct PfdEntry 
    {
      DWORD NextPage,
      void *PteEntry/*PpteEntry,
      DWORD PrevPage,
      DWORD PteReferenceCount,
      void *OriginalPte,
      DWORD Flags;
    }PfdEntry_t;
      

  7.   

    其实写驱动只是为了进入特权级别,这些重要的数据结构都在内核地址空间内,从用户态是不能访问的。
    至于怎么写驱动……天那,太复杂了,你自己去找个把例子see see吧。
      

  8.   

    呵呵,其实也不是很难,和写DLL几乎一模一样。
      

  9.   

    给你一个例子,这上面把我要讲的都讲完了:)呵呵。http://jiurl.nease.net/document/JiurlPlayWin2k/MmPfnDataBase.htm