如何确定一个进程的地址空间的有效地址? 我需要确定一个进程的有效地址空间,现在已经排除了系统模块(也就是系统DLL)的地址,但是没法更加准确的判断那些commit的地址空间是有用的,请高手不吝赐教!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写驱动,或者通过安装callgate,进入ring0,dump进程的页表目录。检查每个表项的LSB位(Least Significant Bit)。 只有LSB位被置为1时,表项指向的页表才是有效的。 我指的是已经提交了的页面,有些提交的物理页面是已经用过的,但是已经没有有用的数据的页面.具体的来说一个进程大概有4g的空间除去保留的和内核用的大概2g,这2g的空间有的是保留有的是提交了的,提交的页面中就有已经用过的数据但是已经被用户舍弃打的. to codewarrior(会思考的草) 有没有简单一点的办法? The VirtualQueryEx function provides information about a range of pages within the virtual address space of a specified process. 唔……这样,原来你想得到dirty但是废弃的页……我想不写驱动是不可能的,这些结构是os 虚拟内存管理器非常重要的结构,windows不可能把这些东西放到用户地址空间去。你可以试试读取页帧数据库(Page Frame Database ,PFD),这是一个数组,每个元素24个byte,保存已经装入物理内存的页面信息。因为物理内存中的页面有6中可能属性,所有有6个变量分别指向,构成一个双向链表:MmStandbyPageListHeadMmModifiedNoWritePageListHeadMmModifiedPageListHeadMmFreePageListHeadMmBadPageListHeadMmZeroedPageListHead 表头定义: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; 其实写驱动只是为了进入特权级别,这些重要的数据结构都在内核地址空间内,从用户态是不能访问的。至于怎么写驱动……天那,太复杂了,你自己去找个把例子see see吧。 呵呵,其实也不是很难,和写DLL几乎一模一样。 给你一个例子,这上面把我要讲的都讲完了:)呵呵。http://jiurl.nease.net/document/JiurlPlayWin2k/MmPfnDataBase.htm 关于对话框的控件通告消息的响应? 如何监视网卡的状态(网线插拔等状态)~~来者有分,哈哈 vc开发过程中如何写开发文档? 哪里有VS 2003英文原版下载啊?急啊。 请问如何清空一个文本文档的内容? 关于在窗口中绘图的问题 请教大虾一个关于CSocket 问题 求救! 一个简单的问题 Auto CAD2010二次开发 怎么同时正确接收1000个TCP连接发来的数据!加急!来者有分! 有谁会这样使用zip的
有没有简单一点的办法?
我想不写驱动是不可能的,这些结构是os 虚拟内存管理器非常重要的结构,windows不可能把这些东西放到用户地址空间去。你可以试试读取页帧数据库(Page Frame Database ,PFD),这是一个数组,每个元素24个byte,保存已经装入物理内存的页面信息。因为物理内存中的页面有6中可能属性,所有有6个变量分别指向,构成一个双向链表:
MmStandbyPageListHead
MmModifiedNoWritePageListHead
MmModifiedPageListHead
MmFreePageListHead
MmBadPageListHead
MmZeroedPageListHead
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;
至于怎么写驱动……天那,太复杂了,你自己去找个把例子see see吧。