|
发表于 2005-3-9 18:28:02
|
显示全部楼层
找到点很有用的.还没有试过.
转:希望对你有用
发信人: huyuguang (不再困惑), 信区: SysInternals WWW-POST
标 题: nt平台下,应用层上读写物理内存1
发信站: 武汉白云黄鹤站 (Mon Aug 7 09:56:09 2000) , 站内信件
一般来说,操作物理内存必须在核心态,如果要操作物理内存,必须写一个sys。
关于如何在核态下读写物理内存,到处都是sample,我就不废话了。
在这里,我们简单的回顾一下在nt的核心态下操作物理内存的方法,不管是
在核心态还是在用户态,都只能操作线性地址,要操作物理地址,首先必须
转化成线性地址,然后才能访问之。对于这个原理,请大家看看保护模式的
内存原理。之所以在应用层上难以访问物理地址,原因就在于1该物理地址没有
对应的选择子,2无法建立一个线性地址与其对应。
95下有一个mapphytoliner,linux下有vmap,这些系统调用得工作都是为这个物理
地址建立一个选择子,也即用一个线性地址与其对应。
但是关键是mapphytoliner(9x),mapviewofsection(nt)什么
的都要在核心态才能调用,所以我们才必须写一个sys,vxd什么的。
但是让我们欣喜的是,这几个系统服务虽然都是要在核心态才能调用,
但是用户态有这些服务相对应的函数,我们可以在用户态调用这些函数,
达到我们的目的。
不要在msdn里找,这个里面是没有的,这几个函数都是native api,说起到
nt平台下的api,一般人都立即想到了win32api,但是nt号称多头蛇操作系统,
除了支持win32,还有posix,os/2。这些api在进行系统调用的时候,多半要
都要和native api打交道,这个native api就是ntdll.dll输出的函数。native api
很有用,他不依赖于任何环境子系统。ms的这些函数都是不公开的,不过在
ddk里有很多系统服务和他对应,象ntcreatefile就和zwcreatefile对应。
在应用程序中如何使用ntdll.dll里输出的函数呢?现在我们用着vc6,
幸福的使用着动态连接库,很多人除了在settings->link->xx.lib之外,什么都不
会,不过这也不能怪他们,他们的时候一切都很方便了。但是我们现在找一本
讲述dll的书,一般都有动态加载得方法,我相信任何一本讲dll的书都会
讲这个方法,不过由于太不方便,我们很少去注意罢了。
为了使不知道得弟兄们不用回去再翻书,我在这简单的描述一下。
先定义一个指向函数的指针ntunmapviewofsection,然后...
if( !(NtUnmapViewOfSection = (void *) GetProcAddress( GetModuleHandle("ntdll.dll"),
"NtUnmapViewOfSection" )) ) {
return FALSE;
于是乎,这个指针就真的指向了那个函数的入口,于是我们就可以调用了。
要访问物理内存,必须输出这么几个函数:
RtlInitUnicodeString
NtUnmapViewOfSection
NtOpenSection
NtMapViewOfSection
RtlNtStatusToDosError
函数不多,而且在sys里访问过物理内存的弟兄们肯定会觉得眼熟,是的
这些native api和那些系统服务几乎是一样的,不同的是这些可以在用户
态调用。
下面的工作就和在核心态里访问物理内存一样了,前面我已经说过
这方面的例子到处都是,我就不多废话了。
附注:由于scz要我自暴其丑,本来我是无论如何也不答应的,
但是昨天我欠了scz一个情,只好回去翻了翻,发现了一个很早
做的一个东西,就贴上来了。
详细参看 :http://search.csdn.net/Expert/topic/511/511971.xml?temp=.1751215 不知道没注册用户能进去不. http://www.msdn.net/ |
|