如何确定一个进程的地址空间的有效地址?

ljseven 2004-06-17 10:26:02
我需要确定一个进程的有效地址空间,现在已经排除了系统模块(也就是系统DLL)的地址,但是没法更加准确的判断那些commit的地址空间是有用的,请高手不吝赐教!!!!
...全文
145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljseven 2004-06-17
  • 打赏
  • 举报
回复
有没有知道的啊,我急急急啊
ljseven 2004-06-17
  • 打赏
  • 举报
回复
谢谢,关于驱动我还要看看资料,结贴了
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
给你一个例子,这上面把我要讲的都讲完了:)呵呵。http://jiurl.nease.net/document/JiurlPlayWin2k/MmPfnDataBase.htm
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
呵呵,其实也不是很难,和写DLL几乎一模一样。
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
其实写驱动只是为了进入特权级别,这些重要的数据结构都在内核地址空间内,从用户态是不能访问的。
至于怎么写驱动……天那,太复杂了,你自己去找个把例子see see吧。
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
表头定义:
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;
ljseven 2004-06-17
  • 打赏
  • 举报
回复
有没有例子,我没有作过驱动,不知道如何下手
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
唔……这样,原来你想得到dirty但是废弃的页……
我想不写驱动是不可能的,这些结构是os 虚拟内存管理器非常重要的结构,windows不可能把这些东西放到用户地址空间去。

你可以试试读取页帧数据库(Page Frame Database ,PFD),这是一个数组,每个元素24个byte,保存已经装入物理内存的页面信息。因为物理内存中的页面有6中可能属性,所有有6个变量分别指向,构成一个双向链表:
MmStandbyPageListHead
MmModifiedNoWritePageListHead
MmModifiedPageListHead
MmFreePageListHead
MmBadPageListHead
MmZeroedPageListHead
ljseven 2004-06-17
  • 打赏
  • 举报
回复
在确定进程空间的时候我就用了他,关键的是这些提交的内存页有些是系统已经废弃的,我怎么样确定它
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
The VirtualQueryEx function provides information about a range of pages within the virtual address space of a specified process.
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
试试VitualQueryEx
薛定谔之死猫 2004-06-17
  • 打赏
  • 举报
回复
学习一下先
ljseven 2004-06-17
  • 打赏
  • 举报
回复
to codewarrior(会思考的草)
有没有简单一点的办法?
ljseven 2004-06-17
  • 打赏
  • 举报
回复
我指的是已经提交了的页面,有些提交的物理页面是已经用过的,但是已经没有有用的数据的页面.具体的来说一个进程大概有4g的空间除去保留的和内核用的大概2g,这2g的空间有的是保留有的是提交了的,提交的页面中就有已经用过的数据但是已经被用户舍弃打的.
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
不过还是不清楚你说的“有用的”是什么意思?指已经装入物理内存的页吗?
会思考的草 2004-06-17
  • 打赏
  • 举报
回复
写驱动,或者通过安装callgate,进入ring0,dump进程的页表目录。检查每个表项的LSB位(Least Significant Bit)。 只有LSB位被置为1时,表项指向的页表才是有效的。
ljseven 2004-06-17
  • 打赏
  • 举报
回复
拜托了,各位,99我吧

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧