分享

patch一个字节, WINXP32 支持>=4GB

 看见就非常 2012-07-23
作者: univert    时间: 2010-10-7 22:05:54     标题: patch一个字节, WINXP32 支持>=4GB

之前有人分析了Vista/win7 的memory limit http://www./viewer.htm?doc=notes/windows/license/memory.htm
现在来看看winxp啊,其实是一样的啊
反编译结果有一个private的函数(symbol里面没有)来进行check的,IDA Pro 里可以空过xref ExVerifySuite来定位这个匿名函数,函数的源代码在这里,不过那个好像是DataCenter的源代码,XP的源代码略有差异,不过大同小异
这个函数在MmInitSystem里面被调用,用来删除系统超过4Gb的那些页面

这里有两个限制值,一个是MaxPages也就是物理页面总数,一个是HighestPhysicalAddress是最高页面地址值
winxp32默认这两个值都是0x100000,也就是4G,但是由于部分物理页面的地址由于bios Memory remap而存在>4G的空间,HighestPhysicalAddress限制了这部分地址空间,所以有4Gb的机子只有大概3-3.25G的实际空间


INIT:005BB492 MiCheckPaeLicense proc near      
INIT:005BB492
INIT:005BB492 var_C           = dword ptr -0Ch
INIT:005BB492 HighestPhysicalAddress= dword ptr -8
INIT:005BB492 MaxPages        = dword ptr -4
INIT:005BB492
INIT:005BB492                 mov     edi, edi
INIT:005BB494                 push    ebp
INIT:005BB495                 mov     ebp, esp
INIT:005BB497                 sub     esp, 0Ch
INIT:005BB49A                 push    ebx
INIT:005BB49B                 push    esi
INIT:005BB49C                 push    edi
INIT:005BB49D                 mov     ebx, 100000h      默认是4GB
INIT:005BB4A2                 xor     edi, edi
INIT:005BB4A4                 push    7               ; SuiteType   检查是否DataCenter
INIT:005BB4A6                 mov     esi, eax
INIT:005BB4A8                 mov     [ebp+MaxPages], ebx
INIT:005BB4AB                 mov     [ebp+HighestPhysicalAddress], edi  HighestPhysicalAddress初始为0即没有限制,DataCenter下该值为零
INIT:005BB4AE                 call    _ExVerifySuite@4 ; ExVerifySuite(x)
INIT:005BB4B3                 cmp     al, 1                    改这里就可以啦 cmp al,0
INIT:005BB4B5                 jnz     short loc_5BB4D2
INIT:005BB4B7                 cmp     [esi+64h], edi       检查是否打开/3GB
INIT:005BB4BA                 jnz     short loc_5BB4C5
INIT:005BB4BC                 mov     [ebp+MaxPages], 1000000h   DataCenter是64GB
INIT:005BB4C3                 jmp     short loc_5BB509
INIT:005BB4C5 ; ---------------------------------------------------------------------------
INIT:005BB4C5
INIT:005BB4C5 loc_5BB4C5:                             ; CODE XREF: MiCheckPaeLicense+28j
INIT:005BB4C5                 mov     eax, 400000h
INIT:005BB4CA                 mov     [ebp+MaxPages], eax
INIT:005BB4CD                 mov     [ebp+HighestPhysicalAddress], eax
INIT:005BB4D0                 jmp     short loc_5BB509
INIT:005BB4D2 ; ---------------------------------------------------------------------------
INIT:005BB4D2
INIT:005BB4D2 loc_5BB4D2:                             ; CODE XREF: MiCheckPaeLicense+23j
INIT:005BB4D2                 cmp     ds:_MmProductType, 690057h
INIT:005BB4DC                 jz      short loc_5BB4F2
INIT:005BB4DE                 push    1               ; SuiteType
INIT:005BB4E0                 call    _ExVerifySuite@4 ; ExVerifySuite(x)
INIT:005BB4E5                 cmp     al, 1
INIT:005BB4E7                 jnz     short loc_5BB4F2
INIT:005BB4E9                 mov     [ebp+MaxPages], 800000h
INIT:005BB4F0                 jmp     short loc_5BB509
INIT:005BB4F2 ; ---------------------------------------------------------------------------
INIT:005BB4F2
INIT:005BB4F2 loc_5BB4F2:                             ; CODE XREF: MiCheckPaeLicense+4a
INIT:005BB4F2                                         ; MiCheckPaeLicense+55
INIT:005BB4F2                 push    0Ah             ; SuiteType
INIT:005BB4F4                 call    _ExVerifySuite@4 ; ExVerifySuite(x)
INIT:005BB4F9                 cmp     al, 1
INIT:005BB4FB                 jnz     short loc_5BB506
INIT:005BB4FD                 mov     [ebp+MaxPages], 80000h
INIT:005BB504                 jmp     short loc_5BB509
INIT:005BB506 ; ---------------------------------------------------------------------------
INIT:005BB506
INIT:005BB506 loc_5BB506:                             ; CODE XREF: MiCheckPaeLicense+69j
INIT:005BB506                 mov     [ebp+HighestPhysicalAddress], ebx  XP下0x100000
INIT:005BB509
INIT:005BB509 loc_5BB509:                             ; CODE XREF: MiCheckPaeLicense+31j
INIT:005BB509                                         ; MiCheckPaeLicense+3Ej ...
INIT:005BB509                 add     esi, 8
INIT:005BB50C                 mov     eax, [esi]
INIT:005BB50E                 xor     ebx, ebx
INIT:005BB510                 cmp     eax, esi
INIT:005BB512                 mov     [ebp+var_C], esi
INIT:005BB515                 jz      short loc_5BB583


[attach]3198[/attach]
作者: Mancity    时间: 2010-10-7 22:15:22

“支持>=4GB”的意思是等于4G还是大于等于4G?
作者: univert    时间: 2010-10-7 22:16:33

引用第1楼Mancity于2010-10-07 19:15发表的  :
“支持>=4GB”的意思是等于4G还是大于等于4G?
大于等于啊,我这里没有>4G的机器,所以没办法测试,不过应该是一样的啊,呵呵
作者: Mancity    时间: 2010-10-7 22:20:59

2^32=4 294 967 296 =4G
32位CPU的寻址极限能突破?
好像在《Windows驱动开发技术详解》看到过详细的解释,32位系统所能用的物理内存极限应该只能到4G
作者: univert    时间: 2010-10-7 22:23:52

引用第3楼Mancity于2010-10-07 19:20发表的  :
2^32=4 294 967 296 =4G
32位CPU的寻址极限能突破?

希望你先看看这里http://www./viewer.htm?doc=notes/windows/license/memory.htm了解一下背景,呵呵
作者: Mancity    时间: 2010-10-7 22:28:20

That 32-bit editions of Windows Vista are limited to 4GB is not because of any technical constraint on 32-bit operating systems. The 32-bit editions of Windows Vista all contain code for using physical memory above 4GB. Microsoft just doesn’t license you to use that code.
好奇怪。。
作者: killvxk    时间: 2010-10-7 22:47:55

确实可行~
作者: univert    时间: 2010-10-7 22:54:15

用Vmware 测试8GB,XPSP2效果
[attach]3199[/attach]
作者: achillis    时间: 2010-10-7 23:00:05

8GB,很威猛~~
作者: Mancity    时间: 2010-10-7 23:01:07

强大,这个时候CPU还是运行在x86吧
作者: univert    时间: 2010-10-7 23:12:50

引用第9楼Mancity于2010-10-07 20:01发表的  :
强大,这个时候CPU还是运行在x86吧
当然的啊,这个方法可以做多支持到64GB的物理地址
作者: Mancity    时间: 2010-10-8 01:31:01

http://baike.baidu.com/view/493711.htm
原来是这个,那书上都没提到PAE……
作者: Mancity    时间: 2010-10-8 01:36:50

不支持PAE的处理器这个方法应该无效。
作者: killvxk    时间: 2010-10-8 02:26:49

弄真机实验吧
作者: Mancity    时间: 2010-10-8 03:53:49

发现一个问题,单进程还是不能超过2GB,囧。。
作者: Mancity    时间: 2010-10-8 04:04:57

实机上测试还发现有好多驱动不能正常工作在启用了PAE的内核下
作者: jerrynpc    时间: 2010-10-8 11:36:49

windbg无法查到此函数?
作者: achillis    时间: 2010-10-8 15:21:17

引用第16楼jerrynpc于2010-10-08 08:36发表的  :
windbg无法查到此函数?


私有符号,Windbg是看不到的,按楼主说的方法找吧~
作者: rickywong    时间: 2010-10-10 12:45:51

实用性不大,和4M内存粒度一样,很多驱动都不支持
作者: perfectdark    时间: 2010-10-10 17:14:24

兼容性如何,以前我改过,但是蓝屏了,不知道是否是我改错了,
还是驱动不兼容
作者: perfectdark    时间: 2010-10-10 18:48:44

又改了一次,还是蓝屏了
作者: wg2001wg    时间: 2010-10-10 21:39:08

确定不是ps上的??
作者: univert    时间: 2010-10-11 16:43:27

可以用的啊,我的4G机子已经跑了3天了,没问题
有些驱动确实有问题,声明物理内存变量的时候没有用PHYSICAL_ADDRESS 宏,而是自己用int . long
如果该物理内存地址>4G的话就会出问题了,PHYSICAL_ADDRESS 其实是__int64
作者: youxyo    时间: 2010-10-13 02:03:48

用过。。偶尔蓝屏。。。偶尔启动不了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多