WIN32一共有4GB的虚存空间,其中用户进程占有2GB。从每个进程自己的角度来看,它都是独占2GB的,正是因为这个原因,每个进程都要单独加载自己的DLL,而在Win3.1下各个进程师共享DLL的。 WinNT 下用户拥有2GB的专用地址,操作系统占用2GB空间分配如下。在用户的2GB空间中,在开始有64KB和结束有2个64KB用于昨为内存的分界区域,是不能访问的,如你访问0的地址是非法的,就是这个原因。这样呢只能访问2GB减去192KB的空间,从0x10000到0x7FFEFFFF的范围。这也就是你的每个进程的能访问的开始和结束地址。 Windows 95/98下,给每个进程分配2GB的专用地址,把剩余的2GB分为系统空间(1GB)和用于所有的共享内存区域的单个共享空间(1GB);这1GB的共享区域对于用户态是可写的,任何进程都可以写道共享内存区域或者映射文件。所以不安全;而WINNT在这点上是不一样的,他将共享内存放在装用的进程地址空间,避免了这个问题。因为没有95/98没有提供分解区域,所以访问的区域就是从000000000到7FFFFFFF的范围,也就是你要求的开始和结束地址。象FPE等游戏修改工具就是利用了这个原理
在MSDN查看索引MAPI
你要是你的CDocument支持ole的话,你的数据也可以让别人随便改。
至于在别人的窗口中加按钮,当然需要PLUG_IN。
1.用Process32First和Process32Next可以玫举所有的进程(Window95/98实现了,WINNT4.0以及一下没有实现,Win2000实现了,如果是用NT4的话,就比较麻烦了,要用Performanance Data,太麻烦了,不说了。)
2.用VirtualQueryEx可以得到一个进程的内存的信息,如开始地址等(95/98/NT4/2000都实现了,就NT3.5没实现,要自己写,很麻烦的,不说了。)
3.然后用ReadProcessMemory和WriteProcessMemory就可以实现对某一进程内存的修改,这两个函数95/98/NT4/2000都实现了,读和写的方式是通过ReadPorcessMemory将内存块读到本进程中,就是在本进程上的一个拷贝,然后对这个拷贝执行各种操作,反正是在本进程中地一个拷贝(本进程中的一片内存),随你怎么操作啦,再将内存块用WriteProcessMemory写回去,就实现了对该内存数据的修改,象金山游侠、FPE那样的操作实际都是先对在本进程中的拷贝进行操作,然后将拷贝写回去。
research.microsoft.com/sn/detours